diff options
| author | Dave Wilson <[email protected]> | 2015-03-17 19:50:07 -0700 |
|---|---|---|
| committer | Dave Wilson <[email protected]> | 2015-03-17 19:50:07 -0700 |
| commit | 97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch) | |
| tree | 46f3701832d70b420eb0fc0eb93261f9da45db3f /wpd/WpdWudfSampleDriver/helpers.cpp | |
| parent | ef1905bf1e8825bb31120dfb27e0daf3154d859a (diff) | |
Initial publish
Diffstat (limited to 'wpd/WpdWudfSampleDriver/helpers.cpp')
| -rw-r--r-- | wpd/WpdWudfSampleDriver/helpers.cpp | 1600 |
1 files changed, 1600 insertions, 0 deletions
diff --git a/wpd/WpdWudfSampleDriver/helpers.cpp b/wpd/WpdWudfSampleDriver/helpers.cpp new file mode 100644 index 00000000..497ae61c --- /dev/null +++ b/wpd/WpdWudfSampleDriver/helpers.cpp @@ -0,0 +1,1600 @@ +#include "stdafx.h" +#include "helpers.tmh" + +// Define the value for the registered WAVE format this driver uses +#ifndef WAVE_FORMAT_MSAUDIO3 + #define WAVE_FORMAT_MSAUDIO3 0x0162 +#endif + +#define VCARD_FORMAT "BEGIN:VCARD\r\nVERSION:2.1\r\nN:%ws;%ws\r\nFN:%ws\r\nORG:%ws\r\nTITLE:%ws\r\nTEL;HOME;VOICE:%ws\r\nTEL;WORK;VOICE:%ws\r\nTEL;CELL;VOICE:%ws\r\nTEL;WORK;FAX:%ws\r\nADR;HOME;ENCODING=QUOTED-PRINTABLE:;;%ws=0D=0A%ws;%ws;,;%ws;;REV:20051206T185151Z\r\nEND:VCARD\r\n" + +const PROPERTYKEY* g_SupportedPropertiesForFormatAll[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_OBJECT_NON_CONSUMABLE, +}; + +const PROPERTYKEY* g_SupportedPropertiesForFakeContentFormat[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_FOLDER_CONTENT_TYPES_ALLOWED, + &WPD_OBJECT_ORIGINAL_FILE_NAME, + &WPD_OBJECT_NON_CONSUMABLE, +}; + +const PROPERTYKEY* g_SupportedPropertiesForFakeDeviceContentFormat[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_DEVICE_SUPPORTS_NON_CONSUMABLE, + &WPD_OBJECT_NON_CONSUMABLE, + &WPD_FUNCTIONAL_OBJECT_CATEGORY, + &WPD_DEVICE_FIRMWARE_VERSION, + &WPD_DEVICE_POWER_LEVEL, + &WPD_DEVICE_POWER_SOURCE, + &WPD_DEVICE_PROTOCOL, + &WPD_DEVICE_MODEL, + &WPD_DEVICE_SERIAL_NUMBER, + &WPD_DEVICE_MANUFACTURER, + &WPD_DEVICE_TYPE, + &WPD_DEVICE_FRIENDLY_NAME, +}; + +const PROPERTYKEY* g_SupportedPropertiesForFakeStorageContentFormat[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_FOLDER_CONTENT_TYPES_ALLOWED, + &WPD_OBJECT_NON_CONSUMABLE, + &WPD_STORAGE_CAPACITY, + &WPD_STORAGE_FREE_SPACE_IN_BYTES, + &WPD_FUNCTIONAL_OBJECT_CATEGORY, + &WPD_STORAGE_TYPE, +}; + +const PROPERTYKEY* g_SupportedPropertiesForFakeImageContentFormat[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_OBJECT_NON_CONSUMABLE, + &WPD_MEDIA_HEIGHT, + &WPD_MEDIA_WIDTH, + &WPD_OBJECT_DATE_CREATED, + &WPD_OBJECT_ORIGINAL_FILE_NAME, + &WPD_OBJECT_SIZE, +}; + +const PROPERTYKEY* g_SupportedPropertiesForFakeMusicContentFormat[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_OBJECT_NON_CONSUMABLE, + &WPD_MEDIA_TITLE, + &WPD_MEDIA_ARTIST, + &WPD_MEDIA_DURATION, + &WPD_OBJECT_SIZE, + &WPD_OBJECT_DATE_AUTHORED, + &WPD_OBJECT_DATE_MODIFIED, + &WPD_MUSIC_ALBUM, + &WPD_MEDIA_GENRE, + &WPD_MUSIC_TRACK, + &WPD_OBJECT_ORIGINAL_FILE_NAME, +}; + +const PROPERTYKEY* g_SupportedPropertiesForFakeVideoContentFormat[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_OBJECT_NON_CONSUMABLE, + &WPD_MEDIA_TITLE, + &WPD_MEDIA_DURATION, + &WPD_OBJECT_SIZE, + &WPD_MEDIA_HEIGHT, + &WPD_MEDIA_WIDTH, + &WPD_OBJECT_DATE_AUTHORED, + &WPD_OBJECT_DATE_MODIFIED, + &WPD_OBJECT_ORIGINAL_FILE_NAME, + &WPD_VIDEO_SCAN_TYPE, + &WPD_VIDEO_BITRATE, + &WPD_VIDEO_FOURCC_CODE, + &WPD_OBJECT_GENERATE_THUMBNAIL_FROM_RESOURCE, +}; + +const PROPERTYKEY* g_SupportedPropertiesForFakeContactContentFormat[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_OBJECT_NON_CONSUMABLE, + &WPD_CONTACT_DISPLAY_NAME, + &WPD_CONTACT_PRIMARY_PHONE, + &WPD_CONTACT_MOBILE_PHONE, + &WPD_CONTACT_BUSINESS_PHONE, + &WPD_OBJECT_ORIGINAL_FILE_NAME, + &WPD_OBJECT_SIZE, +}; + +const PROPERTYKEY* g_SupportedPropertiesForRenderingInformation[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_OBJECT_NON_CONSUMABLE, + &WPD_FUNCTIONAL_OBJECT_CATEGORY, + &WPD_RENDERING_INFORMATION_PROFILES, +}; + +const PROPERTYKEY* g_SupportedPropertiesForNetworkConfiguration[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_FOLDER_CONTENT_TYPES_ALLOWED, + &WPD_OBJECT_NON_CONSUMABLE, + &WPD_FUNCTIONAL_OBJECT_CATEGORY, +}; + +const PROPERTYKEY* g_SupportedPropertiesForNetworkAssociation[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_OBJECT_NON_CONSUMABLE, + &WPD_NETWORK_ASSOCIATION_HOST_NETWORK_IDENTIFIERS, +}; + + +const PROPERTYKEY* g_SupportedPropertiesForMicrosoftWFC[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_OBJECT_NON_CONSUMABLE, +}; + +const PROPERTYKEY* g_SupportedPropertiesForFakeMemoContentFormat[] = +{ + &WPD_OBJECT_ID, + &WPD_OBJECT_PERSISTENT_UNIQUE_ID, + &WPD_OBJECT_PARENT_ID, + &WPD_OBJECT_NAME, + &WPD_OBJECT_CONTENT_TYPE, + &WPD_OBJECT_FORMAT, + &WPD_OBJECT_CAN_DELETE, + &WPD_OBJECT_ISHIDDEN, + &WPD_OBJECT_ISSYSTEM, + &WPD_OBJECT_NON_CONSUMABLE, + &WPD_OBJECT_SIZE, + &WPD_OBJECT_DATE_AUTHORED, + &WPD_OBJECT_DATE_MODIFIED, + &WPD_OBJECT_ORIGINAL_FILE_NAME, +}; + +KeyAndAttributesEntry g_FixedAttributesTable[] = +{ + // Properties for all objects, regardless of format + {&WPD_OBJECT_FORMAT_ALL, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_ALL, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_ALL, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_ALL, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_ALL, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_ALL, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_ALL, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_ALL, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_ALL, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + // Properties for generic objects + {&FakeContent_Format, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_FOLDER_CONTENT_TYPES_ALLOWED, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeContent_Format, &WPD_OBJECT_ORIGINAL_FILE_NAME, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + // Properties for the device object + {&FakeDeviceContent_Format, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_SUPPORTS_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_FUNCTIONAL_OBJECT_CATEGORY, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_FIRMWARE_VERSION, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_POWER_LEVEL, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_POWER_SOURCE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_PROTOCOL, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_MODEL, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_SERIAL_NUMBER, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_MANUFACTURER, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_NETWORK_IDENTIFIER, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_FRIENDLY_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&FakeDeviceContent_Format, &WPD_DEVICE_SYNC_PARTNER, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + // Properties for storage objects + {&FakeStorageContent_Format, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_FOLDER_CONTENT_TYPES_ALLOWED, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_DEVICE_SUPPORTS_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_STORAGE_CAPACITY, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_STORAGE_FREE_SPACE_IN_BYTES, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_FUNCTIONAL_OBJECT_CATEGORY, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeStorageContent_Format, &WPD_STORAGE_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + // Properties for Image objects + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_MEDIA_HEIGHT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_MEDIA_WIDTH, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_DATE_CREATED, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_ORIGINAL_FILE_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_EXIF, &WPD_OBJECT_SIZE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + // Properties for Music objects + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_MEDIA_TITLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_MEDIA_ARTIST, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_MEDIA_DURATION, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_SIZE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_DATE_AUTHORED, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_DATE_MODIFIED, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_MUSIC_ALBUM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_MEDIA_GENRE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_MUSIC_TRACK, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMA, &WPD_OBJECT_ORIGINAL_FILE_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + // Properties for video objects + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_MEDIA_TITLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_MEDIA_DURATION, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_SIZE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_MEDIA_HEIGHT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_MEDIA_WIDTH, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_DATE_AUTHORED, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_DATE_MODIFIED, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_ORIGINAL_FILE_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_VIDEO_SCAN_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_VIDEO_BITRATE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_VIDEO_FOURCC_CODE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_WMV, &WPD_OBJECT_GENERATE_THUMBNAIL_FROM_RESOURCE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + // Properties for contact objects + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_CONTACT_DISPLAY_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_CONTACT_PRIMARY_PHONE, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_CONTACT_MOBILE_PHONE, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_CONTACT_BUSINESS_PHONE, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_ORIGINAL_FILE_NAME, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_VCARD2, &WPD_OBJECT_SIZE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + // Properties for Rendering Information object + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_FUNCTIONAL_OBJECT_CATEGORY, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION, &WPD_RENDERING_INFORMATION_PROFILES, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + // Properties for Network Configuration object + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_FOLDER_CONTENT_TYPES_ALLOWED, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION, &WPD_FUNCTIONAL_OBJECT_CATEGORY, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + // Properties for Network Association object + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION, &WPD_NETWORK_ASSOCIATION_HOST_NETWORK_IDENTIFIERS, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + // Properties for Microsoft WFC object + {&WPD_OBJECT_FORMAT_MICROSOFT_WFC, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_MICROSOFT_WFC, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_MICROSOFT_WFC, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_MICROSOFT_WFC, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_MICROSOFT_WFC, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_MICROSOFT_WFC, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_MICROSOFT_WFC, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_MICROSOFT_WFC, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_MICROSOFT_WFC, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&WPD_OBJECT_FORMAT_MICROSOFT_WFC, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + // Properties for Memo object + {&FakeMemoContent_Format, &WPD_OBJECT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_PERSISTENT_UNIQUE_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_PARENT_ID, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_FORMAT, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_CONTENT_TYPE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_CAN_DELETE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_ISHIDDEN, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_ISSYSTEM, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_NON_CONSUMABLE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_SIZE, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_DATE_AUTHORED, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_DATE_MODIFIED, UnspecifiedForm_CanRead_CannotWrite_CannotDelete_Fast}, + {&FakeMemoContent_Format, &WPD_OBJECT_ORIGINAL_FILE_NAME, UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast}, +}; + +HRESULT AddPropertyKeyArrayToCollection( + _In_reads_(cKeys) const PROPERTYKEY** ppKeys, + const DWORD cKeys, + _In_ IPortableDeviceKeyCollection* pCollection) +{ + + HRESULT hr = S_OK; + + if (hr == S_OK) + { + // Add the keys + for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++) + { + hr = pCollection->Add(*ppKeys[dwIndex]); + CHECK_HR(hr, "Failed to add key at index %d", dwIndex); + if (FAILED(hr)) + { + break; + } + } + } + + return hr; +} + +HRESULT AddFixedAttributesByType( + FakeDevicePropertyAttributesType AttributesType, + _In_ IPortableDeviceValues* pAttributes) +{ + + HRESULT hr = S_OK; + + if(pAttributes == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, ("Cannot have NULL parameter")); + return hr; + } + + // Initialize our default values for the static attributes + DWORD dwForm = WPD_PROPERTY_ATTRIBUTE_FORM_UNSPECIFIED; + BOOL bCanRead = TRUE; + BOOL bCanWrite = FALSE; + BOOL bCanDelete = FALSE; + BOOL bFastProperty = TRUE; + + // Adjust the attributes for the specific property type if needed + if(AttributesType == UnspecifiedForm_CanRead_CanWrite_CannotDelete_Fast) + { + bCanWrite = TRUE; + } + + // Add the static attributes for this property. + if(hr == S_OK) + { + if (hr == S_OK) + { + hr = pAttributes->SetUnsignedIntegerValue(WPD_PROPERTY_ATTRIBUTE_FORM, dwForm); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_FORM"); + } + if (hr == S_OK) + { + hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_READ, bCanRead); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_READ"); + } + if (hr == S_OK) + { + hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_WRITE, bCanWrite); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_WRITE"); + } + if (hr == S_OK) + { + hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_DELETE, bCanDelete); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_DELETE"); + } + if (hr == S_OK) + { + hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_FAST_PROPERTY, bFastProperty); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_FAST_PROPERTY"); + } + } + + return hr; +} + +HRESULT AddFixedPropertyAttributes( + _In_ REFGUID guidObjectFormat, + _In_ REFPROPERTYKEY key, + _In_ IPortableDeviceValues* pAttributes) +{ + HRESULT hr = S_OK; + + if(pAttributes == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, ("Cannot have NULL parameter")); + return hr; + } + + if (hr == S_OK) + { + for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_FixedAttributesTable); dwIndex++) + { + if((*g_FixedAttributesTable[dwIndex].pFormat == guidObjectFormat) && + (IsEqualPropertyKey(*g_FixedAttributesTable[dwIndex].pKey, key))) + { + hr = AddFixedAttributesByType(g_FixedAttributesTable[dwIndex].type, pAttributes); + CHECK_HR(hr, "Failed to add fixed attributes for %ws.%d on format %ws", (LPWSTR)CComBSTR(key.fmtid), key.pid, (LPWSTR)CComBSTR(guidObjectFormat)); + break; + } + } + } + + return hr; +} + +HRESULT AddSupportedProperties( + _In_ REFGUID guidObjectFormatOrCategory, + _COM_Outptr_ IPortableDeviceKeyCollection** ppKeys) +{ + HRESULT hr = S_OK; + + if(ppKeys == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, "Cannot have NULL parameter"); + return hr; + } + + *ppKeys = NULL; + CComPtr<IPortableDeviceKeyCollection> pCollection; + + if (SUCCEEDED(hr)) + { + hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection, + NULL, + CLSCTX_INPROC_SERVER, + IID_IPortableDeviceKeyCollection, + (VOID**) &pCollection); + CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceKeyCollection"); + } + + if (SUCCEEDED(hr)) + { + hr = AddSupportedProperties(guidObjectFormatOrCategory, pCollection); + CHECK_HR(hr, "Failed to add supported properties"); + } + + if (SUCCEEDED(hr)) + { + hr = pCollection->QueryInterface(IID_PPV_ARGS(ppKeys)); + CHECK_HR(hr, "Failed to QI IPortableDeviceKeyCollection for IPortableDeviceKeyCollection"); + } + + return hr; +} + +HRESULT AddSupportedProperties( + _In_ REFGUID guidObjectFormatOrCategory, + _In_ IPortableDeviceKeyCollection* pKeys) +{ + HRESULT hr = S_OK; + + if(pKeys == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, ("Cannot have NULL parameter")); + return hr; + } + + if (guidObjectFormatOrCategory == WPD_OBJECT_FORMAT_ALL) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForFormatAll, + ARRAYSIZE(g_SupportedPropertiesForFormatAll), + pKeys); + } else if (guidObjectFormatOrCategory == FakeContent_Format) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForFakeContentFormat, + ARRAYSIZE(g_SupportedPropertiesForFakeContentFormat), + pKeys); + } + else if (guidObjectFormatOrCategory == WPD_OBJECT_FORMAT_EXIF) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForFakeImageContentFormat, + ARRAYSIZE(g_SupportedPropertiesForFakeImageContentFormat), + pKeys); + } + else if (guidObjectFormatOrCategory == WPD_OBJECT_FORMAT_WMA) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForFakeMusicContentFormat, + ARRAYSIZE(g_SupportedPropertiesForFakeMusicContentFormat), + pKeys); + } + else if (guidObjectFormatOrCategory == WPD_OBJECT_FORMAT_WMV) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForFakeVideoContentFormat, + ARRAYSIZE(g_SupportedPropertiesForFakeVideoContentFormat), + pKeys); + } + else if (guidObjectFormatOrCategory == WPD_OBJECT_FORMAT_VCARD2) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForFakeContactContentFormat, + ARRAYSIZE(g_SupportedPropertiesForFakeContactContentFormat), + pKeys); + } + else if (guidObjectFormatOrCategory == WPD_FUNCTIONAL_CATEGORY_RENDERING_INFORMATION) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForRenderingInformation, + ARRAYSIZE(g_SupportedPropertiesForRenderingInformation), + pKeys); + } + else if (guidObjectFormatOrCategory == WPD_FUNCTIONAL_CATEGORY_NETWORK_CONFIGURATION) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForNetworkConfiguration, + ARRAYSIZE(g_SupportedPropertiesForNetworkConfiguration), + pKeys); + } + else if (guidObjectFormatOrCategory == WPD_OBJECT_FORMAT_NETWORK_ASSOCIATION) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForNetworkAssociation, + ARRAYSIZE(g_SupportedPropertiesForNetworkAssociation), + pKeys); + } + else if (guidObjectFormatOrCategory == WPD_OBJECT_FORMAT_MICROSOFT_WFC) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForMicrosoftWFC, + ARRAYSIZE(g_SupportedPropertiesForMicrosoftWFC), + pKeys); + } + else if (guidObjectFormatOrCategory == WPD_FUNCTIONAL_CATEGORY_STORAGE) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForFakeStorageContentFormat, + ARRAYSIZE(g_SupportedPropertiesForFakeStorageContentFormat), + pKeys); + } + else if (guidObjectFormatOrCategory == WPD_FUNCTIONAL_CATEGORY_DEVICE) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForFakeDeviceContentFormat, + ARRAYSIZE(g_SupportedPropertiesForFakeDeviceContentFormat), + pKeys); + } + else if (guidObjectFormatOrCategory == FakeMemoContent_Format) + { + hr = AddPropertyKeyArrayToCollection(g_SupportedPropertiesForFakeMemoContentFormat, + ARRAYSIZE(g_SupportedPropertiesForFakeMemoContentFormat), + pKeys); + } + + return hr; +} + +HRESULT GetPreferredAudioProfile( + _COM_Outptr_ IPortableDeviceValues** ppProfile) +{ + HRESULT hr = S_OK; + CComPtr<IPortableDeviceValues> pProfile; + + if(ppProfile == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, ("Cannot have NULL parameter")); + return hr; + } + + *ppProfile = NULL; + + if (SUCCEEDED(hr)) + { + hr = CoCreateInstance(CLSID_PortableDeviceValues, + NULL, + CLSCTX_INPROC_SERVER, + IID_IPortableDeviceValues, + (VOID**) &pProfile); + CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues"); + } + + // Set the value for WPD_OBJECT_FORMAT to indicate this profile applies to WMA objects + if (SUCCEEDED(hr)) + { + hr = pProfile->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_WMA); + CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT"); + } + + // Set the preferred value for WPD_MEDIA_TOTAL_BITRATE + if (SUCCEEDED(hr)) + { + hr = pProfile->SetUnsignedIntegerValue(WPD_MEDIA_TOTAL_BITRATE, 192000); + CHECK_HR(hr, "Failed to set WPD_MEDIA_TOTAL_BITRATE"); + } + + // Set the preferred value for WPD_AUDIO_CHANNEL_COUNT + if (SUCCEEDED(hr)) + { + hr = pProfile->SetUnsignedIntegerValue(WPD_AUDIO_CHANNEL_COUNT, 2); + CHECK_HR(hr, "Failed to set WPD_AUDIO_CHANNEL_COUNT"); + } + + // Set the preferred value for WPD_AUDIO_FORMAT_CODE + if (SUCCEEDED(hr)) + { + hr = pProfile->SetUnsignedIntegerValue(WPD_AUDIO_FORMAT_CODE, WAVE_FORMAT_MSAUDIO3); + CHECK_HR(hr, "Failed to set WPD_AUDIO_FORMAT_CODE"); + } + + // Set the output result + if (SUCCEEDED(hr)) + { + hr = pProfile->QueryInterface(IID_PPV_ARGS(ppProfile)); + CHECK_HR(hr, "Failed to QI for IPortableDeviceValues"); + } + + return hr; +} + +HRESULT GetAudioProfile2( + _COM_Outptr_ IPortableDeviceValues** ppProfile) +{ + HRESULT hr = S_OK; + CComPtr<IPortableDeviceValues> pProfile; + CComPtr<IPortableDeviceValues> pTotalBitRate; + + if(ppProfile == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, ("Cannot have NULL parameter")); + return hr; + } + + *ppProfile = NULL; + + if (SUCCEEDED(hr)) + { + hr = CoCreateInstance(CLSID_PortableDeviceValues, + NULL, + CLSCTX_INPROC_SERVER, + IID_IPortableDeviceValues, + (VOID**) &pProfile); + CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues"); + } + + if (SUCCEEDED(hr)) + { + hr = CoCreateInstance(CLSID_PortableDeviceValues, + NULL, + CLSCTX_INPROC_SERVER, + IID_IPortableDeviceValues, + (VOID**) &pTotalBitRate); + CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues"); + } + + // Set the value for WPD_OBJECT_FORMAT to indicate this profile applies to WMA objects + if (SUCCEEDED(hr)) + { + hr = pProfile->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_WMA); + CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT"); + } + + // Set the value for WPD_MEDIA_TOTAL_BITRATE + if (SUCCEEDED(hr)) + { + // First, set the values for the range which will be contained in pTotalBitRate + hr = pTotalBitRate->SetUnsignedIntegerValue(WPD_PROPERTY_ATTRIBUTE_FORM, WPD_PROPERTY_ATTRIBUTE_FORM_RANGE); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_FORM for WPD_MEDIA_TOTAL_BITRATE"); + + if (SUCCEEDED(hr)) + { + hr = pTotalBitRate->SetUnsignedIntegerValue(WPD_PROPERTY_ATTRIBUTE_RANGE_MIN, 64000); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_RANGE_MIN for WPD_MEDIA_TOTAL_BITRATE"); + } + if (SUCCEEDED(hr)) + { + hr = pTotalBitRate->SetUnsignedIntegerValue(WPD_PROPERTY_ATTRIBUTE_RANGE_MAX, 256000); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_RANGE_MAX for WPD_MEDIA_TOTAL_BITRATE"); + } + if (SUCCEEDED(hr)) + { + hr = pTotalBitRate->SetUnsignedIntegerValue(WPD_PROPERTY_ATTRIBUTE_RANGE_STEP, 1000); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_RANGE_STEP for WPD_MEDIA_TOTAL_BITRATE"); + } + + // Now set the bit rate property to be pTotalBitRate + if (SUCCEEDED(hr)) + { + hr = pProfile->SetIPortableDeviceValuesValue(WPD_MEDIA_TOTAL_BITRATE, pTotalBitRate); + CHECK_HR(hr, "Failed to set WPD_MEDIA_TOTAL_BITRATE"); + } + } + + // Set the value for WPD_AUDIO_CHANNEL_COUNT + if (SUCCEEDED(hr)) + { + hr = pProfile->SetUnsignedIntegerValue(WPD_AUDIO_CHANNEL_COUNT, 2); + CHECK_HR(hr, "Failed to set WPD_AUDIO_CHANNEL_COUNT"); + } + + // Set the value for WPD_AUDIO_FORMAT_CODE + if (SUCCEEDED(hr)) + { + hr = pProfile->SetUnsignedIntegerValue(WPD_AUDIO_FORMAT_CODE, WAVE_FORMAT_MSAUDIO3); + CHECK_HR(hr, "Failed to set WPD_AUDIO_FORMAT_CODE"); + } + + // Set the output result + if (SUCCEEDED(hr)) + { + hr = pProfile->QueryInterface(IID_PPV_ARGS(ppProfile)); + CHECK_HR(hr, "Failed to QI for IPortableDeviceValues"); + } + + return hr; +} + +HRESULT GetVideoProfile( + _COM_Outptr_ IPortableDeviceValues** ppProfile) +{ + HRESULT hr = S_OK; + CComPtr<IPortableDeviceValues> pProfile; + CComPtr<IPortableDeviceValues> pFourCCCode; + + if(ppProfile == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, ("Cannot have NULL parameter")); + return hr; + } + + *ppProfile = NULL; + + if (SUCCEEDED(hr)) + { + hr = CoCreateInstance(CLSID_PortableDeviceValues, + NULL, + CLSCTX_INPROC_SERVER, + IID_IPortableDeviceValues, + (VOID**) &pProfile); + CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues"); + } + + if (SUCCEEDED(hr)) + { + hr = CoCreateInstance(CLSID_PortableDeviceValues, + NULL, + CLSCTX_INPROC_SERVER, + IID_IPortableDeviceValues, + (VOID**) &pFourCCCode); + CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues"); + } + + // Set the value for WPD_OBJECT_FORMAT to indicate this profile applies to WMV objects + if (SUCCEEDED(hr)) + { + hr = pProfile->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_WMV); + CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT to WPD_OBJECT_FORMAT_WMV for the rendering profile"); + } + + + // Set the value for WPD_VIDEO_FOURCC_CODE + if (SUCCEEDED(hr)) + { + CComPtr<IPortableDevicePropVariantCollection> pFourCCCodeEnumElements; + + hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection, + NULL, + CLSCTX_INPROC_SERVER, + IID_IPortableDevicePropVariantCollection, + (VOID**) &pFourCCCodeEnumElements); + CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDevicePropVariantCollection"); + + if (SUCCEEDED(hr)) + { + hr = pFourCCCode->SetUnsignedIntegerValue(WPD_PROPERTY_ATTRIBUTE_FORM, WPD_PROPERTY_ATTRIBUTE_FORM_ENUMERATION); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_FORM for WPD_VIDEO_FOURCC_CODE"); + } + + if (SUCCEEDED(hr)) + { + // Only 1 sample value is set here, add more as appropriate for your device + PROPVARIANT pvValue; + PropVariantInit(&pvValue); + pvValue.vt = VT_UI4; + pvValue.ulVal = MAKEFOURCC('W', 'M', 'V', '3'); // No need to PropVariantClear as we are assigning a value + hr = pFourCCCodeEnumElements->Add(&pvValue); + CHECK_HR(hr, "Failed to populate the FourCC Code Enumeration Elements"); + } + + if (SUCCEEDED(hr)) + { + hr = pFourCCCode->SetIPortableDevicePropVariantCollectionValue(WPD_PROPERTY_ATTRIBUTE_ENUMERATION_ELEMENTS, pFourCCCodeEnumElements); + CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_ENUMERATION_ELEMENTS for WPD_VIDEO_FOURCC_CODE"); + } + + // Now set the Video FourCC Code property to be pFourCCCode + if (SUCCEEDED(hr)) + { + hr = pProfile->SetIPortableDeviceValuesValue(WPD_VIDEO_FOURCC_CODE, pFourCCCode); + CHECK_HR(hr, "Failed to add the WPD_VIDEO_FOURCC_CODE attributes to the WPD_OBJECT_FORMAT_WMV rendering profile"); + } + } + + // Set the output result + if (SUCCEEDED(hr)) + { + hr = pProfile->QueryInterface(IID_PPV_ARGS(ppProfile)); + CHECK_HR(hr, "Failed to QI for IPortableDeviceValues"); + } + + return hr; +} + +HRESULT SetRenderingProfiles( + _In_ IPortableDeviceValues* pValues) +{ + HRESULT hr = S_OK; + CComPtr<IPortableDeviceValues> pPreferredAudioProfile; + CComPtr<IPortableDeviceValues> pAudioProfile2; + CComPtr<IPortableDeviceValues> pVideoProfile; + + CComPtr<IPortableDeviceValuesCollection> pProfiles; + + if(pValues == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, ("Cannot have NULL parameter")); + return hr; + } + + // Create the collection to hold the profiles + if (hr == S_OK) + { + hr = CoCreateInstance(CLSID_PortableDeviceValuesCollection, + NULL, + CLSCTX_INPROC_SERVER, + IID_IPortableDeviceValuesCollection, + (VOID**) &pProfiles); + CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValuesCollection"); + } + + // Get the preferred audio profile + if (hr == S_OK) + { + hr = GetPreferredAudioProfile(&pPreferredAudioProfile); + CHECK_HR(hr, "Failed to get preferred audio profile properties"); + } + + // Add the profile + if (hr == S_OK) + { + hr = pProfiles->Add(pPreferredAudioProfile); + CHECK_HR(hr, "Failed to add preferred audio profile to profile collection"); + } + + // Get the second audio profile + if (hr == S_OK) + { + hr = GetAudioProfile2(&pAudioProfile2); + CHECK_HR(hr, "Failed to get second audio profile properties"); + } + + // Add the profile + if (hr == S_OK) + { + hr = pProfiles->Add(pAudioProfile2); + CHECK_HR(hr, "Failed to add second audio profile to profile collection"); + } + + // Get the video profile + if (hr == S_OK) + { + hr = GetVideoProfile(&pVideoProfile); + CHECK_HR(hr, "Failed to get video profile properties"); + } + + // Add the profile + if (hr == S_OK) + { + hr = pProfiles->Add(pVideoProfile); + CHECK_HR(hr, "Failed to add second audio profile to profile collection"); + } + + // Set the WPD_RENDERING_INFORMATION_PROFILES + if (hr == S_OK) + { + hr = pValues->SetIPortableDeviceValuesCollectionValue(WPD_RENDERING_INFORMATION_PROFILES, pProfiles); + CHECK_HR(hr, "Failed to set WPD_RENDERING_INFORMATION_PROFILES"); + } + + return hr; +} + +DWORD GetResourceSize( + UINT uiResource) +{ + HRESULT hr = S_OK; + LONG lError = ERROR_SUCCESS; + DWORD dwResourceSize = 0; + + HRSRC hResource = FindResource(g_hInstance, MAKEINTRESOURCE(uiResource), TEXT("DATA_FILE")); + if (hResource) + { + HGLOBAL hGlobal = LoadResource(g_hInstance, hResource); + if (hGlobal) + { + dwResourceSize = SizeofResource(g_hInstance, hResource); + } + else + { + lError = GetLastError(); + hr = HRESULT_FROM_WIN32(lError); + } + } + else + { + lError = GetLastError(); + hr = HRESULT_FROM_WIN32(lError); + } + + if (FAILED(hr)) + { + CHECK_HR(hr, "Failed to get resource size for '%d'", uiResource); + } + + return dwResourceSize; +} + +PBYTE GetResourceData( + UINT uiResource) +{ + HRESULT hr = S_OK; + LONG lError = ERROR_SUCCESS; + PBYTE pData = NULL; + + HRSRC hResource = FindResource(g_hInstance, MAKEINTRESOURCE(uiResource), TEXT("DATA_FILE")); + if (hResource) + { + HGLOBAL hGlobal = LoadResource(g_hInstance, hResource); + if (hGlobal) + { + pData = static_cast<BYTE*>(LockResource(hGlobal)); + } + else + { + lError = GetLastError(); + hr = HRESULT_FROM_WIN32(lError); + } + } + else + { + lError = GetLastError(); + hr = HRESULT_FROM_WIN32(lError); + } + + if (FAILED(hr)) + { + CHECK_HR(hr, "Failed to get resource data pointer for '%d'", uiResource); + } + + return pData; +} + +HRESULT IsValidContentType( + _In_ REFGUID guidObjectContentType, + _In_ CAtlArray<GUID>& RestrictedTypes) +{ + HRESULT hr = S_OK; + + size_t numElems = RestrictedTypes.GetCount(); + if(numElems > 0) + { + BOOL bContentTypeAllowed = FALSE; + for(size_t typeIndex = 0; typeIndex < numElems; typeIndex++) + { + if(RestrictedTypes[typeIndex] == guidObjectContentType) + { + bContentTypeAllowed = TRUE; + } + } + if(!bContentTypeAllowed) + { + hr = E_INVALIDARG; + CHECK_HR(hr, "Parent Object does not allow creation of content type %ws", CComBSTR(guidObjectContentType)); + } + } + + return hr; +} + +HRESULT GetClientContext( + _In_ IPortableDeviceValues* pParams, + _In_ LPCWSTR pszContextKey, + _COM_Outptr_ IUnknown** ppContext) +{ + HRESULT hr = S_OK; + ContextMap* pContextMap = NULL; + + if(ppContext == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, ("Cannot have NULL parameter")); + return hr; + } + + *ppContext = NULL; + + if (SUCCEEDED(hr)) + { + hr = pParams->GetIUnknownValue(PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP, (IUnknown**) &pContextMap); + CHECK_HR(hr, "Failed to get PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP"); + } + + if (SUCCEEDED(hr) && pContextMap == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, "Client context map is NULL"); + } + + if (SUCCEEDED(hr)) + { + *ppContext = pContextMap->GetContext(pszContextKey); + if(*ppContext == NULL) + { + hr = HRESULT_FROM_WIN32(ERROR_NOT_FOUND); + CHECK_HR(hr, "Failed to find context %ws for this client", pszContextKey); + } + } + + SAFE_RELEASE(pContextMap); + + return hr; +} + +HRESULT GetClientEventCookie( + _In_ IPortableDeviceValues* pParams, + _Outptr_result_maybenull_ LPWSTR* ppszEventCookie) +{ + HRESULT hr = S_OK; + LPWSTR pszClientContext = NULL; + ClientContext* pClientContext = NULL; + + if ((pParams == NULL) || + (ppszEventCookie == NULL)) + { + return E_POINTER; + } + + *ppszEventCookie = NULL; + + hr = pParams->GetStringValue(WPD_PROPERTY_COMMON_CLIENT_INFORMATION_CONTEXT, &pszClientContext); + CHECK_HR(hr, "Missing value for WPD_PROPERTY_COMMON_CLIENT_INFORMATION_CONTEXT"); + + if (SUCCEEDED(hr)) + { + // Get the client context for this request. + hr = GetClientContext(pParams, pszClientContext, (IUnknown**)&pClientContext); + CHECK_HR(hr, "Failed to get the client context"); + } + + if (SUCCEEDED(hr) && (pClientContext->EventCookie.GetLength() > 0)) + { + // Get the event cookie only if it has been set + *ppszEventCookie = AtlAllocTaskWideString(pClientContext->EventCookie); + if (*ppszEventCookie == NULL) + { + hr = E_OUTOFMEMORY; + CHECK_HR(hr, "Failed to allocate the client event cookie"); + } + } + + // We're done with the context + SAFE_RELEASE(pClientContext); + + CoTaskMemFree(pszClientContext); + pszClientContext = NULL; + + return hr; +} + +HRESULT PostWpdEvent( + _In_ IPortableDeviceValues* pCommandParams, + _In_ IPortableDeviceValues* pEventParams) +{ + HRESULT hr = S_OK; + BYTE* pBuffer = NULL; + DWORD cbBuffer = 0; + LPWSTR pszEventCookie = NULL; + + CComPtr<IWDFDevice> pDevice; + CComPtr<IWpdSerializer> pSerializer; + + // Get the WUDF Device Object + hr = pCommandParams->GetIUnknownValue(PRIVATE_SAMPLE_DRIVER_WUDF_DEVICE_OBJECT, (IUnknown**) &pDevice); + CHECK_HR(hr, "Failed to get PRIVATE_SAMPLE_DRIVER_WUDF_DEVICE_OBJECT"); + + // Get the WpdSerializer Object + if (hr == S_OK) + { + hr = pCommandParams->GetIUnknownValue(PRIVATE_SAMPLE_DRIVER_WPD_SERIALIZER_OBJECT, (IUnknown**) &pSerializer); + CHECK_HR(hr, "Failed to get PRIVATE_SAMPLE_DRIVER_WPD_SERIALIZER_OBJECT"); + } + + if (hr == S_OK) + { + // Set the client event cookie if available. This is benign, as some clients may not provide a cookie. + HRESULT hrEventCookie = GetClientEventCookie(pCommandParams, &pszEventCookie); + if ((hrEventCookie == S_OK) && (pszEventCookie != NULL)) + { + hrEventCookie = pEventParams->SetStringValue(WPD_CLIENT_EVENT_COOKIE, pszEventCookie); + CHECK_HR(hrEventCookie, "Failed to set WPD_CLIENT_EVENT_COOKIE (error ignored)"); + } + } + + if (hr == S_OK) + { + // Create a buffer with the serialized parameters + hr = pSerializer->GetBufferFromIPortableDeviceValues(pEventParams, &pBuffer, &cbBuffer); + CHECK_HR(hr, "Failed to get buffer from IPortableDeviceValues"); + } + + // Send the event + if (hr == S_OK && pBuffer != NULL) + { + hr = pDevice->PostEvent(WPD_EVENT_NOTIFICATION, WdfEventBroadcast, pBuffer, cbBuffer); + CHECK_HR(hr, "Failed to post WPD (broadcast) event"); + } + + // Free the memory + CoTaskMemFree(pBuffer); + pBuffer = NULL; + + CoTaskMemFree(pszEventCookie); + pszEventCookie = NULL; + + return hr; +} + +HRESULT PostWpdEventWithProgress( + _In_ IPortableDeviceValues* pCommandParams, + _In_ IPortableDeviceValues* pEventParams, + _In_ REFGUID guidEvent, + const DWORD dwOperationState, + const DWORD dwOperationProgress) +{ + HRESULT hr = S_OK; + + if((pCommandParams == NULL) || (pEventParams == NULL)) + { + hr = E_POINTER; + CHECK_HR(hr, "Cannot have NULL parameter"); + return hr; + } + + hr = pEventParams->SetGuidValue(WPD_EVENT_PARAMETER_EVENT_ID, guidEvent); + CHECK_HR(hr, "Failed to set WPD_EVENT_PARAMETER_EVENT_ID"); + + if (hr == S_OK) + { + hr = pEventParams->SetUnsignedIntegerValue(WPD_EVENT_PARAMETER_OPERATION_STATE, dwOperationState); + CHECK_HR(hr, "Failed to set WPD_EVENT_PARAMETER_OPERATION_STATE"); + } + + if (hr == S_OK) + { + hr = pEventParams->SetUnsignedIntegerValue(WPD_EVENT_PARAMETER_OPERATION_PROGRESS, dwOperationProgress); + CHECK_HR(hr, "Failed to set WPD_EVENT_PARAMETER_OPERATION_PROGRESS"); + } + + if (hr == S_OK) + { + hr = PostWpdEvent(pCommandParams, pEventParams); + CHECK_HR(hr, "Failed to post event with progress"); + } + + return hr; +} + + +BOOL ExistsInCollection( + _In_ REFGUID guid, + _In_ IPortableDevicePropVariantCollection* pCollection) +{ + HRESULT hr = S_OK; + + BOOL bFound = FALSE; + DWORD dwNumGuids = 0; + + if(pCollection != NULL) + { + hr = pCollection->GetCount(&dwNumGuids); + if (SUCCEEDED(hr)) + { + // Loop through each guid in the collection + for (DWORD dwIndex = 0; dwIndex < dwNumGuids; dwIndex++) + { + PROPVARIANT pv = {0}; + PropVariantInit(&pv); + hr = pCollection->GetAt(dwIndex, &pv); + if (SUCCEEDED(hr)) + { + if ((pv.puuid != NULL) && (pv.vt == VT_CLSID)) + { + bFound = IsEqualGUID(guid, *pv.puuid); + } + } + + PropVariantClear(&pv); + + if (bFound == TRUE) + { + break; + } + } + } + } + + return bFound; +} + +HRESULT GetAtlStringValue( + _In_ REFPROPERTYKEY Key, + _In_ IPortableDeviceValues* pValues, + _Out_ CAtlStringW& strValue) +{ + HRESULT hr = S_OK; + LPWSTR wszValue = NULL; + strValue = L""; + + if (pValues == NULL) + { + hr = E_POINTER; + return hr; + } + + hr = pValues->GetStringValue(Key, &wszValue); + if (hr == S_OK) + { + strValue = wszValue; + } + + if (wszValue != NULL) + { + CoTaskMemFree(wszValue); + wszValue = NULL; + } + + return hr; +} + +HRESULT CreateVCard( + _In_ IPortableDeviceValues* pValues, + _Out_ CAtlStringA& strVCard) +{ + CAtlStringW strLastName; // WPD_CONTACT_LAST_NAME + CAtlStringW strFirstName; // WPD_CONTACT_FIRST_NAME + CAtlStringW strDisplayName; // WPD_CONTACT_DISPLAY_NAME + CAtlStringW strCompanyName; // WPD_CONTACT_COMPANY_NAME + CAtlStringW strRole; // WPD_CONTACT_ROLE + CAtlStringW strPrimaryPhoneNumber; // WPD_CONTACT_PRIMARY_PHONE or WPD_CONTACT_PERSONAL_PHONE + CAtlStringW strBusinessPhoneNumber; // WPD_CONTACT_BUSINESS_PHONE + CAtlStringW strMobilePhoneNumber; // WPD_CONTACT_MOBILE_PHONE + CAtlStringW strPrimaryFaxPhoneNumber; // WPD_CONTACT_PRIMARY_FAX + CAtlStringW strAddressLine1; // WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_LINE1 + CAtlStringW strAddressLine2; // WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_LINE2 + CAtlStringW strAddressCity; // WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_CITY + CAtlStringW strAddressPostalCode; // WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_POSTAL_CODE + + if (pValues != NULL) + { + // Read the contact property values from IPortableDeviceValues + // NOTE: ALL values are not required to be present to create a valid VCARD file. If no properties are + // found then a blank VCARD will be created. + GetAtlStringValue(WPD_CONTACT_LAST_NAME, pValues, strLastName); // WPD_CONTACT_LAST_NAME + GetAtlStringValue(WPD_CONTACT_FIRST_NAME, pValues, strFirstName); // WPD_CONTACT_FIRST_NAME + GetAtlStringValue(WPD_CONTACT_DISPLAY_NAME, pValues, strDisplayName); // WPD_CONTACT_DISPLAY_NAME + GetAtlStringValue(WPD_CONTACT_COMPANY_NAME, pValues, strCompanyName); // WPD_CONTACT_COMPANY_NAME + GetAtlStringValue(WPD_CONTACT_ROLE, pValues, strRole); // WPD_CONTACT_ROLE + GetAtlStringValue(WPD_CONTACT_PRIMARY_PHONE, pValues, strPrimaryPhoneNumber); // WPD_CONTACT_PRIMARY_PHONE or WPD_CONTACT_PERSONAL_PHONE + GetAtlStringValue(WPD_CONTACT_BUSINESS_PHONE, pValues, strBusinessPhoneNumber); // WPD_CONTACT_BUSINESS_PHONE + GetAtlStringValue(WPD_CONTACT_MOBILE_PHONE, pValues, strMobilePhoneNumber); // WPD_CONTACT_MOBILE_PHONE + GetAtlStringValue(WPD_CONTACT_PRIMARY_FAX, pValues, strPrimaryFaxPhoneNumber); // WPD_CONTACT_PRIMARY_FAX + GetAtlStringValue(WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_LINE1, pValues, strAddressLine1); // WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_LINE1 + GetAtlStringValue(WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_LINE2, pValues, strAddressLine2); // WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_LINE2 + GetAtlStringValue(WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_CITY, pValues, strAddressCity); // WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_CITY + GetAtlStringValue(WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_POSTAL_CODE, pValues, strAddressPostalCode); // WPD_CONTACT_PERSONAL_POSTAL_ADDRESS_POSTAL_CODE + } + + // Create the VCARD from the properties found in the IPortableDeviceValues + strVCard.Format(VCARD_FORMAT, strLastName.GetString(), strFirstName.GetString(), + strDisplayName.GetString(), + strCompanyName.GetString(), + strRole.GetString(), + strPrimaryPhoneNumber.GetString(), + strBusinessPhoneNumber.GetString(), + strMobilePhoneNumber.GetString(), + strPrimaryFaxPhoneNumber.GetString(), + strAddressLine1.GetString(), strAddressLine2.GetString(), + strAddressCity.GetString(), strAddressPostalCode.GetString()); + return S_OK; +} + +HRESULT UpdateDeviceFriendlyName( + _In_ IPortableDeviceClassExtension* pPortableDeviceClassExtension, + _In_ LPCWSTR wszDeviceFriendlyName) +{ + HRESULT hr = S_OK; + + // If we were passed NULL parameters we have nothing to do, return S_OK. + if ((pPortableDeviceClassExtension == NULL) || (wszDeviceFriendlyName == NULL)) + { + return S_OK; + } + + CComPtr<IPortableDeviceValues> pParams; + CComPtr<IPortableDeviceValues> pResults; + CComPtr<IPortableDeviceValues> pValues; + + // Prepare to make a call to set the device information + if (hr == S_OK) + { + hr = CoCreateInstance(CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDeviceValues, (VOID**)&pParams); + CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues"); + } + + if (hr == S_OK) + { + hr = CoCreateInstance(CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDeviceValues, (VOID**)&pResults); + CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues for results"); + } + + if (hr == S_OK) + { + hr = CoCreateInstance(CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDeviceValues, (VOID**)&pValues); + CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues for results"); + } + + // Get the information values to update and set them in WPD_PROPERTY_CLASS_EXTENSION_DEVICE_INFORMATION_VALUES + if (hr == S_OK) + { + hr = pValues->SetStringValue(WPD_DEVICE_FRIENDLY_NAME, wszDeviceFriendlyName); + CHECK_HR(hr, ("Failed to set WPD_DEVICE_FRIENDLY_NAME")); + } + + // Set the params + if (hr == S_OK) + { + hr = pParams->SetGuidValue(WPD_PROPERTY_COMMON_COMMAND_CATEGORY, WPD_COMMAND_CLASS_EXTENSION_WRITE_DEVICE_INFORMATION.fmtid); + CHECK_HR(hr, ("Failed to set WPD_PROPERTY_COMMON_COMMAND_CATEGORY")); + } + if (hr == S_OK) + { + hr = pParams->SetUnsignedIntegerValue(WPD_PROPERTY_COMMON_COMMAND_ID, WPD_COMMAND_CLASS_EXTENSION_WRITE_DEVICE_INFORMATION.pid); + CHECK_HR(hr, ("Failed to set WPD_PROPERTY_COMMON_COMMAND_ID")); + } + if (hr == S_OK) + { + hr = pParams->SetIPortableDeviceValuesValue(WPD_PROPERTY_CLASS_EXTENSION_DEVICE_INFORMATION_VALUES, pValues); + CHECK_HR(hr, ("Failed to set WPD_PROPERTY_CLASS_EXTENSION_DEVICE_INFORMATION_VALUES")); + } + + // Make the call + if (hr == S_OK) + { + hr = pPortableDeviceClassExtension->ProcessLibraryMessage(pParams, pResults); + CHECK_HR(hr, ("Failed to process update device information message")); + } + + // A Failed ProcessLibraryMessage operation for updating this value is not considered + // fatal and should return S_OK. + + return S_OK; +} + +HRESULT GetCommonResourceAttributes( + _COM_Outptr_ IPortableDeviceValues** ppAttributes) +{ + HRESULT hr = S_OK; + CComPtr<IPortableDeviceValues> pAttributes; + + if(ppAttributes == NULL) + { + hr = E_POINTER; + CHECK_HR(hr, "Cannot have NULL attributes parameter"); + return hr; + } + + *ppAttributes = NULL; + + if (SUCCEEDED(hr)) + { + hr = CoCreateInstance(CLSID_PortableDeviceValues, + NULL, + CLSCTX_INPROC_SERVER, + IID_IPortableDeviceValues, + (VOID**) &pAttributes); + CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues"); + } + + // Add the attributes that are common to all our resources. + if (SUCCEEDED(hr)) + { + // Add a default value for size. This will be overridden by the content objects with the actual value. + hr = pAttributes->SetUnsignedIntegerValue(WPD_RESOURCE_ATTRIBUTE_TOTAL_SIZE, FAKE_DATA_SIZE); + CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_TOTAL_SIZE"); + } + if (SUCCEEDED(hr)) + { + hr = pAttributes->SetBoolValue(WPD_RESOURCE_ATTRIBUTE_CAN_READ, TRUE); + CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_CAN_READ"); + } + if (SUCCEEDED(hr)) + { + hr = pAttributes->SetBoolValue(WPD_RESOURCE_ATTRIBUTE_CAN_WRITE, FALSE); + CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_CAN_WRITE"); + } + if (SUCCEEDED(hr)) + { + hr = pAttributes->SetBoolValue(WPD_RESOURCE_ATTRIBUTE_CAN_DELETE, FALSE); + CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_CAN_DELETE"); + } + if (SUCCEEDED(hr)) + { + hr = pAttributes->SetUnsignedIntegerValue(WPD_RESOURCE_ATTRIBUTE_OPTIMAL_READ_BUFFER_SIZE, OPTIMAL_BUFFER_SIZE); + CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_OPTIMAL_READ_BUFFER_SIZE"); + } + if (SUCCEEDED(hr)) + { + hr = pAttributes->SetUnsignedIntegerValue(WPD_RESOURCE_ATTRIBUTE_OPTIMAL_WRITE_BUFFER_SIZE, OPTIMAL_BUFFER_SIZE); + CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_OPTIMAL_WRITE_BUFFER_SIZE"); + } + + // Return the resource attributes + if (SUCCEEDED(hr)) + { + hr = pAttributes->QueryInterface(IID_IPortableDeviceValues, (VOID**) ppAttributes); + CHECK_HR(hr, "Failed to QI for IPortableDeviceValues on Wpd IPortableDeviceValues"); + } + return hr; +} + + |
