HRESULT WpdObjectProperties::GetPropertyValuesForObject()

in wpd/WpdMultiTransportDriver/WpdObjectProperties.cpp [782:1283]


HRESULT WpdObjectProperties::GetPropertyValuesForObject(
    _In_ LPCWSTR                        wszObjectID,
    _In_ IPortableDeviceKeyCollection*  pKeys,
    _In_ IPortableDeviceValues*         pValues)
{
    HRESULT     hr          = S_OK;
    CAtlStringW strObjectID = wszObjectID;
    DWORD       cKeys       = 0;

    if ((wszObjectID == NULL) ||
        (pKeys       == NULL) ||
        (pValues     == NULL))
    {
        hr = E_INVALIDARG;
        return hr;
    }

    hr = pKeys->GetCount(&cKeys);
    CHECK_HR(hr, "Failed to number of PROPERTYKEYs in collection");

    if (hr == S_OK)
    {
        // Get values for the DEVICE object
        if (strObjectID.CompareNoCase(WPD_DEVICE_OBJECT_ID) == 0)
        {
            for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
            {
                PROPERTYKEY Key = WPD_PROPERTY_NULL;
                hr = pKeys->GetAt(dwIndex, &Key);
                CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);

                if (hr == S_OK)
                {
                    // Preset the property value to 'error not supported'.  The actual value
                    // will replace this value, if read from the device.
                    pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));

                    // Set DEVICE object properties
                    if (IsEqualPropertyKey(Key, WPD_DEVICE_FIRMWARE_VERSION))
                    {
                        hr = pValues->SetStringValue(WPD_DEVICE_FIRMWARE_VERSION, DEVICE_FIRMWARE_VERSION_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_DEVICE_FIRMWARE_VERSION");
                    }

                    if (IsEqualPropertyKey(Key, WPD_DEVICE_POWER_LEVEL))
                    {
                        hr = pValues->SetUnsignedIntegerValue(WPD_DEVICE_POWER_LEVEL, DEVICE_POWER_LEVEL_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_DEVICE_POWER_LEVEL");
                    }

                    if (IsEqualPropertyKey(Key, WPD_DEVICE_POWER_SOURCE))
                    {
                        hr = pValues->SetUnsignedIntegerValue(WPD_DEVICE_POWER_SOURCE, WPD_POWER_SOURCE_EXTERNAL);
                        CHECK_HR(hr, "Failed to set WPD_DEVICE_POWER_SOURCE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_DEVICE_PROTOCOL))
                    {
                        hr = pValues->SetStringValue(WPD_DEVICE_PROTOCOL, DEVICE_PROTOCOL_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_DEVICE_PROTOCOL");
                    }

                    if (IsEqualPropertyKey(Key, WPD_DEVICE_MODEL))
                    {
                        hr = pValues->SetStringValue(WPD_DEVICE_MODEL, DEVICE_MODEL_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_DEVICE_MODEL");
                    }

                    if (IsEqualPropertyKey(Key, WPD_DEVICE_SERIAL_NUMBER))
                    {
                        hr = pValues->SetStringValue(WPD_DEVICE_SERIAL_NUMBER, DEVICE_SERIAL_NUMBER_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_DEVICE_SERIAL_NUMBER");
                    }

                    if (IsEqualPropertyKey(Key, WPD_DEVICE_SUPPORTS_NON_CONSUMABLE))
                    {
                        hr = pValues->SetBoolValue(WPD_DEVICE_SUPPORTS_NON_CONSUMABLE, DEVICE_SUPPORTS_NONCONSUMABLE_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_DEVICE_SUPPORTS_NON_CONSUMABLE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_DEVICE_MANUFACTURER))
                    {
                        hr = pValues->SetStringValue(WPD_DEVICE_MANUFACTURER, DEVICE_MANUFACTURER_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_DEVICE_MANUFACTURER");
                    }

                    if (IsEqualPropertyKey(Key, WPD_DEVICE_FRIENDLY_NAME))
                    {
                        hr = pValues->SetStringValue(WPD_DEVICE_FRIENDLY_NAME, DEVICE_FRIENDLY_NAME_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_DEVICE_FRIENDLY_NAME");
                    }

                    if (IsEqualPropertyKey(Key, WPD_DEVICE_TYPE))
                    {
                        hr = pValues->SetUnsignedIntegerValue(WPD_DEVICE_TYPE, WPD_DEVICE_TYPE_GENERIC);
                        CHECK_HR(hr, "Failed to set WPD_DEVICE_TYPE");
                    }

                    // Set general properties for DEVICE
                    if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_ID, WPD_DEVICE_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_NAME, WPD_DEVICE_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, WPD_DEVICE_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, L"");
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
                    {
                        hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_UNSPECIFIED);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
                    {
                        hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
                    {
                        hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_FUNCTIONAL_OBJECT_CATEGORY))
                    {
                        hr = pValues->SetGuidValue(WPD_FUNCTIONAL_OBJECT_CATEGORY, WPD_FUNCTIONAL_CATEGORY_DEVICE);
                        CHECK_HR(hr, "Failed to set WPD_FUNCTIONAL_OBJECT_CATEGORY");
                    }
                }
            }
        }
        else if (strObjectID.CompareNoCase(STORAGE_OBJECT_ID) == 0)
        {
            for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
            {
                PROPERTYKEY Key = WPD_PROPERTY_NULL;
                hr = pKeys->GetAt(dwIndex, &Key);
                CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);

                if (hr == S_OK)
                {
                    // Preset the property value to 'error not supported'.  The actual value
                    // will replace this value, if read from the device.
                    pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));

                    // Set storage object properties
                    if (IsEqualPropertyKey(Key, WPD_STORAGE_SERIAL_NUMBER))
                    {
                        hr = pValues->SetStringValue(WPD_STORAGE_SERIAL_NUMBER, STORAGE_SERIAL_NUMBER_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_STORAGE_SERIAL_NUMBER");
                    }

                    if (IsEqualPropertyKey(Key, WPD_STORAGE_FREE_SPACE_IN_BYTES))
                    {
                        hr = pValues->SetUnsignedLargeIntegerValue(WPD_STORAGE_FREE_SPACE_IN_BYTES, (STORAGE_FREE_SPACE_IN_BYTES_VALUE - GetObjectSize(README_FILE_OBJECT_ID)));
                        CHECK_HR(hr, "Failed to set WPD_STORAGE_FREE_SPACE_IN_BYTES");
                    }

                    if (IsEqualPropertyKey(Key, WPD_STORAGE_CAPACITY))
                    {
                        hr = pValues->SetUnsignedLargeIntegerValue(WPD_STORAGE_CAPACITY, STORAGE_CAPACITY_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_STORAGE_CAPACITY");
                    }

                    if (IsEqualPropertyKey(Key, WPD_STORAGE_TYPE))
                    {
                        hr = pValues->SetUnsignedIntegerValue(WPD_STORAGE_TYPE, WPD_STORAGE_TYPE_FIXED_ROM);
                        CHECK_HR(hr, "Failed to set WPD_STORAGE_TYPE");
                    }

                    // Set general properties for storage
                    if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_ID, STORAGE_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_NAME, STORAGE_OBJECT_NAME_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, STORAGE_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, WPD_DEVICE_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
                    {
                        hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_UNSPECIFIED);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
                    {
                        hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
                    {
                        hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_FUNCTIONAL_OBJECT_CATEGORY))
                    {
                        hr = pValues->SetGuidValue(WPD_FUNCTIONAL_OBJECT_CATEGORY, WPD_FUNCTIONAL_CATEGORY_STORAGE);
                        CHECK_HR(hr, "Failed to set WPD_FUNCTIONAL_OBJECT_CATEGORY");
                    }

                    if (IsEqualPropertyKey(Key, WPD_STORAGE_FILE_SYSTEM_TYPE))
                    {
                        hr = pValues->SetStringValue(WPD_STORAGE_FILE_SYSTEM_TYPE, STORAGE_FILE_SYSTEM_TYPE_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_STORAGE_FILE_SYSTEM_TYPE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_STORAGE_DESCRIPTION))
                    {
                        hr = pValues->SetStringValue(WPD_STORAGE_DESCRIPTION, STORAGE_DESCRIPTION_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_STORAGE_DESCRIPTION");
                    }
                }
            }
        }
        else if (strObjectID.CompareNoCase(DOCUMENTS_FOLDER_OBJECT_ID) == 0)
        {
            for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
            {
                PROPERTYKEY Key = WPD_PROPERTY_NULL;
                hr = pKeys->GetAt(dwIndex, &Key);
                CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);

                if (hr == S_OK)
                {
                    // Preset the property value to 'error not supported'.  The actual value
                    // will replace this value, if read from the device.
                    pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));

                    // Set general properties for the folder object
                    if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_ID, DOCUMENTS_FOLDER_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, DOCUMENTS_FOLDER_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, STORAGE_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_NAME, DOCUMENTS_FOLDER_OBJECT_NAME_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_ORIGINAL_FILE_NAME))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, DOCUMENTS_FOLDER_OBJECT_ORIGINAL_FILE_NAME_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_ORIGINAL_FILE_NAME");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
                    {
                        hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_UNSPECIFIED);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
                    {
                        hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, WPD_CONTENT_TYPE_FOLDER);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
                    {
                        hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_MODIFIED))
                    {
                        PROPVARIANT pvDateModified = {0};
                        SYSTEMTIME  systemtime     = {0};

                        systemtime.wMonth = 6;
                        systemtime.wDay   = 26;
                        systemtime.wYear  = 2006;
                        systemtime.wHour  = 5;

                        // Initialize the Date Modified PROPVARIANT value
                        PropVariantInit(&pvDateModified);

                        pvDateModified.vt = VT_DATE;
                        if (SystemTimeToVariantTime(&systemtime, &pvDateModified.date) == TRUE)
                        {
                            hr = pValues->SetValue(WPD_OBJECT_DATE_MODIFIED, &pvDateModified);
                            CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_MODIFIED");
                        }
                        else
                        {
                            LONG lError = GetLastError();
                            hr = HRESULT_FROM_WIN32(lError);
                        }

                        PropVariantClear(&pvDateModified);
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_CREATED))
                    {
                        PROPVARIANT pvDateCreated = {0};
                        SYSTEMTIME  systemtime    = {0};

                        systemtime.wMonth = 1;
                        systemtime.wDay   = 24;
                        systemtime.wYear  = 2006;
                        systemtime.wHour  = 12;

                        // Initialize the Date Created PROPVARIANT value
                        PropVariantInit(&pvDateCreated);

                        pvDateCreated.vt = VT_DATE;
                        if (SystemTimeToVariantTime(&systemtime, &pvDateCreated.date) == TRUE)
                        {
                            hr = pValues->SetValue(WPD_OBJECT_DATE_CREATED, &pvDateCreated);
                            CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_CREATED");
                        }
                        else
                        {
                            LONG lError = GetLastError();
                            hr = HRESULT_FROM_WIN32(lError);
                        }

                        PropVariantClear(&pvDateCreated);
                    }
                }
            }
        }
        else if (strObjectID.CompareNoCase(README_FILE_OBJECT_ID) == 0)
        {
            for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
            {
                PROPERTYKEY Key = WPD_PROPERTY_NULL;
                hr = pKeys->GetAt(dwIndex, &Key);
                CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);

                if (hr == S_OK)
                {
                    // Preset the property value to 'error not supported'.  The actual value
                    // will replace this value, if read from the device.
                    pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_ID, README_FILE_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, README_FILE_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, DOCUMENTS_FOLDER_OBJECT_ID);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_NAME, README_FILE_OBJECT_NAME_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_ORIGINAL_FILE_NAME))
                    {
                        hr = pValues->SetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, README_FILE_OBJECT_ORIGINAL_FILE_NAME_VALUE);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_ORIGINAL_FILE_NAME");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
                    {
                        hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, GetObjectFormat(strObjectID));
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
                    {
                        hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, GetObjectContentType(strObjectID));
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
                    {
                        hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_SIZE))
                    {
                        hr = pValues->SetUnsignedLargeIntegerValue(WPD_OBJECT_SIZE, GetObjectSize(strObjectID));
                        CHECK_HR(hr, "Failed to set WPD_OBJECT_SIZE");
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_MODIFIED))
                    {
                        PROPVARIANT pvDateModified = {0};
                        SYSTEMTIME  systemtime     = {0};

                        systemtime.wMonth = 6;
                        systemtime.wDay   = 26;
                        systemtime.wYear  = 2006;
                        systemtime.wHour  = 5;

                        // Initialize the Date Modified PROPVARIANT value
                        PropVariantInit(&pvDateModified);

                        pvDateModified.vt = VT_DATE;
                        if (SystemTimeToVariantTime(&systemtime, &pvDateModified.date) == TRUE)
                        {
                            hr = pValues->SetValue(WPD_OBJECT_DATE_MODIFIED, &pvDateModified);
                            CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_MODIFIED");
                        }
                        else
                        {
                            LONG lError = GetLastError();
                            hr = HRESULT_FROM_WIN32(lError);
                        }

                        PropVariantClear(&pvDateModified);
                    }

                    if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_CREATED))
                    {
                        PROPVARIANT pvDateCreated = {0};
                        SYSTEMTIME  systemtime    = {0};

                        systemtime.wMonth = 1;
                        systemtime.wDay   = 24;
                        systemtime.wYear  = 2006;
                        systemtime.wHour  = 12;

                        // Initialize the Date Created PROPVARIANT value
                        PropVariantInit(&pvDateCreated);

                        pvDateCreated.vt = VT_DATE;
                        if (SystemTimeToVariantTime(&systemtime, &pvDateCreated.date) == TRUE)
                        {
                            hr = pValues->SetValue(WPD_OBJECT_DATE_CREATED, &pvDateCreated);
                            CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_CREATED");
                        }
                        else
                        {
                            LONG lError = GetLastError();
                            hr = HRESULT_FROM_WIN32(lError);
                        }

                        PropVariantClear(&pvDateCreated);
                    }
                }
            }
        }
    }

    return hr;
}