Sample Code
Windows Driver Samples/ WPD WUDF sample driver/ C++/ helpers.cpp/
#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; }
Our Services
-
What our customers say about us?
Read our customer testimonials to find out why our clients keep returning for their projects.
View Testimonials