summaryrefslogtreecommitdiff
path: root/wpd/WpdMultiTransportDriver
diff options
context:
space:
mode:
authorAdonais Romero González <[email protected]>2024-05-06 16:21:31 -0700
committerGitHub <[email protected]>2024-05-06 16:21:31 -0700
commita74a241c664c4e1d7c0838287b34076c19d9858a (patch)
tree6ff7562612967b122acf8acf8a69c4dcfd5905db /wpd/WpdMultiTransportDriver
parentdef8e8e34ed2b7b1deb2fc9112ac4255f1a0f2ba (diff)
parent15477ce52bbb6b42ca591ecdfb484cac089f89ab (diff)
Merge develop changes prior to upcoming WDK release (May 2024)
Diffstat (limited to 'wpd/WpdMultiTransportDriver')
-rw-r--r--wpd/WpdMultiTransportDriver/Device.cpp552
-rw-r--r--wpd/WpdMultiTransportDriver/Device.h97
-rw-r--r--wpd/WpdMultiTransportDriver/Driver.cpp215
-rw-r--r--wpd/WpdMultiTransportDriver/Driver.h47
-rw-r--r--wpd/WpdMultiTransportDriver/Queue.cpp417
-rw-r--r--wpd/WpdMultiTransportDriver/Queue.h149
-rw-r--r--wpd/WpdMultiTransportDriver/README.md25
-rw-r--r--wpd/WpdMultiTransportDriver/Stdafxsrc.cpp1
-rw-r--r--wpd/WpdMultiTransportDriver/WpdBaseDriver.cpp250
-rw-r--r--wpd/WpdMultiTransportDriver/WpdBaseDriver.h39
-rw-r--r--wpd/WpdMultiTransportDriver/WpdCapabilities.cpp906
-rw-r--r--wpd/WpdMultiTransportDriver/WpdCapabilities.h64
-rw-r--r--wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.cpp61
-rw-r--r--wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.def9
-rw-r--r--wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.idl24
-rw-r--r--wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.inx84
-rw-r--r--wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.rc15
-rw-r--r--wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.rgs26
-rw-r--r--wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.sln28
-rw-r--r--wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.vcxproj355
-rw-r--r--wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.vcxproj.Filters74
-rw-r--r--wpd/WpdMultiTransportDriver/WpdObjectEnum.cpp416
-rw-r--r--wpd/WpdMultiTransportDriver/WpdObjectEnum.h103
-rw-r--r--wpd/WpdMultiTransportDriver/WpdObjectProperties.cpp1421
-rw-r--r--wpd/WpdMultiTransportDriver/WpdObjectProperties.h79
-rw-r--r--wpd/WpdMultiTransportDriver/WpdObjectResources.cpp674
-rw-r--r--wpd/WpdMultiTransportDriver/WpdObjectResources.h111
-rw-r--r--wpd/WpdMultiTransportDriver/resource.h3
-rw-r--r--wpd/WpdMultiTransportDriver/stdafx.h266
29 files changed, 0 insertions, 6511 deletions
diff --git a/wpd/WpdMultiTransportDriver/Device.cpp b/wpd/WpdMultiTransportDriver/Device.cpp
deleted file mode 100644
index 9e1af476..00000000
--- a/wpd/WpdMultiTransportDriver/Device.cpp
+++ /dev/null
@@ -1,552 +0,0 @@
-#include "stdafx.h"
-#include "Device.h"
-#include "WpdMultiTransportDriver_i.c"
-
-#include "Device.tmh"
-
-STDMETHODIMP_(HRESULT)
-CDevice::OnD0Entry(_In_ IWDFDevice* /*pDevice*/,
- WDF_POWER_DEVICE_STATE /*previousState*/)
-{
- return S_OK;
-}
-
-STDMETHODIMP_(HRESULT)
-CDevice::OnD0Exit(_In_ IWDFDevice* /*pDevice*/,
- WDF_POWER_DEVICE_STATE /*newState*/)
-{
- return S_OK;
-}
-
-STDMETHODIMP_(VOID)
-CDevice::OnSurpriseRemoval(_In_ IWDFDevice* /*pDevice*/)
-{
- return;
-}
-
-STDMETHODIMP_(HRESULT)
-CDevice::OnQueryRemove(_In_ IWDFDevice* /*pDevice*/)
-{
- return S_OK;
-}
-
-STDMETHODIMP_(HRESULT)
-CDevice::OnQueryStop(_In_ IWDFDevice* /*pDevice*/)
-{
- return S_OK;
-}
-
-STDMETHODIMP_(VOID)
-CDevice::OnSelfManagedIoCleanup(_In_ IWDFDevice* /*pDevice*/)
-{
- return;
-}
-
-STDMETHODIMP_(VOID)
-CDevice::OnSelfManagedIoFlush(_In_ IWDFDevice* /*pDevice*/)
-{
- return;
-}
-
-STDMETHODIMP_(HRESULT)
-CDevice::OnSelfManagedIoInit(_In_ IWDFDevice* /*pDevice*/)
-{
- return S_OK;
-}
-
-STDMETHODIMP_(HRESULT)
-CDevice::OnSelfManagedIoSuspend(_In_ IWDFDevice* /*pDevice*/)
-{
- return S_OK;
-}
-
-STDMETHODIMP_(HRESULT)
-CDevice::OnSelfManagedIoRestart(_In_ IWDFDevice* /*pDevice*/)
-{
- return S_OK;
-}
-
-STDMETHODIMP_(HRESULT)
-CDevice::OnSelfManagedIoStop(_In_ IWDFDevice* /*pDevice*/)
-{
- return S_OK;
-}
-
-STDMETHODIMP_(HRESULT)
-CDevice::OnPrepareHardware(_In_ IWDFDevice* pDevice)
-{
- HRESULT hr = S_OK;
-
- if (m_pWpdBaseDriver != NULL)
- {
- hr = m_pWpdBaseDriver->Initialize();
- CHECK_HR(hr, "Failed to Initialize the driver class");
- }
-
- // Initialize the WPD Class Extension. This will enable the appropriate WPD interface GUID,
- // as well as do any additional initialization (e.g. enabling Legacy Compatibility layers for those drivers
- // which requested support in their INF).
- if (hr == S_OK && m_pPortableDeviceClassExtension == NULL)
- {
- CComPtr<IPortableDeviceValues> pOptions;
- CComPtr<IPortableDevicePropVariantCollection> pContentTypes;
-
- hr = CoCreateInstance(CLSID_PortableDeviceClassExtension,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceClassExtension,
- (VOID**)&m_pPortableDeviceClassExtension);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceClassExtension");
-
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**)&pOptions);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
-
- if (hr == S_OK)
- {
- CComPtr<IPortableDeviceValues> pIDs;
-
- // ATTENTION: The following GUID value is provided for illustrative
- // purposes only.
- //
- // Rather than hard-coding a GUID value in your driver, the driver
- // must obtain a GUID value from the device. The GUID value on the
- // device can be provisioned by the driver (upon first-connect) by
- // using CoCreateGUID and setting that value into non-volatile storage
- // on the device. The same GUID value will then be reported by each
- // of your device's transports. To avoid a provisioning race condition,
- // always read the value from the device after provisioning. Only
- // provision the GUID once. Thereafter, always use the value provided
- // by the device.
- GUID guidFUID = { 0x245e5e81, 0x2c17, 0x40a4, { 0x8b, 0x10, 0xe9, 0x43, 0xc5, 0x4c, 0x97, 0xb2 } };
-
- // Initialize the PortableDeviceClassExtension with a list of supported content types for the
- // connected device. This will ensure that the correct application compatibility settings will
- // be applied for your device.
-
- // Get supported content types
- if (hr == S_OK)
- {
- hr = GetSupportedContentTypes(&pContentTypes);
- CHECK_HR(hr, "Failed to get supported content types");
- }
-
- // Add the supported types to the options
- if (hr == S_OK)
- {
- hr = pOptions->SetIPortableDevicePropVariantCollectionValue(WPD_CLASS_EXTENSION_OPTIONS_SUPPORTED_CONTENT_TYPES, pContentTypes);
- CHECK_HR(hr, "Failed to set WPD_CLASS_EXTENSION_OPTIONS_SUPPORTED_CONTENT_TYPES");
- }
-
- if (hr == S_OK)
- {
- m_pWpdBaseDriver->m_pQueueCallback = NULL;
-
- HRESULT hrTemp = m_pPortableDeviceClassExtension->QueryInterface(
- __uuidof(IQueueCallbackDeviceIoControl),
- (void**)&m_pWpdBaseDriver->m_pQueueCallback
- );
- CHECK_HR(hrTemp, "Failed to obtain IQueueCallbackDeviceIoControl interface from class extension");
-
- if (hrTemp == S_OK)
- {
- // Enable the Multi-Transport Mode option
- hr = pOptions->SetBoolValue(WPD_CLASS_EXTENSION_OPTIONS_MULTITRANSPORT_MODE, TRUE);
- CHECK_HR(hr, "Failed to enable multi-transport mode");
-
- // Create a PnP ID value collection
- if (hr == S_OK)
- {
- hr = CreateIDValues(DEVICE_MANUFACTURER_VALUE,
- DEVICE_MODEL_VALUE,
- DEVICE_FIRMWARE_VERSION_VALUE,
- guidFUID,
- &pIDs);
- CHECK_HR(hr, "Failed to Create the ID value collection");
- }
-
- // Add the PnP ID value collection to the options
- if (hr == S_OK)
- {
- hr = pOptions->SetIPortableDeviceValuesValue(WPD_CLASS_EXTENSION_OPTIONS_DEVICE_IDENTIFICATION_VALUES, pIDs);
- CHECK_HR(hr, "Failed to set WPD_CLASS_EXTENSION_OPTIONS_DEVICE_IDENTIFICATION_VALUES");
- }
-
- // Add the transport bandwidth (in kilobits per second units) to the options
- // (0 indicates bandwidth unknown)
- if (hr == S_OK)
- {
- // Set the transport bandwidth (optional)
- hr = pOptions->SetUnsignedIntegerValue(WPD_CLASS_EXTENSION_OPTIONS_TRANSPORT_BANDWIDTH, 0L);
- CHECK_HR(hr, "Failed to set WPD_CLASS_EXTENSION_OPTIONS_TRANSPORT_BANDWIDTH");
- }
- }
- }
-
- if (hr == S_OK)
- {
- hr = m_pPortableDeviceClassExtension->Initialize(pDevice, pOptions);
- CHECK_HR(hr, "Failed to Initialize portable device class extension object");
- }
-
- // Since users commonly have the abiltity to customize their device even when it is not
- // connected to the PC, we need to make sure the PC is current when the driver loads.
- //
- // Send the latest device friendly name to the PortableDeviceClassExtension component
- // so the system is always updated with the current device name.
- //
- // This call should also be made after a successful property set operation of
- // WPD_DEVICE_FRIENDLY_NAME.
-
- LPWSTR wszDeviceFriendlyName = NULL;
-
- if (hr == S_OK)
- {
- hr = GetDeviceFriendlyName(&wszDeviceFriendlyName);
- CHECK_HR(hr, "Failed to get device's friendly name");
- }
-
- if (hr == S_OK && wszDeviceFriendlyName != NULL)
- {
- hr = UpdateDeviceFriendlyName(m_pPortableDeviceClassExtension, wszDeviceFriendlyName);
- CHECK_HR(hr, "Failed to update device's friendly name");
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszDeviceFriendlyName);
- }
- }
- }
-
- return hr;
-}
-
-STDMETHODIMP_(HRESULT)
-CDevice::OnReleaseHardware(_In_ IWDFDevice* /*pDevice*/)
-{
- if (m_pWpdBaseDriver != NULL)
- {
- m_pWpdBaseDriver->Uninitialize();
- }
-
- if (m_pPortableDeviceClassExtension != NULL)
- {
- m_pPortableDeviceClassExtension = NULL;
- }
-
- return S_OK;
-}
-
-HRESULT CDevice::GetSupportedContentTypes(
- _Outptr_ IPortableDevicePropVariantCollection** ppContentTypes)
-{
- HRESULT hr = S_OK;
- CComPtr<IPortableDeviceValues> pParams;
- CComPtr<IPortableDeviceValues> pResults;
-
- if (ppContentTypes == NULL)
- {
- hr = E_INVALIDARG;
- return hr;
- }
-
- // CoCreate a collection to store the WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_CONTENT_TYPES command parameters.
- if(SUCCEEDED(hr))
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**)&pParams);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- // CoCreate a collection to store the WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_CONTENT_TYPES command results.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**)&pResults);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- // Set the params
- if(SUCCEEDED(hr))
- {
- hr = pParams->SetGuidValue(WPD_PROPERTY_COMMON_COMMAND_CATEGORY, WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_CONTENT_TYPES.fmtid);
- CHECK_HR(hr, ("Failed to set WPD_PROPERTY_COMMON_COMMAND_CATEGORY"));
- }
- if(SUCCEEDED(hr))
- {
- hr = pParams->SetUnsignedIntegerValue(WPD_PROPERTY_COMMON_COMMAND_ID, WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_CONTENT_TYPES.pid);
- CHECK_HR(hr, ("Failed to set WPD_PROPERTY_COMMON_COMMAND_ID"));
- }
- if(SUCCEEDED(hr))
- {
- hr = pParams->SetGuidValue(WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORY, WPD_FUNCTIONAL_CATEGORY_ALL);
- CHECK_HR(hr, ("Failed to set WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORY"));
- }
-
- // Make the call
- if(SUCCEEDED(hr))
- {
- hr = m_pWpdBaseDriver->DispatchWpdMessage(pParams, pResults);
- CHECK_HR(hr, ("Failed to dispatch message to get supported content types"));
- }
-
- // Get the results
- if(SUCCEEDED(hr))
- {
- hr = pResults->GetIPortableDevicePropVariantCollectionValue(WPD_PROPERTY_CAPABILITIES_CONTENT_TYPES, ppContentTypes);
- CHECK_HR(hr, ("Failed to get WPD_PROPERTY_CAPABILITIES_CONTENT_TYPES"));
- }
-
- return hr;
-}
-
-HRESULT CDevice::GetDeviceFriendlyName(
- _Outptr_result_maybenull_ LPWSTR* pwszDeviceFriendlyName)
-{
- HRESULT hr = S_OK;
-
- CComPtr<IPortableDeviceValues> pParams;
- CComPtr<IPortableDeviceValues> pResults;
- CComPtr<IPortableDeviceKeyCollection> pKeys;
- CComPtr<IPortableDeviceValues> pValues;
-
- if (pwszDeviceFriendlyName == NULL)
- {
- hr = E_INVALIDARG;
- return hr;
- }
-
- *pwszDeviceFriendlyName = NULL;
-
- // CoCreate a collection to store the WPD_COMMAND_OBJECT_PROPERTIES_GET command parameters.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**)&pParams);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- // CoCreate a collection to store the WPD_COMMAND_OBJECT_PROPERTIES_GET command results.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**)&pResults);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- // CoCreate a collection to store the requested property keys. In our case, we are requesting just the device friendly name
- // (WPD_DEVICE_FRIENDLY_NAME)
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceKeyCollection,
- (VOID**)&pKeys);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceKeyCollection for results");
- }
-
- // Set the params
- if (hr == S_OK)
- {
- hr = pParams->SetGuidValue(WPD_PROPERTY_COMMON_COMMAND_CATEGORY, WPD_COMMAND_OBJECT_PROPERTIES_GET.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_OBJECT_PROPERTIES_GET.pid);
- CHECK_HR(hr, ("Failed to set WPD_PROPERTY_COMMON_COMMAND_ID"));
- }
-
- if (hr == S_OK)
- {
- hr = pParams->SetStringValue(WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID, WPD_DEVICE_OBJECT_ID);
- CHECK_HR(hr, ("Failed to set WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID"));
- }
-
- if (hr == S_OK)
- {
- hr = pKeys->Add(WPD_DEVICE_FRIENDLY_NAME);
- CHECK_HR(hr, ("Failed to add WPD_DEVICE_FRIENDLY_NAME to key collection"));
- }
-
- if (hr == S_OK)
- {
- hr = pParams->SetIPortableDeviceKeyCollectionValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS, pKeys);
- CHECK_HR(hr, ("Failed to set WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS"));
- }
-
- // Make the call
- if (hr == S_OK)
- {
- hr = m_pWpdBaseDriver->DispatchWpdMessage(pParams, pResults);
- CHECK_HR(hr, ("Failed to dispatch message to get supported content types"));
- }
-
- // Get the results
- if (hr == S_OK)
- {
- hr = pResults->GetIPortableDeviceValuesValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES, &pValues);
- CHECK_HR(hr, ("Failed to get WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES"));
- }
-
- if (hr == S_OK)
- {
- hr = pValues->GetStringValue(WPD_DEVICE_FRIENDLY_NAME, pwszDeviceFriendlyName);
- CHECK_HR(hr, ("Failed to get WPD_DEVICE_FRIENDLY_NAME"));
- }
-
- return hr;
-}
-
-HRESULT
-CDevice::CreateIDValues(
- _In_ LPCWSTR pszManufacturer,
- _In_ LPCWSTR pszModel,
- _In_opt_ LPCWSTR pszVersion,
- _In_ REFGUID guidFUID,
- _COM_Outptr_ IPortableDeviceValues** ppValues)
-{
- HRESULT hr = S_OK;
- CComPtr<IPortableDeviceValues> pValues;
-
- *ppValues = NULL;
-
- // Create the object to hold the ID values
- hr = CoCreateInstance(
- CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**)&pValues);
-
- if (SUCCEEDED(hr))
- {
- hr = pValues->SetStringValue(WPD_DEVICE_MANUFACTURER, pszManufacturer);
- }
-
- if (SUCCEEDED(hr))
- {
- hr = pValues->SetStringValue(WPD_DEVICE_MODEL, pszModel);
- }
-
- if (SUCCEEDED(hr) && pszVersion)
- {
- hr = pValues->SetStringValue(WPD_DEVICE_FIRMWARE_VERSION, pszVersion);
- }
-
- if (SUCCEEDED(hr))
- {
- hr = pValues->SetGuidValue(WPD_DEVICE_FUNCTIONAL_UNIQUE_ID, guidFUID);
- }
-
- if (SUCCEEDED(hr))
- {
- *ppValues = pValues.Detach();
- }
-
- return hr;
-}
-
-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;
-}
diff --git a/wpd/WpdMultiTransportDriver/Device.h b/wpd/WpdMultiTransportDriver/Device.h
deleted file mode 100644
index db76d087..00000000
--- a/wpd/WpdMultiTransportDriver/Device.h
+++ /dev/null
@@ -1,97 +0,0 @@
-#pragma once
-
-#include "resource.h"
-#include "WpdMultiTransportDriver.h"
-
-class ATL_NO_VTABLE CDevice :
- public CComObjectRootEx<CComMultiThreadModel>,
- public IPnpCallback,
- public IPnpCallbackSelfManagedIo,
- public IPnpCallbackHardware
-{
-public:
- CDevice() :
- m_pWpdBaseDriver(NULL)
- {
- }
-
- DECLARE_NOT_AGGREGATABLE(CDevice)
-
- BEGIN_COM_MAP(CDevice)
- COM_INTERFACE_ENTRY(IPnpCallback)
- COM_INTERFACE_ENTRY(IPnpCallbackSelfManagedIo)
- COM_INTERFACE_ENTRY(IPnpCallbackHardware)
- END_COM_MAP()
-
-public:
- static HRESULT
- CreateInstance(
- _In_ IWDFDeviceInitialize* pDeviceInit,
- _In_ WpdBaseDriver* pWpdBaseDriver,
- _COM_Outptr_ IUnknown** ppUnkwn)
- {
- *ppUnkwn = NULL;
-
- //
- // Set device properties.
- //
- pDeviceInit->SetLockingConstraint(None);
-
- CComObject< CDevice> *pMyDevice = NULL;
- HRESULT hr = CComObject<CDevice>::CreateInstance( &pMyDevice );
- if( SUCCEEDED (hr) )
- {
- pMyDevice->AddRef();
- hr = pMyDevice->QueryInterface( __uuidof(IUnknown),(void **) ppUnkwn);
- if (hr == S_OK)
- {
- pMyDevice->m_pWpdBaseDriver = pWpdBaseDriver;
- }
- pMyDevice->Release();
- pMyDevice = NULL;
- }
-
- return hr;
- }
-
- // IPnpCallback
- //
- STDMETHOD_(HRESULT, OnD0Entry) (_In_ IWDFDevice* pDevice, WDF_POWER_DEVICE_STATE previousState);
- STDMETHOD_(HRESULT, OnD0Exit) (_In_ IWDFDevice* pDevice, WDF_POWER_DEVICE_STATE newState);
- STDMETHOD_(VOID, OnSurpriseRemoval)(_In_ IWDFDevice* pDevice);
- STDMETHOD_(HRESULT, OnQueryRemove) (_In_ IWDFDevice* pDevice);
- STDMETHOD_(HRESULT, OnQueryStop) (_In_ IWDFDevice* pDevice);
-
- // IPnpCallbackSelfManagedIo
- //
- STDMETHOD_(VOID, OnSelfManagedIoCleanup)(_In_ IWDFDevice* pDevice);
- STDMETHOD_(VOID, OnSelfManagedIoFlush) (_In_ IWDFDevice* pDevice);
- STDMETHOD_(HRESULT, OnSelfManagedIoInit) (_In_ IWDFDevice* pDevice);
- STDMETHOD_(HRESULT, OnSelfManagedIoSuspend)(_In_ IWDFDevice* pDevice);
- STDMETHOD_(HRESULT, OnSelfManagedIoRestart)(_In_ IWDFDevice* pDevice);
- STDMETHOD_(HRESULT, OnSelfManagedIoStop) (_In_ IWDFDevice* pDevice);
-
- // IPnpCallbackHardware
- //
- STDMETHOD_(HRESULT, OnPrepareHardware)(_In_ IWDFDevice* pDevice);
- STDMETHOD_(HRESULT, OnReleaseHardware)(_In_ IWDFDevice* pDevice);
-
-private:
- HRESULT GetSupportedContentTypes(
- _Outptr_ IPortableDevicePropVariantCollection** ppContentTypes);
-
- HRESULT GetDeviceFriendlyName(
- _Outptr_result_maybenull_ LPWSTR* pwszDeviceFriendlyName);
-
- HRESULT CreateIDValues(
- _In_ LPCWSTR pszManufacturer,
- _In_ LPCWSTR pszModel,
- _In_opt_ LPCWSTR pszVersion,
- _In_ REFGUID guidFUID,
- _COM_Outptr_ IPortableDeviceValues** ppValues);
-
-private:
- WpdBaseDriver* m_pWpdBaseDriver;
- CComPtr<IPortableDeviceClassExtension> m_pPortableDeviceClassExtension;
-};
-
diff --git a/wpd/WpdMultiTransportDriver/Driver.cpp b/wpd/WpdMultiTransportDriver/Driver.cpp
deleted file mode 100644
index 584297de..00000000
--- a/wpd/WpdMultiTransportDriver/Driver.cpp
+++ /dev/null
@@ -1,215 +0,0 @@
-#include "stdafx.h"
-#include "Driver.h"
-#include "Device.h"
-#include "Queue.h"
-
-CDriver::CDriver()
-{
-}
-
-HRESULT
-CDriver::OnDeviceAdd(
- _In_ IWDFDriver* pDriver,
- _In_ IWDFDeviceInitialize* pDeviceInit
- )
-/*++
-
-Routine Description:
-
- The framework calls this function when a device is being added to
- the driver stack.
-
-Arguments:
-
- IWDFDriver - Framework interface. The driver uses this
- interface to create device objects.
- IWDFDeviceInitialize - Framework interface. The driver uses this
- interface to set device parameters before
- creating the device obeject.
-
-Return Value:
-
- HRESULT S_OK - Device added successfully
-
---*/
-{
- HRESULT hr = S_OK;
- CComPtr<IUnknown> pDeviceCallback;
-
- WpdBaseDriver *pWpdBaseDriver = NULL;
-
- //
- // Create the WPD driver object that handles all WPD messages for this device
- //
- pWpdBaseDriver = new WpdBaseDriver();
- if(pWpdBaseDriver == NULL)
- {
- hr = E_OUTOFMEMORY;
- }
-
- if(SUCCEEDED(hr))
- {
- //
- // Create device callback object
- //
- hr = CDevice::CreateInstance(pDeviceInit, pWpdBaseDriver, &pDeviceCallback);
- }
-
- //
- // This driver has no special power management requirements and so
- // we set power policy ownership to UMDF to indicate that UMDF should
- // handle powermanagement for us.
- //
- pDeviceInit->SetPowerPolicyOwnership(FALSE);
-
- //
- // Create WDFDevice.
- //
- CComPtr<IWDFDevice> pIWDFDevice;
- if(SUCCEEDED(hr))
- {
- hr = pDriver->CreateDevice(
- pDeviceInit,
- pDeviceCallback,
- &pIWDFDevice);
- }
-
- //
- // Assign pWpdBaseDriver to the device object. Each UMDF device requires its own instance of
- // a WpdBaseDriver to handle WPD messages.
- //
- if(SUCCEEDED(hr))
- {
- hr = pIWDFDevice->AssignContext(this, (void*)pWpdBaseDriver);
- if(SUCCEEDED(hr))
- {
- // AddRef the WpdBaseDriver object since it is not stored with the
- // device context.
- pWpdBaseDriver->AddRef();
- }
- }
-
- //
- // Create the default queue callback object
- //
- CComPtr<IUnknown> pIUnknown;
- if(S_OK == hr)
- {
- hr = CDefaultQueue::CreateInstance(&pIUnknown);
- }
-
- //
- // Configure the default queue.
- //
- if(S_OK == hr)
- {
- CComPtr<IWDFIoQueue> pDefaultQueue;
- hr = pIWDFDevice->CreateIoQueue(
- pIUnknown,
- TRUE, // bDefaultQueue
- WdfIoQueueDispatchParallel,
- TRUE, // bPowerManaged
- FALSE, // bAllowZeroLengthRequests
- &pDefaultQueue);
- }
- pIUnknown = NULL;
-
- //
- // Create the WPD queue callback object
- //
- if(S_OK == hr)
- {
- hr = CQueue::CreateInstance(&pIUnknown);
- }
-
- //
- // Configure the WPD queue.
- //
- if(S_OK == hr)
- {
- hr = pIWDFDevice->CreateIoQueue(
- pIUnknown,
- FALSE, // bDefaultQueue
- WdfIoQueueDispatchSequential,
- TRUE, // bPowerManaged
- FALSE, // bAllowZeroLengthRequests
- &pWpdBaseDriver->m_pWpdQueue);
- }
-
- pDeviceCallback = NULL;
- pIWDFDevice = NULL;
-
- //
- // It is fine to release the interface on the callback object.
- // The framework has its own refcount on this object and will
- // provide an interface when calling into the driver.
- //
- pIUnknown = NULL;
-
- // Release the WpdBaseDriver object. If it was successfully added to the device context,
- // it was already addref'd above. Releasing it here ensures it will be destroyed if
- // an error occured and it could not be added to the device context.
- SAFE_RELEASE(pWpdBaseDriver);
-
- return hr;
-}
-
-void
-CDriver::OnDeinitialize(
- _In_ IWDFDriver* pDriver
- )
-/*++
-
-Routine Description:
-
- The framework calls this function just before de-initializing itself. All
- WDF framework resources should be released by driver before returning from this call.
-
-Arguments:
-
-Return Value:
-
---*/
-{
- UNREFERENCED_PARAMETER(pDriver);
- return;
-}
-
-HRESULT
-CDriver::OnInitialize(
- _In_ IWDFDriver* pDriver
- )
-/*++
-
-Routine Description:
-
- The framework calls this function just after loading the driver. The driver can
- perform any global, device independent intialization in this routine.
-
-Arguments:
-
-Return Value:
-
---*/
-{
- UNREFERENCED_PARAMETER(pDriver);
- return S_OK;
-}
-
-STDMETHODIMP_ (void)
-CDriver::OnCleanup(
- _In_ IWDFObject* pWdfObject
- )
-{
- // Release the base driver object
- HRESULT hr = S_OK;
- WpdBaseDriver* pWpdBaseDriver = NULL;
-
- hr = pWdfObject->RetrieveContext((void**)&pWpdBaseDriver);
- if((hr == S_OK) && (pWpdBaseDriver != NULL))
- {
- pWpdBaseDriver->Release();
- pWpdBaseDriver = NULL;
- }
-}
-
diff --git a/wpd/WpdMultiTransportDriver/Driver.h b/wpd/WpdMultiTransportDriver/Driver.h
deleted file mode 100644
index c4c07ad8..00000000
--- a/wpd/WpdMultiTransportDriver/Driver.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#pragma once
-
-#include "resource.h"
-#include "WpdMultiTransportDriver.h"
-
-class ATL_NO_VTABLE CDriver :
- public CComObjectRootEx<CComMultiThreadModel>,
- public CComCoClass<CDriver, &CLSID_WpdMultiTransportDriver>,
- public IDriverEntry,
- public IObjectCleanup
-{
-public:
- CDriver();
-
- DECLARE_REGISTRY_RESOURCEID(IDR_WpdMultiTransportDriver)
-
- DECLARE_NOT_AGGREGATABLE(CDriver)
-
- BEGIN_COM_MAP(CDriver)
- COM_INTERFACE_ENTRY(IDriverEntry)
- END_COM_MAP()
-
-public:
- //
- // IDriverEntry
- //
- STDMETHOD (OnInitialize)(
- _In_ IWDFDriver* pDriver
- );
- STDMETHOD (OnDeviceAdd)(
- _In_ IWDFDriver* pDriver,
- _In_ IWDFDeviceInitialize* pDeviceInit
- );
- STDMETHOD_ (void, OnDeinitialize)(
- _In_ IWDFDriver* pDriver
- );
-
- //
- // IObjectCleanup
- //
- STDMETHOD_ (void, OnCleanup)(
- _In_ IWDFObject* pWdfObject
- );
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(WpdMultiTransportDriver), CDriver)
-
diff --git a/wpd/WpdMultiTransportDriver/Queue.cpp b/wpd/WpdMultiTransportDriver/Queue.cpp
deleted file mode 100644
index 9d6c4571..00000000
--- a/wpd/WpdMultiTransportDriver/Queue.cpp
+++ /dev/null
@@ -1,417 +0,0 @@
-// Queue.cpp : Implementation of CQueue
-
-
-#include "stdafx.h"
-#include "Queue.h"
-#include <devioctl.h>
-#include <initguid.h>
-
-#include "Queue.tmh"
-
-// Add table used to lookup the Access required for Wpd Commands
-BEGIN_WPD_COMMAND_ACCESS_MAP(g_WpdCommandAccessMap)
- DECLARE_WPD_STANDARD_COMMAND_ACCESS_ENTRIES
- // Add any custom commands here e.g.
- // WPD_COMMAND_ACCESS_ENTRY(MyCustomCommand, WPD_COMMAND_ACCESS_READWRITE)
-END_WPD_COMMAND_ACCESS_MAP
-
-// This enables use to use VERIFY_WPD_COMMAND_ACCESS to check command access function for us.
-DECLARE_VERIFY_WPD_COMMAND_ACCESS;
-
-/******************************************************************************
- * This method gets the WpdBaseDriver associated with the UMDF device object.
- * The caller should Release *ppWpdBaseDriver when it is done.
- *
- * When this device was created, we assigned the WpdBaseDriver as the context.
- * So, in order to retrieve the correct WpdBaseDriver for this device, we simply
- * get the device context.
- *****************************************************************************/
-HRESULT GetWpdBaseDriver(
- _In_ IWDFDevice* pDevice,
- _Outptr_result_nullonfailure_ WpdBaseDriver** ppWpdBaseDriver)
-{
- HRESULT hr = S_OK;
- WpdBaseDriver* pContext = NULL;
-
- if((pDevice == NULL) || (ppWpdBaseDriver == NULL))
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter for pDevice or ppWpdBaseDriver");
- }
-
- *ppWpdBaseDriver = NULL;
-
- if(SUCCEEDED(hr))
- {
- hr = pDevice->RetrieveContext((void**)&pContext);
- if(SUCCEEDED(hr))
- {
- if(pContext != NULL)
- {
- pContext->AddRef();
- *ppWpdBaseDriver = pContext;
- }
- else
- {
- hr = E_UNEXPECTED;
- CHECK_HR(hr, "Device context is NULL");
- }
- }
- }
-
- return hr;
-}
-
-// CDefaultQueue
-
-STDMETHODIMP_ (void)
-CDefaultQueue::OnCreateFile(
- _In_ IWDFIoQueue* pQueue,
- _In_ IWDFIoRequest* pRequest,
- _In_ IWDFFile* pFileObject
- )
-{
- UNREFERENCED_PARAMETER(pFileObject);
-
- CComPtr<WpdBaseDriver> pWpdBaseDriver;
- CComPtr<IWDFDevice> pDevice;
- HRESULT hr = S_OK;
-
- pQueue->GetDevice(&pDevice);
-
- hr = GetWpdBaseDriver(pDevice, &pWpdBaseDriver);
- CHECK_HR(hr, "Failed to get WpdBaseDriver");
-
- if (hr == S_OK)
- {
- hr = pRequest->ForwardToIoQueue(pWpdBaseDriver->m_pWpdQueue);
- CHECK_HR(hr, "Failed to get WpdBaseDriver");
- }
-
- if (FAILED(hr))
- pRequest->Complete(hr);
-
- return;
-}
-
-STDMETHODIMP_ (void)
-CDefaultQueue::OnDeviceIoControl(
- _In_ IWDFIoQueue* pQueue,
- _In_ IWDFIoRequest* pRequest,
- ULONG ControlCode,
- SIZE_T InputBufferSizeInBytes,
- SIZE_T OutputBufferSizeInBytes
- )
-{
- CComPtr<WpdBaseDriver> pWpdBaseDriver;
- CComPtr<IWDFDevice> pDevice;
- HRESULT hr = S_OK;
-
- pQueue->GetDevice(&pDevice);
-
- hr = GetWpdBaseDriver(pDevice, &pWpdBaseDriver);
- CHECK_HR(hr, "Failed to get WpdBaseDriver");
-
- if (hr == S_OK)
- {
- if (IS_WPD_IOCTL(ControlCode))
- {
- hr = pRequest->ForwardToIoQueue(pWpdBaseDriver->m_pWpdQueue);
- CHECK_HR(hr, "Failed to forward to WPD queue");
- }
- else if (pWpdBaseDriver->m_pQueueCallback)
- {
- pWpdBaseDriver->m_pQueueCallback->OnDeviceIoControl(
- pQueue,
- pRequest,
- ControlCode,
- InputBufferSizeInBytes,
- OutputBufferSizeInBytes
- );
- }
- else
- {
- hr = E_UNEXPECTED;
- CHECK_HR(hr, "Unable to handle IOCTL code '0x%lx'", ControlCode);
- }
- }
-
- if (FAILED(hr))
- pRequest->Complete(hr);
-
- return;
-}
-
-/******************************************************************************
- * This function calls the WpdBaseDriver to handle the WPD message. In order
- * to do this it does the following:
- *
- * - Deserializes pBuffer into an IPortableDeviceValues which holds the command
- * input parameters from the WPD application.
- * - Creates an IPortableDeviceValues for the results.
- * - Calls the WpdBaseDriver to handle the message. (The results of this
- * operation are put into the previously created results IPortableDeviceValues.)
- * - The results IPortableDeviceValues is then serialized back into pBuffer, making
- * sure that it does not overrun ulOutputBufferLength.
- *
- *****************************************************************************/
-HRESULT CQueue::ProcessWpdMessage(
- ULONG ControlCode,
- _In_ ContextMap* pClientContextMap,
- _In_ IWDFDevice* pDevice,
- _In_reads_bytes_(ulInputBufferLength) PVOID pInBuffer,
- ULONG ulInputBufferLength,
- _Out_writes_bytes_to_(ulOutputBufferLength, *pdwBytesWritten) PVOID pOutBuffer,
- ULONG ulOutputBufferLength,
- _Out_ DWORD* pdwBytesWritten)
-{
- HRESULT hr = S_OK;
- CComPtr<IPortableDeviceValues> pParams;
- CComPtr<IPortableDeviceValues> pResults;
- CComPtr<WpdBaseDriver> pWpdBaseDriver;
-
- *pdwBytesWritten = 0;
-
- if (hr == S_OK)
- {
- hr = m_pWpdSerializer->GetIPortableDeviceValuesFromBuffer((BYTE*)pInBuffer,
- ulInputBufferLength,
- &pParams);
- CHECK_HR(hr, "Failed to deserialize command parameters from input buffer");
- }
-
- // Verify that that command was sent with the appropriate access
- if (hr == S_OK)
- {
- hr = VERIFY_WPD_COMMAND_ACCESS(ControlCode, pParams, g_WpdCommandAccessMap);
- CHECK_HR(hr, "Wpd Command was sent with incorrect access flags");
- }
-
- // Create the WPD results collection
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**)&pResults);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- // Insert the client context map as one of this driver's private properties. This is
- // just a convenient place holder which allows other methods down the chain to
- // access the context map.
- if (hr == S_OK)
- {
- hr = pParams->SetIUnknownValue(PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP, pClientContextMap);
- CHECK_HR(hr, "Failed to set PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP");
- }
-
- // Insert the IWDFDevice interface as one of this driver's private properties. This is
- // just a convenient place holder which allows other methods down the chain to
- // access the WUDF Device object.
- if (hr == S_OK)
- {
- hr = pParams->SetIUnknownValue(PRIVATE_SAMPLE_DRIVER_WUDF_DEVICE_OBJECT, pDevice);
- CHECK_HR(hr, "Failed to set PRIVATE_SAMPLE_DRIVER_WUDF_DEVICE_OBJECT");
- }
-
- // Insert the IWpdSerializer interface as one of this driver's private properties. This is
- // just a convenient place holder which allows other methods down the chain to
- // access the WPD Serializer object.
- if (hr == S_OK)
- {
- hr = pParams->SetIUnknownValue(PRIVATE_SAMPLE_DRIVER_WPD_SERIALIZER_OBJECT, m_pWpdSerializer);
- CHECK_HR(hr, "Failed to set PRIVATE_SAMPLE_DRIVER_WPD_SERIALIZER_OBJECT");
- }
-
- // Get the WpdBaseDriver so we can dispatch the message
- if (hr == S_OK)
- {
- hr = GetWpdBaseDriver(pDevice, &pWpdBaseDriver);
- CHECK_HR(hr, "Failed to get WpdBaseDriver");
- }
-
- if (hr == S_OK)
- {
- hr = pWpdBaseDriver->DispatchWpdMessage(pParams, pResults);
- CHECK_HR(hr, "Failed to handle WPD command");
- }
-
- if (hr == S_OK)
- {
- hr = m_pWpdSerializer->WriteIPortableDeviceValuesToBuffer(ulOutputBufferLength,
- pResults,
- (BYTE*)pOutBuffer,
- pdwBytesWritten);
- CHECK_HR(hr, "Failed to serialize results to output buffer");
- }
-
- return hr;
-}
-
-// CQueue
-
-STDMETHODIMP_ (void)
-CQueue::OnCreateFile(
- _In_ IWDFIoQueue* pQueue,
- _In_ IWDFIoRequest* pRequest,
- _In_ IWDFFile* pFileObject
- )
-{
- UNREFERENCED_PARAMETER(pQueue);
-
- // This critical section protects the section of code where we
- // Create the serializer and results interfaces used in handling I/O messages.
- // We only need to create them once, then we hang on to them for the lifetime of this
- // queue object.
- CComCritSecLock<CComAutoCriticalSection> Lock(m_CriticalSection);
- HRESULT hr = S_OK;
-
- // Create the WPD serializer
- if ((hr == S_OK) &&
- (m_pWpdSerializer == NULL))
- {
- hr = CoCreateInstance(CLSID_WpdSerializer,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IWpdSerializer,
- (VOID**)&m_pWpdSerializer);
-
- CHECK_HR(hr, "Failed to CoCreate CLSID_WpdSerializer");
- }
-
- // Create the client context map and associate it with the File Object
- // so we can obtain it on a per-client basis.
- if (hr == S_OK)
- {
- ContextMap* pClientContextMap = new ContextMap();
-
- if(pClientContextMap != NULL)
- {
- hr = pFileObject->AssignContext(this, (void*)pClientContextMap);
- CHECK_HR(hr, "Failed to set client context map");
-
- // Release the client context map if we cannot set it
- // properly
- if(FAILED(hr))
- {
- pClientContextMap->Release();
- pClientContextMap = NULL;
- }
- }
- else
- {
- hr = E_OUTOFMEMORY;
- CHECK_HR(hr, "Failed to create client context map");
- }
- }
-
- pRequest->Complete(hr);
- return;
-}
-
-
-STDMETHODIMP_ (void)
-CQueue::OnDeviceIoControl(
- _In_ IWDFIoQueue* pQueue,
- _In_ IWDFIoRequest* pRequest,
- ULONG ControlCode,
- SIZE_T InputBufferSizeInBytes,
- SIZE_T OutputBufferSizeInBytes
- )
-{
- HRESULT hr = S_OK;
- DWORD dwBytesWritten = 0;
- UNREFERENCED_PARAMETER(InputBufferSizeInBytes);
- UNREFERENCED_PARAMETER(OutputBufferSizeInBytes);
-
- if(IS_WPD_IOCTL(ControlCode))
- {
- BYTE* pInputBuffer = NULL;
- SIZE_T cbInputBuffer = 0;
- BYTE* pOutputBuffer = NULL;
- SIZE_T cbOutputBuffer = 0;
- ContextMap* pClientContextMap = NULL;
- CComPtr<IWDFMemory> pMemoryIn;
- CComPtr<IWDFMemory> pMemoryOut;
- CComPtr<IWDFDevice> pDevice;
- CComPtr<IWDFFile> pFileObject;
-
- //
- // Get input memory buffer, the memory object is always returned even if the
- // underlying buffer is NULL
- //
- pRequest->GetInputMemory(&pMemoryIn);
- pInputBuffer = (BYTE*) pMemoryIn->GetDataBuffer(&cbInputBuffer);
-
- //
- // Get output memory buffer, the memory object is always returned even if the
- // underlying buffer is NULL
- //
- pRequest->GetOutputMemory(&pMemoryOut);
- pOutputBuffer = (BYTE*) pMemoryOut->GetDataBuffer(&cbOutputBuffer);
-
- // Get the Context map for this client
- pRequest->GetFileObject(&pFileObject);
- if (pFileObject != NULL)
- {
- hr = pFileObject->RetrieveContext((void**)&pClientContextMap);
- CHECK_HR(hr, "Failed to get Contextmap from WDF File Object");
-
- if (hr == S_OK)
- {
- // Get the device object
- pQueue->GetDevice(&pDevice );
- hr = ProcessWpdMessage(ControlCode,
- pClientContextMap,
- pDevice,
- pInputBuffer,
- (DWORD)cbInputBuffer,
- pOutputBuffer,
- (DWORD)cbOutputBuffer,
- &dwBytesWritten);
- }
- }
- else
- {
- hr = E_UNEXPECTED;
- CHECK_HR(hr, "WDF File Object is NULL");
- }
- }
- else
- {
- hr = E_UNEXPECTED;
- CHECK_HR(hr, "Received invalid/unsupported IOCTL code '0x%lx'",ControlCode);
- }
-
- // Complete the request
- if (hr == S_OK)
- {
- pRequest->CompleteWithInformation(hr, dwBytesWritten);
- }
- else
- {
- pRequest->Complete(hr);
- }
-
- return;
-}
-
-STDMETHODIMP_ (void)
-CQueue::OnCleanup(
- _In_ IWDFObject* pWdfObject
- )
-{
- // Destroy the client context map
- HRESULT hr = S_OK;
- ContextMap* pClientContextMap = NULL;
-
- hr = pWdfObject->RetrieveContext((void**)&pClientContextMap);
- if((hr == S_OK) && (pClientContextMap != NULL))
- {
- pClientContextMap->Release();
- pClientContextMap = NULL;
- }
-}
-
diff --git a/wpd/WpdMultiTransportDriver/Queue.h b/wpd/WpdMultiTransportDriver/Queue.h
deleted file mode 100644
index abf14e2c..00000000
--- a/wpd/WpdMultiTransportDriver/Queue.h
+++ /dev/null
@@ -1,149 +0,0 @@
-// Queue.h : Declaration of the CQueue
-
-#pragma once
-#include "resource.h" // main symbols
-#include "WpdMultiTransportDriver.h"
-
-class ATL_NO_VTABLE CDefaultQueue :
- public CComObjectRootEx<CComMultiThreadModel>,
- public IQueueCallbackDeviceIoControl,
- public IQueueCallbackCreate
-{
-public:
- CDefaultQueue()
- {
-
- }
-
- DECLARE_NOT_AGGREGATABLE(CDefaultQueue)
-
- BEGIN_COM_MAP(CDefaultQueue)
- COM_INTERFACE_ENTRY(IQueueCallbackDeviceIoControl)
- COM_INTERFACE_ENTRY(IQueueCallbackCreate)
- END_COM_MAP()
-
-public:
- static
- HRESULT CreateInstance(
- _COM_Outptr_ IUnknown** ppUkwn)
- {
- *ppUkwn = NULL;
- CComObject< CDefaultQueue> *pMyQueue = NULL;
- HRESULT hr = CComObject<CDefaultQueue>::CreateInstance( &pMyQueue );
- if( SUCCEEDED (hr) )
- {
- pMyQueue->AddRef();
- hr = pMyQueue->QueryInterface( __uuidof(IUnknown), (void **) ppUkwn );
- pMyQueue->Release();
- pMyQueue = NULL;
- }
-
- return hr;
- }
-
- //
- // Wdf Callbacks
- //
-
- // IQueueCallbackCreateClose
- //
- STDMETHOD_ (void, OnCreateFile)(
- _In_ IWDFIoQueue *pQueue,
- _In_ IWDFIoRequest *pRequest,
- _In_ IWDFFile *pFileObject
- );
-
- //
- // IQueueCallbackDeviceIoControl
- //
- STDMETHOD_ (void, OnDeviceIoControl)(
- _In_ IWDFIoQueue* pQueue,
- _In_ IWDFIoRequest* pRequest,
- ULONG ControlCode,
- SIZE_T InputBufferSizeInBytes,
- SIZE_T OutputBufferSizeInBytes
- );
-};
-
-
-class ATL_NO_VTABLE CQueue :
- public CComObjectRootEx<CComMultiThreadModel>,
- public IQueueCallbackDeviceIoControl,
- public IQueueCallbackCreate,
- public IObjectCleanup
-{
-public:
- CQueue()
- {
- }
-
- DECLARE_NOT_AGGREGATABLE(CQueue)
-
- BEGIN_COM_MAP(CQueue)
- COM_INTERFACE_ENTRY(IQueueCallbackDeviceIoControl)
- COM_INTERFACE_ENTRY(IQueueCallbackCreate)
- END_COM_MAP()
-
-public:
- static
- HRESULT CreateInstance(
- _COM_Outptr_ IUnknown** ppUkwn)
- {
- *ppUkwn = NULL;
- CComObject< CQueue> *pMyQueue = NULL;
- HRESULT hr = CComObject<CQueue>::CreateInstance( &pMyQueue );
- if( SUCCEEDED (hr) )
- {
- pMyQueue->AddRef();
- hr = pMyQueue->QueryInterface( __uuidof(IUnknown), (void **) ppUkwn );
- pMyQueue->Release();
- pMyQueue = NULL;
- }
- return hr;
- }
-
- //
- // Wdf Callbacks
- //
-
- // IQueueCallbackCreateClose
- //
- STDMETHOD_ (void, OnCreateFile)(
- _In_ IWDFIoQueue *pQueue,
- _In_ IWDFIoRequest *pRequest,
- _In_ IWDFFile *pFileObject
- );
-
- //
- // IQueueCallbackDeviceIoControl
- //
- STDMETHOD_ (void, OnDeviceIoControl)(
- _In_ IWDFIoQueue* pQueue,
- _In_ IWDFIoRequest* pRequest,
- ULONG ControlCode,
- SIZE_T InputBufferSizeInBytes,
- SIZE_T OutputBufferSizeInBytes
- );
-
- //
- // IObjectCleanup
- //
- STDMETHOD_ (void, OnCleanup)(
- _In_ IWDFObject* pWdfObject
- );
-
-private:
- HRESULT ProcessWpdMessage(
- ULONG ControlCode,
- _In_ ContextMap* pClientContextMap,
- _In_ IWDFDevice* pDevice,
- _In_reads_bytes_(ulInputBufferLength) PVOID pInBuffer,
- ULONG ulInputBufferLength,
- _Out_writes_bytes_to_(ulOutputBufferLength, *pdwBytesWritten) PVOID pOutBuffer,
- ULONG ulOutputBufferLength,
- _Out_ DWORD* pdwBytesWritten);
-
- CComPtr<IWpdSerializer> m_pWpdSerializer;
- CComAutoCriticalSection m_CriticalSection;
-};
-
diff --git a/wpd/WpdMultiTransportDriver/README.md b/wpd/WpdMultiTransportDriver/README.md
deleted file mode 100644
index 3656e8b9..00000000
--- a/wpd/WpdMultiTransportDriver/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
----
-page_type: sample
-description: "Demonstrates how to extend the WpdHelloWorldDriver for a device that supports multiple transports."
-languages:
-- cpp
-products:
-- windows
-- windows-wdk
----
-
-# WPD multi-transport sample driver
-
-The WpdMultiTransportDriver sample demonstrates how you could extend the WpdHelloWorldDriver for a device that supports multiple transports. A transport is a protocol over which a portable device communicates with a computer. Example transports include Internet Protocol (IP), Bluetooth, and USB.
-
-A number of portable devices now support multiple transports. For example, a number of cell phones support both Bluetooth and USB. Windows supports a multitransport driver model that ensures that only one node appears for each device.
-
-For a complete description of this sample and its underlying code and functionality, refer to the [WPD MultiTransport Driver](https://docs.microsoft.com/windows-hardware/drivers/portable/the-wpdmultitransportdriver-sample) description in the Windows Driver Kit documentation.
-
-## Related topics
-
-[WPD Design Guide](https://docs.microsoft.com/windows-hardware/drivers/portable/wpd-design-guide)
-
-[WPD Driver Development Tools](https://docs.microsoft.com/windows-hardware/drivers/portable/familiarizing-yourself-with-the-sample-driver)
-
-[WPD Programming Guide](https://docs.microsoft.com/windows-hardware/drivers/portable/wpd-programming-guide)
diff --git a/wpd/WpdMultiTransportDriver/Stdafxsrc.cpp b/wpd/WpdMultiTransportDriver/Stdafxsrc.cpp
deleted file mode 100644
index 5105a28d..00000000
--- a/wpd/WpdMultiTransportDriver/Stdafxsrc.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "Stdafx.h" \ No newline at end of file
diff --git a/wpd/WpdMultiTransportDriver/WpdBaseDriver.cpp b/wpd/WpdMultiTransportDriver/WpdBaseDriver.cpp
deleted file mode 100644
index f57892a3..00000000
--- a/wpd/WpdMultiTransportDriver/WpdBaseDriver.cpp
+++ /dev/null
@@ -1,250 +0,0 @@
-#include "stdafx.h"
-#include "WpdBaseDriver.tmh"
-
-WpdBaseDriver::WpdBaseDriver() :
- m_cRef(1)
-{
-}
-
-WpdBaseDriver::~WpdBaseDriver()
-{
-
-}
-
-ULONG __stdcall WpdBaseDriver::AddRef()
-{
- InterlockedIncrement((long*) &m_cRef);
- return m_cRef;
-}
-
-_At_(this, __drv_freesMem(Mem))
-ULONG __stdcall WpdBaseDriver::Release()
-{
- ULONG ulRefCount = m_cRef - 1;
-
- if (InterlockedDecrement((long*) &m_cRef) == 0)
- {
- delete this;
- return 0;
- }
- return ulRefCount;
-}
-
-HRESULT __stdcall WpdBaseDriver::QueryInterface(
- REFIID riid,
- void** ppv)
-{
- HRESULT hr = S_OK;
-
- if(riid == IID_IUnknown)
- {
- *ppv = static_cast<IUnknown*>(this);
- AddRef();
- }
- else
- {
- *ppv = NULL;
- hr = E_NOINTERFACE;
- }
- return hr;
-}
-
-HRESULT WpdBaseDriver::DispatchWpdMessage(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
-
- HRESULT hr = S_OK;
- GUID guidCommandCategory = {0};
- DWORD dwCommandID = 0;
- PROPERTYKEY CommandKey = WPD_PROPERTY_NULL;
-
- if (hr == S_OK)
- {
- hr = pParams->GetGuidValue(WPD_PROPERTY_COMMON_COMMAND_CATEGORY, &guidCommandCategory);
- CHECK_HR(hr, "Failed to get WPD_PROPERTY_COMMON_COMMAND_CATEGORY from input parameters");
- }
-
- if (hr == S_OK)
- {
- hr = pParams->GetUnsignedIntegerValue(WPD_PROPERTY_COMMON_COMMAND_ID, &dwCommandID);
- CHECK_HR(hr, "Failed to get WPD_PROPERTY_COMMON_COMMAND_ID from input parameters");
- }
-
- // If WPD_PROPERTY_COMMON_COMMAND_CATEGORY or WPD_PROPERTY_COMMON_COMMAND_ID could not be extracted
- // properly then we should return E_INVALIDARG to the client.
- if (FAILED(hr))
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Failed to get WPD_PROPERTY_COMMON_COMMAND_CATEGORY or WPD_PROPERTY_COMMON_COMMAND_ID from input parameters");
- }
-
- if (hr == S_OK)
- {
- CommandKey.fmtid = guidCommandCategory;
- CommandKey.pid = dwCommandID;
-
- if (CommandKey.fmtid == WPD_CATEGORY_OBJECT_ENUMERATION)
- {
- hr = m_ObjectEnum.DispatchWpdMessage(CommandKey, pParams, pResults);
- }
- else if (CommandKey.fmtid == WPD_CATEGORY_OBJECT_PROPERTIES)
- {
- hr = m_ObjectProperties.DispatchWpdMessage(CommandKey, pParams, pResults);
- }
- else if (CommandKey.fmtid == WPD_CATEGORY_OBJECT_RESOURCES)
- {
- hr = m_ObjectResources.DispatchWpdMessage(CommandKey, pParams, pResults);
- }
- else if (CommandKey.fmtid == WPD_CATEGORY_CAPABILITIES)
- {
- hr = m_Capabilities.DispatchWpdMessage(CommandKey, pParams, pResults);
- }
- else if (IsEqualPropertyKey(CommandKey, WPD_COMMAND_COMMON_GET_OBJECT_IDS_FROM_PERSISTENT_UNIQUE_IDS))
- {
- hr = OnGetObjectIDsFromPersistentUniqueIDs(pParams, pResults);
- }
- else
- {
- hr = E_NOTIMPL;
- CHECK_HR(hr, "Unknown command %ws.%d received",CComBSTR(CommandKey.fmtid), CommandKey.pid);
- }
- }
-
- HRESULT hrTemp = pResults->SetErrorValue(WPD_PROPERTY_COMMON_HRESULT, hr);
- CHECK_HR(hrTemp, ("Failed to set WPD_PROPERTY_COMMON_HRESULT"));
-
- // Set to a success code, to indicate that the message was received.
- // the return code for the actual command's results is stored in the
- // WPD_PROPERTY_COMMON_HRESULT property.
- hr = S_OK;
-
- return hr;
-}
-
-/**
- * This method is called to initialize the driver object.
- * This is where the driver would set up it's I/O libraries
- * and so on.
- */
-HRESULT WpdBaseDriver::Initialize()
-{
- return S_OK;
-}
-
-/**
- * This method is called to uninitialize the driver object.
- * In a real driver, this is where the driver would clean up
- * any resources held by this driver.
- */
-VOID WpdBaseDriver::Uninitialize()
-{
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_COMMON_GET_OBJECT_IDS_FROM_PERSISTENT_UNIQUE_IDS
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_COMMON_PERSISTENT_UNIQUE_IDS: Contains an IPortableDevicePropVariantCollection of VT_LPWSTR,
- * indicating the PersistentUniqueIDs.
- *
- * The driver should:
- * - Iterate through the PersistentUniqueIDs, and convert to a currently valid object id.
- * This object ID list should be returned as an IPortableDevicePropVariantCollection of VT_LPWSTR
- * in WPD_PROPERTY_COMMON_OBJECT_IDS.
- * Order is implicit, i.e. the first element in the Persistent Unique ID list corresponds to the
- * to the first element of the ObjectID list and so on.
- *
- * For those elements where an existing ObjectID could not be found (e.g. the
- * object is no longer present on the device), the element will contain the
- * empty string (L"").
- */
-HRESULT WpdBaseDriver::OnGetObjectIDsFromPersistentUniqueIDs(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- DWORD dwCount = 0;
- CComPtr<IPortableDevicePropVariantCollection> pPersistentIDs;
- CComPtr<IPortableDevicePropVariantCollection> pObjectIDs;
-
- if((pParams == NULL) ||
- (pResults == NULL))
- {
- hr = E_POINTER;
- CHECK_HR(hr, "Cannot have NULL parameter");
- return hr;
- }
-
- // Get the list of Persistent IDs
- if (hr == S_OK)
- {
- hr = pParams->GetIPortableDevicePropVariantCollectionValue(WPD_PROPERTY_COMMON_PERSISTENT_UNIQUE_IDS, &pPersistentIDs);
- CHECK_HR(hr, "Failed to get WPD_PROPERTY_COMMON_PERSISTENT_UNIQUE_IDS");
- }
-
- // Create the collection to hold the ObjectIDs
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDevicePropVariantCollection,
- (VOID**) &pObjectIDs);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDevicePropVariantCollection");
- }
-
- // Iterate through the persistent ID list and add the equivalent object ID for each element.
- if (hr == S_OK)
- {
- hr = pPersistentIDs->GetCount(&dwCount);
- CHECK_HR(hr, "Failed to get count from persistent ID collection");
-
- if (hr == S_OK)
- {
- DWORD dwIndex = 0;
- PROPVARIANT pvPersistentID = {0};
- PROPVARIANT pvObjectID = {0};
-
- PropVariantInit(&pvPersistentID);
- PropVariantInit(&pvObjectID);
-
- for(dwIndex = 0; dwIndex < dwCount; dwIndex++)
- {
- pvObjectID.vt = VT_LPWSTR;
- hr = pPersistentIDs->GetAt(dwIndex, &pvPersistentID);
- CHECK_HR(hr, "Failed to get persistent ID at index %d", dwIndex);
-
- // Since our persistent unique identifier are identical to our object
- // identifiers, we just return it back to the caller.
- if (hr == S_OK)
- {
- pvObjectID.pwszVal = AtlAllocTaskWideString(pvPersistentID.pwszVal);
- }
-
- if (hr == S_OK)
- {
- hr = pObjectIDs->Add(&pvObjectID);
- CHECK_HR(hr, "Failed to add next Object ID");
- }
-
- PropVariantClear(&pvPersistentID);
- PropVariantClear(&pvObjectID);
-
- if(FAILED(hr))
- {
- break;
- }
- }
- }
- }
-
- if (hr == S_OK)
- {
- hr = pResults->SetIPortableDevicePropVariantCollectionValue(WPD_PROPERTY_COMMON_OBJECT_IDS, pObjectIDs);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_COMMON_OBJECT_IDS");
- }
-
- return hr;
-}
-
diff --git a/wpd/WpdMultiTransportDriver/WpdBaseDriver.h b/wpd/WpdMultiTransportDriver/WpdBaseDriver.h
deleted file mode 100644
index a7462df2..00000000
--- a/wpd/WpdMultiTransportDriver/WpdBaseDriver.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#pragma once
-
-class WpdBaseDriver :
- public IUnknown
-{
-public:
- WpdBaseDriver();
- virtual ~WpdBaseDriver();
-
- HRESULT Initialize();
- VOID Uninitialize();
-
- HRESULT DispatchWpdMessage(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
-private:
- HRESULT OnGetObjectIDsFromPersistentUniqueIDs(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
-public: // IUnknown
- ULONG __stdcall AddRef();
-
- _At_(this, __drv_freesMem(Mem))
- ULONG __stdcall Release();
-
- HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
-
-public:
- WpdObjectEnumerator m_ObjectEnum;
- WpdObjectProperties m_ObjectProperties;
- WpdObjectResources m_ObjectResources;
- WpdCapabilities m_Capabilities;
- CComPtr<IWDFIoQueue> m_pWpdQueue;
- CComPtr<IQueueCallbackDeviceIoControl> m_pQueueCallback;
-
-private:
- ULONG m_cRef;
-};
-
diff --git a/wpd/WpdMultiTransportDriver/WpdCapabilities.cpp b/wpd/WpdMultiTransportDriver/WpdCapabilities.cpp
deleted file mode 100644
index 9dd3faed..00000000
--- a/wpd/WpdMultiTransportDriver/WpdCapabilities.cpp
+++ /dev/null
@@ -1,906 +0,0 @@
-#include "stdafx.h"
-#include "WpdCapabilities.tmh"
-
-const PROPERTYKEY g_SupportedCommands[] =
-{
- // WPD_CATEGORY_OBJECT_ENUMERATION
- WPD_COMMAND_OBJECT_ENUMERATION_START_FIND,
- WPD_COMMAND_OBJECT_ENUMERATION_FIND_NEXT,
- WPD_COMMAND_OBJECT_ENUMERATION_END_FIND,
-
- // WPD_CATEGORY_OBJECT_PROPERTIES
- WPD_COMMAND_OBJECT_PROPERTIES_GET_SUPPORTED,
- WPD_COMMAND_OBJECT_PROPERTIES_GET,
- WPD_COMMAND_OBJECT_PROPERTIES_GET_ALL,
- WPD_COMMAND_OBJECT_PROPERTIES_SET,
- WPD_COMMAND_OBJECT_PROPERTIES_GET_ATTRIBUTES,
- WPD_COMMAND_OBJECT_PROPERTIES_DELETE,
-
- // WPD_CATEGORY_OBJECT_RESOURCES
- WPD_COMMAND_OBJECT_RESOURCES_GET_SUPPORTED,
- WPD_COMMAND_OBJECT_RESOURCES_OPEN,
- WPD_COMMAND_OBJECT_RESOURCES_READ,
- WPD_COMMAND_OBJECT_RESOURCES_CLOSE,
- WPD_COMMAND_OBJECT_RESOURCES_GET_ATTRIBUTES,
-
- // WPD_CATEGORY_CAPABILITIES
- WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_COMMANDS,
- WPD_COMMAND_CAPABILITIES_GET_COMMAND_OPTIONS,
- WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_FUNCTIONAL_CATEGORIES,
- WPD_COMMAND_CAPABILITIES_GET_FUNCTIONAL_OBJECTS,
- WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_CONTENT_TYPES,
- WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_FORMATS,
- WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_FORMAT_PROPERTIES,
- WPD_COMMAND_CAPABILITIES_GET_FIXED_PROPERTY_ATTRIBUTES,
-};
-
-const GUID g_SupportedFunctionalCategories[] =
-{
- WPD_FUNCTIONAL_CATEGORY_DEVICE,
- WPD_FUNCTIONAL_CATEGORY_STORAGE,
-};
-
-WpdCapabilities::WpdCapabilities()
-{
-
-}
-
-WpdCapabilities::~WpdCapabilities()
-{
-
-}
-
-HRESULT WpdCapabilities::DispatchWpdMessage(_In_ REFPROPERTYKEY Command,
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
-
- if (Command.fmtid != WPD_CATEGORY_CAPABILITIES)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "This object does not support this command category %ws",CComBSTR(Command.fmtid));
- }
-
- if (hr == S_OK)
- {
- if (IsEqualPropertyKey(Command, WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_COMMANDS))
- {
- hr = OnGetSupportedCommands(pParams, pResults);
- CHECK_HR(hr, "Failed to get supported commands");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_CAPABILITIES_GET_COMMAND_OPTIONS))
- {
- hr = OnGetCommandOptions(pParams, pResults);
- CHECK_HR(hr, "Failed to get command options");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_FUNCTIONAL_CATEGORIES))
- {
- hr = OnGetFunctionalCategories(pParams, pResults);
- CHECK_HR(hr, "Failed to get functional categories");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_CAPABILITIES_GET_FUNCTIONAL_OBJECTS))
- {
- hr = OnGetFunctionalObjects(pParams, pResults);
- CHECK_HR(hr, "Failed to get functional objects");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_CONTENT_TYPES))
- {
- hr = OnGetSupportedContentTypes(pParams, pResults);
- CHECK_HR(hr, "Failed to get supported content types");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_FORMATS))
- {
- hr = OnGetSupportedFormats(pParams, pResults);
- CHECK_HR(hr, "Failed to get supported formats");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_FORMAT_PROPERTIES))
- {
- hr = OnGetSupportedFormatProperties(pParams, pResults);
- CHECK_HR(hr, "Failed to get supported format properties");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_CAPABILITIES_GET_FIXED_PROPERTY_ATTRIBUTES))
- {
- hr = OnGetFixedPropertyAttributes(pParams, pResults);
- CHECK_HR(hr, "Failed to get fixed property attributes");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_EVENTS))
- {
- hr = OnGetSupportedEvents(pParams, pResults);
- CHECK_HR(hr, "Failed to get supported events");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_CAPABILITIES_GET_EVENT_OPTIONS))
- {
- hr = OnGetEventOptions(pParams, pResults);
- CHECK_HR(hr, "Failed to get event options");
- }
- else
- {
- hr = E_NOTIMPL;
- CHECK_HR(hr, "This object does not support this command id %d", Command.pid);
- }
- }
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_COMMANDS
- * command.
- *
- * The parameters sent to us are:
- * - none.
- *
- * The driver should:
- * - Return all commands supported by this driver as an
- * IPortableDeviceKeyCollection in WPD_PROPERTY_CAPABILITIES_SUPPORTED_COMMANDS.
- * This includes custom commands, if any.
- *
- * Note that certain commands require a "command target" to function correctly.
- * (e.g. delete object command) It is understood that not all objects are necessarily
- * valid targets (e.g. you cannot delete the device object).
- */
-HRESULT WpdCapabilities::OnGetSupportedCommands(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- CComPtr<IPortableDeviceKeyCollection> pCommands;
- UNREFERENCED_PARAMETER(pParams);
-
- // CoCreate a collection to store the supported commands.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceKeyCollection,
- (VOID**) &pCommands);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceKeyCollection");
- }
-
- // Add the supported commands to the collection.
- if (hr == S_OK)
- {
- for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_SupportedCommands); dwIndex++)
- {
- hr = pCommands->Add(g_SupportedCommands[dwIndex]);
- CHECK_HR(hr, "Failed to add supported command at index %d", dwIndex);
- if (FAILED(hr))
- {
- break;
- }
- }
- }
-
- // Set the WPD_PROPERTY_CAPABILITIES_SUPPORTED_COMMANDS value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIUnknownValue(WPD_PROPERTY_CAPABILITIES_SUPPORTED_COMMANDS, pCommands);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_CAPABILITIES_SUPPORTED_COMMANDS");
- }
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_CAPABILITIES_GET_COMMAND_OPTIONS
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_CAPABILITIES_COMMAND: a collection of property keys containing a single value,
- * which identifies the specific command options are requested to return.
- *
- * The driver should:
- * - Return an IPortableDeviceValues in WPD_PROPERTY_CAPABILITIES_COMMAND_OPTIONS, containing
- * the relevant options. If no options are available for this command, the driver should
- * return an IPortableDeviceValues with no elements in it.
- */
-HRESULT WpdCapabilities::OnGetCommandOptions(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- PROPERTYKEY Command = WPD_PROPERTY_NULL;
- CComPtr<IPortableDeviceValues> pOptions;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the command whose options have been requested
- if (hr == S_OK)
- {
- hr = pParams->GetKeyValue(WPD_PROPERTY_CAPABILITIES_COMMAND, &Command);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_CAPABILITIES_COMMAND");
- }
-
- // CoCreate a collection to store the command options.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pOptions);
- CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues");
- }
-
- // Add command options to the collection
- if (hr == S_OK)
- {
- // If your driver supports command options, then they should be added here
- // to the command options collection 'pOptions'.
- if (IsEqualPropertyKey(WPD_COMMAND_OBJECT_RESOURCES_READ, Command))
- {
- // For better read performance, tell the API not to provide the input buffer parameter
- // when issuing a WPD_COMMAND_OBJECT_RESOURCES_READ command.
- hr = pOptions->SetBoolValue(WPD_OPTION_OBJECT_RESOURCES_NO_INPUT_BUFFER_ON_READ, TRUE);
- CHECK_HR(hr, "Failed to set WPD_OPTION_OBJECT_RESOURCES_NO_INPUT_BUFFER_ON_READ");
- }
- }
-
- // Set the WPD_PROPERTY_CAPABILITIES_COMMAND_OPTIONS value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIUnknownValue(WPD_PROPERTY_CAPABILITIES_COMMAND_OPTIONS, pOptions);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_CAPABILITIES_COMMAND_OPTIONS");
- }
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_FUNCTIONAL_CATEGORIES
- * command.
- *
- * The parameters sent to us are:
- * - none.
- *
- * The driver should:
- * - Return an IPortableDevicePropVariantCollection (of type VT_CLSID) in
- * WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORIES, containing
- * the supported functional categories for this device.
- */
-HRESULT WpdCapabilities::OnGetFunctionalCategories(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- CComPtr<IPortableDevicePropVariantCollection> pFunctionalCategories;
-
- UNREFERENCED_PARAMETER(pParams);
-
- // CoCreate a collection to store the supported functional categories.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDevicePropVariantCollection,
- (VOID**) &pFunctionalCategories);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDevicePropVariantCollection");
- }
-
- // Add the supported functional categories to the collection.
- if (hr == S_OK)
- {
- for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_SupportedFunctionalCategories); dwIndex++)
- {
- PROPVARIANT pv = {0};
- PropVariantInit(&pv);
- // Don't call PropVariantClear, since we did not allocate the memory for these GUIDs
-
- pv.vt = VT_CLSID;
- pv.puuid = (GUID*) &g_SupportedFunctionalCategories[dwIndex];
-
- hr = pFunctionalCategories->Add(&pv);
- CHECK_HR(hr, "Failed to add supported functional category at index %d", dwIndex);
- if (FAILED(hr))
- {
- break;
- }
- }
- }
-
- // Set the WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORIES value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIUnknownValue(WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORIES, pFunctionalCategories);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORIES");
- }
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_CAPABILITIES_GET_FUNCTIONAL_OBJECTS
- * command. It is sent when the caller is interesting in finding the object IDs for all
- * functional objects belonging to the specified functional category.
- * Note: the number of functional objects is expected to be very small (less than 8 for the
- * whole device).
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORY - a GUID value containing the category
- * the caller is looking for. If the value is WPD_FUNCTIONAL_CATEGORY_ALL, then the driver
- * must return all functional objects, no matter which category they belong to.
- *
- * The driver should:
- * - Return an IPortableDevicePropVariantCollection (of type VT_LPWSTR) in
- * WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_OBJECTS, containing
- * the ids of the functional objects who belong to the specified functional category.
- * If there are no objects in the specified category, the driver should return an
- * empty collection.
- */
-HRESULT WpdCapabilities::OnGetFunctionalObjects(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- GUID guidFunctionalCategory = GUID_NULL;
- CComPtr<IPortableDevicePropVariantCollection> pFunctionalObjects;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the functional category whose functional object identifiers have been requested
- if (hr == S_OK)
- {
- hr = pParams->GetGuidValue(WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORY, &guidFunctionalCategory);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORY");
- }
-
- // CoCreate a collection to store the supported functional object identifiers.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDevicePropVariantCollection,
- (VOID**) &pFunctionalObjects);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDevicePropVariantCollection");
- }
-
- // Add the supported functional object identifiers for the specified functional
- // category to the collection.
- if (hr == S_OK)
- {
- PROPVARIANT pv = {0};
- PropVariantInit(&pv);
- // Don't call PropVariantClear, since we did not allocate the memory for these object identifiers
-
- // Add WPD_DEVICE_OBJECT_ID to the functional object identifiers collection
- if (hr == S_OK)
- {
- if ((guidFunctionalCategory == WPD_FUNCTIONAL_CATEGORY_DEVICE) ||
- (guidFunctionalCategory == WPD_FUNCTIONAL_CATEGORY_ALL))
- {
- pv.vt = VT_LPWSTR;
- pv.pwszVal = WPD_DEVICE_OBJECT_ID;
- hr = pFunctionalObjects->Add(&pv);
- CHECK_HR(hr, "Failed to add device object ID");
- }
- }
-
- // Add STORAGE_OBJECT_ID to the functional object identifiers collection
- if (hr == S_OK)
- {
- if ((guidFunctionalCategory == WPD_FUNCTIONAL_CATEGORY_STORAGE) ||
- (guidFunctionalCategory == WPD_FUNCTIONAL_CATEGORY_ALL))
- {
- pv.vt = VT_LPWSTR;
- pv.pwszVal = STORAGE_OBJECT_ID;
- hr = pFunctionalObjects->Add(&pv);
- CHECK_HR(hr, "Failed to add storage object ID");
- }
- }
- }
-
- // Set the WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_OBJECTS value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIUnknownValue(WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_OBJECTS, pFunctionalObjects);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_OBJECTS");
- }
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_CONTENT_TYPES
- * command. This message is sent when the client needs to know the possible content types supported
- * by the specified functional category.
- * If the driver has multiple functional objects that may support different content types,
- * the driver should simply merge them together and report all possible types in one list here.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORY - a GUID value containing the functional category
- * whose content types the caller is interested in. If the value is WPD_FUNCTIONAL_CATEGORY_ALL, then the driver
- * must return a list of all content types supported by the device.
- *
- * The driver should:
- * - Return an IPortableDevicePropVariantCollection (of type VT_CLSID) in
- * WPD_PROPERTY_CAPABILITIES_CONTENT_TYPES, containing
- * the content types supported by the specified functional category.
- * If there are no objects in the specified category, the driver should return an
- * empty collection.
- */
-HRESULT WpdCapabilities::OnGetSupportedContentTypes(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- GUID guidFunctionalCategory = GUID_NULL;
- CComPtr<IPortableDevicePropVariantCollection> pContentTypes;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the functional category whose supported content types have been requested
- if (hr == S_OK)
- {
- hr = pParams->GetGuidValue(WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORY, &guidFunctionalCategory);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_CAPABILITIES_FUNCTIONAL_CATEGORY");
- }
-
- // CoCreate a collection to store the supported content types.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDevicePropVariantCollection,
- (VOID**) &pContentTypes);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDevicePropVariantCollection");
- }
-
- // Add the supported content types for the specified functional
- // category to the collection.
- if (hr == S_OK)
- {
- PROPVARIANT pv = {0};
- PropVariantInit(&pv);
- // Don't call PropVariantClear, since we did not allocate the memory for these GUIDs
-
- // Add supported content types for known functional categories
- if (guidFunctionalCategory == WPD_FUNCTIONAL_CATEGORY_STORAGE)
- {
- // Add WPD_CONTENT_TYPE_DOCUMENT to the supported content type collection
- pv.vt = VT_CLSID;
- pv.puuid = (CLSID*)&WPD_CONTENT_TYPE_DOCUMENT;
- hr = pContentTypes->Add(&pv);
- CHECK_HR(hr, "Failed to add WPD_CONTENT_TYPE_DOCUMENT");
-
- if (hr == S_OK)
- {
- // Add WPD_CONTENT_TYPE_FOLDER to the supported content type collection
- pv.vt = VT_CLSID;
- pv.puuid = (CLSID*)&WPD_CONTENT_TYPE_FOLDER;
- hr = pContentTypes->Add(&pv);
- CHECK_HR(hr, "Failed to add WPD_CONTENT_TYPE_FOLDER");
- }
- }
- }
-
- // Set the WPD_PROPERTY_CAPABILITIES_CONTENT_TYPES value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIUnknownValue(WPD_PROPERTY_CAPABILITIES_CONTENT_TYPES, pContentTypes);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_CAPABILITIES_CONTENT_TYPES");
- }
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_FORMATS
- * command. This message is sent when the client needs to know the possible formats supported
- * by the specified content type (e.g. for image objects, the driver may choose to support JPEG and BMP files).
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_CAPABILITIES_CONTENT_TYPE - a GUID value containing the content type
- * whose formats the caller is interested in. If the value is WPD_CONTENT_TYPE_ALL, then the driver
- * must return a list of all formats supported by the device.
- *
- * The driver should:
- * - Return an IPortableDevicePropVariantCollection (of type VT_CLSID) in
- * WPD_PROPERTY_CAPABILITIES_FORMATS, indicating the formats supported by the
- * specified content type.
- * If there are no formats supported by the specified content type, the driver should return an
- * empty collection.
- */
-HRESULT WpdCapabilities::OnGetSupportedFormats(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- GUID guidContentType = GUID_NULL;
- CComPtr<IPortableDevicePropVariantCollection> pFormats;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the content type whose supported formats have been requested
- if (hr == S_OK)
- {
- hr = pParams->GetGuidValue(WPD_PROPERTY_CAPABILITIES_CONTENT_TYPE, &guidContentType);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_CAPABILITIES_CONTENT_TYPE");
- }
-
- // CoCreate a collection to store the supported formats.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDevicePropVariantCollection,
- (VOID**) &pFormats);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDevicePropVariantCollection");
- }
-
- // Add the supported formats for the specified content type to the collection.
- if (hr == S_OK)
- {
- PROPVARIANT pv = {0};
- PropVariantInit(&pv);
- // Don't call PropVariantClear, since we did not allocate the memory for these GUIDs
-
- if ((guidContentType == WPD_CONTENT_TYPE_DOCUMENT) ||
- ((guidContentType == WPD_CONTENT_TYPE_ALL)))
- {
- // Add WPD_OBJECT_FORMAT_TEXT to the supported formats collection
- pv.vt = VT_CLSID;
- pv.puuid = (CLSID*)&WPD_OBJECT_FORMAT_TEXT;
- hr = pFormats->Add(&pv);
- CHECK_HR(hr, "Failed to add WPD_OBJECT_FORMAT_TEXT");
- }
- }
-
- // Set the WPD_PROPERTY_CAPABILITIES_FORMATS value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIUnknownValue(WPD_PROPERTY_CAPABILITIES_FORMATS, pFormats);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_CAPABILITIES_FORMATS");
- }
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_FORMAT_PROPERTIES
- * command. This message is sent when the client needs to know the typical properties for objects of
- * a given format.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_CAPABILITIES_FORMAT - a GUID value specifying the format the caller is interested in.
- *
- * The driver should:
- * - Return an IPortableDeviceKeyCollection in WPD_PROPERTY_CAPABILITIES_PROPERTY_KEYS,
- * containing the property keys.
- */
-HRESULT WpdCapabilities::OnGetSupportedFormatProperties(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- GUID guidObjectFormat = GUID_NULL;
- CComPtr<IPortableDeviceKeyCollection> pKeys;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the object format whose supported properties have been requested
- if (hr == S_OK)
- {
- hr = pParams->GetGuidValue(WPD_PROPERTY_CAPABILITIES_FORMAT, &guidObjectFormat);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_CAPABILITIES_FORMAT");
- }
-
- // CoCreate a collection to store the supported properties.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceKeyCollection,
- (VOID**) &pKeys);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceKeyCollection");
- }
-
- // Add the supported properties for the specified object format to the collection.
- if (hr == S_OK)
- {
- hr = AddSupportedPropertyKeys(guidObjectFormat, pKeys);
- CHECK_HR(hr, "Failed to get supported properties for a format");
- }
-
- // Set the WPD_PROPERTY_CAPABILITIES_PROPERTY_KEYS value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIPortableDeviceKeyCollectionValue(WPD_PROPERTY_CAPABILITIES_PROPERTY_KEYS, pKeys);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_CAPABILITIES_PROPERTY_KEYS");
- }
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_CAPABILITIES_GET_FIXED_PROPERTY_ATTRIBUTES
- * command. This message is sent when the client needs to know the property attributes that
- * are the same for all objects of the given format.
- *
- * Typically, a driver treats objects of a given format the same. Many properties therefore will
- * have attributes that are identical across all objects of that format.
- * These can be returned here. There are some attributes which may be differ per object instance,
- * which are not returned here.
- * See WPD_COMMAND_OBJECT_PROPERTIES_GET_ATTRIBUTES.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_CAPABILITIES_FORMAT - a GUID value specifying the format the caller is interested in.
- * - WPD_PROPERTY_CAPABILITIES_PROPERTY_KEYS - a collection of property keys containing a single value,
- * which is the key identifying the specific property attributes we are requested to return.
- *
- * The driver should:
- * - Return an IPortableDeviceValues in WPD_PROPERTY_CAPABILITIES_PROPERTY_ATTRIBUTES
- * containing the fixed property attributes.
- */
-HRESULT WpdCapabilities::OnGetFixedPropertyAttributes(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- GUID guidObjectFormat = GUID_NULL;
- PROPERTYKEY key = WPD_PROPERTY_NULL;
- CComPtr<IPortableDeviceValues> pAttributes;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the object format whose fixed property attributes have been requested
- if (hr == S_OK)
- {
- hr = pParams->GetGuidValue(WPD_PROPERTY_CAPABILITIES_FORMAT, &guidObjectFormat);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_CAPABILITIES_FORMAT");
- }
-
- // Get the property whose fixed property attributes have been requested
- if(hr == S_OK)
- {
- hr = pParams->GetKeyValue(WPD_PROPERTY_CAPABILITIES_PROPERTY_KEYS, &key);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_CAPABILITIES_PROPERTY_KEYS");
- }
-
- // CoCreate a collection to store the fixed property attributes.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pAttributes);
- CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues");
- }
-
- // Add the fixed property attributes for the specified object format and property
- if (hr == S_OK)
- {
- hr = GetFixedPropertyAttributesForFormat(guidObjectFormat, key, pAttributes);
- CHECK_HR(hr, "Failed to get fixed property attributes");
- }
-
- // Set the WPD_PROPERTY_CAPABILITIES_PROPERTY_ATTRIBUTES value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIPortableDeviceValuesValue(WPD_PROPERTY_CAPABILITIES_PROPERTY_ATTRIBUTES, pAttributes);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_CAPABILITIES_PROPERTY_ATTRIBUTES");
- }
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_CAPABILITIES_GET_SUPPORTED_EVENTS
- * command.
- *
- * The parameters sent to us are:
- * - none.
- *
- * The driver should:
- * - Return all events supported by this driver should be returned as an
- * IPortableDeviceKeyCollection in WPD_PROPERTY_CAPABILITIES_SUPPORTED_EVENTS.
- * That includes custom commands, if any.
- */
-HRESULT WpdCapabilities::OnGetSupportedEvents(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- CComPtr<IPortableDevicePropVariantCollection> pEvents;
- UNREFERENCED_PARAMETER(pParams);
-
- // CoCreate a collection to store the supported events.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDevicePropVariantCollection,
- (VOID**) &pEvents);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDevicePropVariantCollection");
- }
-
- // Add the supported events to the collection.
- if (hr == S_OK)
- {
- // If your driver supports events, then they should be added here
- // to the supported events collection 'pEvents'.
- }
-
- // Set the WPD_PROPERTY_CAPABILITIES_SUPPORTED_EVENTS value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIUnknownValue(WPD_PROPERTY_CAPABILITIES_SUPPORTED_EVENTS, pEvents);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_CAPABILITIES_SUPPORTED_EVENTS");
- }
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_CAPABILITIES_GET_EVENT_OPTIONS
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_CAPABILITIES_EVENT: a GUID value indicating the Event whose options should be returned.
- *
- * The driver should:
- * - Return an IPortableDeviceValues in WPD_PROPERTY_CAPABILITIES_EVENT_OPTIONS, containing
- * the relevant options.
- */
-HRESULT WpdCapabilities::OnGetEventOptions(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- GUID Event = GUID_NULL;
- CComPtr<IPortableDeviceValues> pOptions;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the event whose options have been requested
- if (hr == S_OK)
- {
- hr = pParams->GetGuidValue(WPD_PROPERTY_CAPABILITIES_EVENT, &Event);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_CAPABILITIES_EVENT");
- }
-
- // CoCreate a collection to store the event options.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pOptions);
- CHECK_HR(hr, "Failed to CoCreateInstance CLSID_PortableDeviceValues");
- }
-
- // Add event options to the collection
- if (hr == S_OK)
- {
- // If your driver supports event options, then they should be added here
- // to the event options collection 'pOptions'.
- }
-
- // Set the WPD_PROPERTY_CAPABILITIES_EVENT_OPTIONS value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIUnknownValue(WPD_PROPERTY_CAPABILITIES_EVENT_OPTIONS, pOptions);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_CAPABILITIES_EVENT_OPTIONS");
- }
-
- return hr;
-}
-
-/**
- * This method is called to populate supported PROPERTYKEYs for the
- * specified object format.
- *
- * The parameters sent to us are:
- * guidObjectFormat - object format whose supported properties are being requested.
- * pKeys - An IPortableDeviceKeyCollection to be populated with PROPERTYKEYs
- *
- * The driver should:
- * Add supported PROPERTYKEYs pertaining to the specified object format.
- */
-HRESULT WpdCapabilities::AddSupportedPropertyKeys(
- _In_ REFGUID guidObjectFormat,
- _In_ IPortableDeviceKeyCollection* pKeys)
-{
- HRESULT hr = S_OK;
-
- if (pKeys == NULL)
- {
- hr = E_INVALIDARG;
- return hr;
- }
-
- if (guidObjectFormat == WPD_OBJECT_FORMAT_TEXT)
- {
- AddCommonPropertyKeys(pKeys);
- AddFilePropertyKeys(pKeys);
- }
- else if (guidObjectFormat == WPD_OBJECT_FORMAT_ALL)
- {
- AddCommonPropertyKeys(pKeys);
- }
-
- return hr;
-}
-
-/**
- * This method is called to populate fixed property attributes
- *
- * The parameters sent to us are:
- * guidObjectFormat - the object format whose property attributes are being requested.
- * Key - the property whose attributes are being requested
- * pAttributes - an IPortableDeviceValues which will contain the resulting property attributes
- *
- * The driver should:
- * Read the property attributes for the specified property for the specified object format and
- * populate pAttributes with the results.
- */
-HRESULT WpdCapabilities::GetFixedPropertyAttributesForFormat(
- _In_ REFGUID guidObjectFormat,
- _In_ REFPROPERTYKEY Key,
- _In_ IPortableDeviceValues* pAttributes)
-{
- HRESULT hr = S_OK;
-
- if (pAttributes == NULL)
- {
- hr = E_INVALIDARG;
- return hr;
- }
-
- UNREFERENCED_PARAMETER(guidObjectFormat);
- UNREFERENCED_PARAMETER(Key);
-
- //
- // Since ALL of our properties have the same attributes, we are ignoring the
- // passed in guidObjectFormat and Key parameters. These parameters allow you to
- // customize fixed property attributes for properties for specific formats.
- //
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_DELETE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_DELETE");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_READ, TRUE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_READ");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_WRITE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_WRITE");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_FAST_PROPERTY, TRUE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_FAST_PROPERTY");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetUnsignedIntegerValue(WPD_PROPERTY_ATTRIBUTE_FORM, WPD_PROPERTY_ATTRIBUTE_FORM_UNSPECIFIED);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_FORM");
- }
-
- return hr;
-}
-
diff --git a/wpd/WpdMultiTransportDriver/WpdCapabilities.h b/wpd/WpdMultiTransportDriver/WpdCapabilities.h
deleted file mode 100644
index ef2902ef..00000000
--- a/wpd/WpdMultiTransportDriver/WpdCapabilities.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#pragma once
-
-class WpdCapabilities
-{
-public:
- WpdCapabilities();
- virtual ~WpdCapabilities();
-
- HRESULT Initialize();
-
- HRESULT DispatchWpdMessage(
- _In_ REFPROPERTYKEY Command,
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetSupportedCommands(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetCommandOptions(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetFunctionalCategories(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetFunctionalObjects(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetSupportedContentTypes(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetSupportedFormats(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetSupportedFormatProperties(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetFixedPropertyAttributes(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetSupportedEvents(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetEventOptions(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
-private:
- HRESULT AddSupportedPropertyKeys(_In_ REFGUID guidObjectFormat,
- _In_ IPortableDeviceKeyCollection* pKeys);
-
- HRESULT GetFixedPropertyAttributesForFormat(_In_ REFGUID guidObjectFormat,
- _In_ REFPROPERTYKEY Key,
- _In_ IPortableDeviceValues* pAttributes);
-};
-
diff --git a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.cpp b/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.cpp
deleted file mode 100644
index d027ba72..00000000
--- a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-#include "stdafx.h"
-#include "resource.h"
-#include "WpdMultiTransportDriver.h"
-
-#include "WpdMultiTransportDriver.tmh"
-
-HINSTANCE g_hInstance = NULL;
-
-class CWpdMultiTransportDriverModule : public CAtlDllModuleT< CWpdMultiTransportDriverModule >
-{
-public :
- DECLARE_REGISTRY_APPID_RESOURCEID(IDR_WpdMultiTransportDriver, "{72D557A2-0914-454F-83A0-350530788B62}")
- DECLARE_LIBID(LIBID_WpdMultiTransportDriverLib)
-};
-
-CWpdMultiTransportDriverModule _AtlModule;
-
-// DLL Entry Point
-extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
-{
- if(dwReason == DLL_PROCESS_ATTACH)
- {
- g_hInstance = hInstance;
- // Initialize tracing.
- WPP_INIT_TRACING(MYDRIVER_TRACING_ID);
- }
- else if (dwReason == DLL_PROCESS_DETACH)
- {
- // Cleanup tracing.
- WPP_CLEANUP();
- }
-
- return _AtlModule.DllMain(dwReason, lpReserved);
-}
-
-// Used to determine whether the DLL can be unloaded by OLE
-STDAPI DllCanUnloadNow(void)
-{
- return _AtlModule.DllCanUnloadNow();
-}
-
-// Returns a class factory to create an object of the requested type
-STDAPI DllGetClassObject(_In_ REFCLSID rclsid, _In_ REFIID riid, _Outptr_ LPVOID* ppv)
-{
- return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
-}
-
-// DllRegisterServer - Adds entries to the system registry
-STDAPI DllRegisterServer(void)
-{
- // registers object, typelib and all interfaces in typelib
- HRESULT hr = _AtlModule.DllRegisterServer();
- return hr;
-}
-
-// DllUnregisterServer - Removes entries from the system registry
-STDAPI DllUnregisterServer(void)
-{
- HRESULT hr = _AtlModule.DllUnregisterServer();
- return hr;
-}
diff --git a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.def b/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.def
deleted file mode 100644
index 2ee10614..00000000
--- a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.def
+++ /dev/null
@@ -1,9 +0,0 @@
-; WpdMultiTransportDriver.def : Declares the module parameters.
-
-LIBRARY "WpdMultiTransportDriver.DLL"
-
-EXPORTS
- DllCanUnloadNow PRIVATE
- DllGetClassObject PRIVATE
- DllRegisterServer PRIVATE
- DllUnregisterServer PRIVATE
diff --git a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.idl b/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.idl
deleted file mode 100644
index 6b615e8f..00000000
--- a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.idl
+++ /dev/null
@@ -1,24 +0,0 @@
-
-import "oaidl.idl";
-import "ocidl.idl";
-
-import "wudfddi.idl";
-
-[
- uuid(EE383031-D737-45FD-BE5F-9A2EFE863627),
- version(1.0),
- helpstring("Windows Portable Device Multi-Transport Sample Driver Type Library")
-]
-library WpdMultiTransportDriverLib
-{
- importlib("stdole2.tlb");
- [
- uuid(0CA6D3F4-9C49-4B81-BA8F-98F43AE6E592),
- helpstring("WpdMultiTransportDriver Class")
- ]
- coclass WpdMultiTransportDriver
- {
- [default] interface IDriverEntry;
- };
-};
-
diff --git a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.inx b/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.inx
deleted file mode 100644
index 5e20c4c3..00000000
--- a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.inx
+++ /dev/null
@@ -1,84 +0,0 @@
-;
-; WpdMultiTransportDriver.inf
-;
-
-[Version]
-Signature="$Windows NT$"
-Class=WPD
-ClassGuid={EEC5AD98-8080-425f-922A-DABF3DE3F69A}
-Provider=%Provider%
-CatalogFile=WpdMultiTransportDriver.cat
-DriverVer=01/24/2005,1.1.1.1
-
-[Manufacturer]
-%Mfg%=Standard,NT$ARCH$
-
-[Standard.NT$ARCH$]
-%BasicDeviceName%=Basic_Install,WUDF\MultiTransport
-
-[SourceDisksFiles]
-WudfUpdate_$UMDFCOINSTALLERVERSION$.dll=1
-WpdMultiTransportDriver.dll=1
-
-[SourceDisksNames]
-1 = %MediaDescription%
-
-; =================== WPD Sample Device ==================================
-
-[Basic_Install]
-CopyFiles=System32Copy
-
-[Basic_Install.hw]
-AddReg=Device_AddReg
-
-[Basic_Install.Services]
-AddService=WUDFRd,0x000001fa,WUDFRD_ServiceInstall
-
-[Basic_Install.CoInstallers]
-AddReg=Basic_Install.CoInstallers_AddReg
-CopyFiles = CoInstallers_CopyFiles
-
-[Basic_Install.CoInstallers_AddReg]
-HKR,,CoInstallers32,0x00010000,"WudfUpdate_$UMDFCOINSTALLERVERSION$.dll"
-
-[Basic_Install.Wdf]
-UmdfService=WpdMultiTransportDriver, WpdMultiTransportDriver_Install
-UmdfServiceOrder=WpdMultiTransportDriver
-UmdfKernelModeClientPolicy=AllowKernelModeClients
-
-[CoInstallers_CopyFiles]
-WudfUpdate_$UMDFCOINSTALLERVERSION$.dll
-
-[WpdMultiTransportDriver_Install]
-UmdfLibraryVersion=$UMDFVERSION$
-DriverCLSID="{0CA6D3F4-9C49-4B81-BA8F-98F43AE6E592}"
-ServiceBinary=%12%\UMDF\WpdMultiTransportDriver.dll
-
-[Device_AddReg]
-; Enable WIA support for legacy WIA applications
-HKR,,"EnableLegacySupport",0x10001,1
-
-; Enable default AutoPlay support
-HKR,,"EnableDefaultAutoPlaySupport",0x10001,1
-
-[WUDFRD_ServiceInstall]
-ServiceType=1
-StartType=3
-ErrorControl=1
-ServiceBinary=%12%\WUDFRd.sys
-
-[DestinationDirs]
-System32Copy=12,UMDF ; copy to system32\drivers\umdf
-CoInstallers_CopyFiles= 11
-
-[System32Copy]
-WpdMultiTransportDriver.dll
-
-
-; =================== Generic ==================================
-
-[Strings]
-Provider="TODO-Set-Provider"
-Mfg="Windows Portable Devices"
-MediaDescription="Windows Portable Device Multi-Transport Sample Driver Installation Media"
-BasicDeviceName="Windows Portable Device Multi-Transport Sample Driver"
diff --git a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.rc b/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.rc
deleted file mode 100644
index c7b89e95..00000000
--- a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.rc
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "resource.h"
-#include <windows.h>
-#include <ntverp.h>
-
-#define VER_FILETYPE VFT_DLL
-#define VER_FILESUBTYPE VFT2_UNKNOWN
-#define VER_FILEDESCRIPTION_STR "Windows Portable Device Multi-Transport Sample Driver"
-#define VER_INTERNALNAME_STR "WpdMultiTransportDriver.dll"
-
-#include <common.ver>
-
-1 TYPELIB "WpdMultiTransportDriver.tlb"
-
-IDR_WpdMultiTransportDriver REGISTRY "WpdMultiTransportDriver.rgs"
-
diff --git a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.rgs b/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.rgs
deleted file mode 100644
index 3bd8066c..00000000
--- a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.rgs
+++ /dev/null
@@ -1,26 +0,0 @@
-HKCR
-{
- WpdMultiTransportDriver.WpdMultiTransportDriver.1 = s 'WpdMultiTransportDriver Class'
- {
- CLSID = s '{0CA6D3F4-9C49-4B81-BA8F-98F43AE6E592}'
- }
- WpdMultiTransportDriver.WpdMultiTransportDriver = s 'WpdMultiTransportDriver Class'
- {
- CLSID = s '{0CA6D3F4-9C49-4B81-BA8F-98F43AE6E592}'
- CurVer = s 'WpdMultiTransportDriver.WpdMultiTransportDriver.1'
- }
- NoRemove CLSID
- {
- ForceRemove {0CA6D3F4-9C49-4B81-BA8F-98F43AE6E592} = s 'WpdMultiTransportDriver Class'
- {
- ProgID = s 'WpdMultiTransportDriver.WpdMultiTransportDriver.1'
- VersionIndependentProgID = s 'WpdMultiTransportDriver.WpdMultiTransportDriver.1'
- InprocServer32 = s '%MODULE%'
- {
- val ThreadingModel = s 'Free'
- }
- 'TypeLib' = s '{EE383031-D737-45FD-BE5F-9A2EFE863627}'
- }
- }
-}
-
diff --git a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.sln b/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.sln
deleted file mode 100644
index d978d35e..00000000
--- a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.sln
+++ /dev/null
@@ -1,28 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0
-MinimumVisualStudioVersion = 12.0
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WpdMultiTransportDriver", "WpdMultiTransportDriver.vcxproj", "{19B0E3C8-853C-47E1-81BA-5E9003B685C8}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- Debug|x64 = Debug|x64
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {19B0E3C8-853C-47E1-81BA-5E9003B685C8}.Debug|Win32.ActiveCfg = Debug|Win32
- {19B0E3C8-853C-47E1-81BA-5E9003B685C8}.Debug|Win32.Build.0 = Debug|Win32
- {19B0E3C8-853C-47E1-81BA-5E9003B685C8}.Release|Win32.ActiveCfg = Release|Win32
- {19B0E3C8-853C-47E1-81BA-5E9003B685C8}.Release|Win32.Build.0 = Release|Win32
- {19B0E3C8-853C-47E1-81BA-5E9003B685C8}.Debug|x64.ActiveCfg = Debug|x64
- {19B0E3C8-853C-47E1-81BA-5E9003B685C8}.Debug|x64.Build.0 = Debug|x64
- {19B0E3C8-853C-47E1-81BA-5E9003B685C8}.Release|x64.ActiveCfg = Release|x64
- {19B0E3C8-853C-47E1-81BA-5E9003B685C8}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.vcxproj b/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.vcxproj
deleted file mode 100644
index 4ba4e066..00000000
--- a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.vcxproj
+++ /dev/null
@@ -1,355 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{19B0E3C8-853C-47E1-81BA-5E9003B685C8}</ProjectGuid>
- <RootNamespace>$(MSBuildProjectName)</RootNamespace>
- <UMDF_VERSION_MAJOR>1</UMDF_VERSION_MAJOR>
- <KMDF_VERSION_MAJOR>1</KMDF_VERSION_MAJOR>
- <Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
- <Platform Condition="'$(Platform)' == ''">Win32</Platform>
- <SampleGuid>{52BF4ED8-1D47-455D-A68B-4EB5A520D156}</SampleGuid>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <TargetVersion>Windows10</TargetVersion>
- <UseDebugLibraries>False</UseDebugLibraries>
- <DriverTargetPlatform>Desktop</DriverTargetPlatform>
- <DriverType>UMDF</DriverType>
- <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
- <ConfigurationType>DynamicLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <TargetVersion>Windows10</TargetVersion>
- <UseDebugLibraries>True</UseDebugLibraries>
- <DriverTargetPlatform>Desktop</DriverTargetPlatform>
- <DriverType>UMDF</DriverType>
- <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
- <ConfigurationType>DynamicLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <TargetVersion>Windows10</TargetVersion>
- <UseDebugLibraries>False</UseDebugLibraries>
- <DriverTargetPlatform>Desktop</DriverTargetPlatform>
- <DriverType>UMDF</DriverType>
- <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
- <ConfigurationType>DynamicLibrary</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <TargetVersion>Windows10</TargetVersion>
- <UseDebugLibraries>True</UseDebugLibraries>
- <DriverTargetPlatform>Desktop</DriverTargetPlatform>
- <DriverType>UMDF</DriverType>
- <PlatformToolset>WindowsUserModeDriver10.0</PlatformToolset>
- <ConfigurationType>DynamicLibrary</ConfigurationType>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <PropertyGroup>
- <OutDir>$(IntDir)</OutDir>
- </PropertyGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
- </ImportGroup>
- <ItemGroup Label="WrappedTaskItems">
- <ClCompile Include="WpdMultiTransportDriver.cpp">
- <WppEnabled>true</WppEnabled>
- <WppDllMacro>true</WppDllMacro>
- <WppScanConfigurationData>stdafx.h</WppScanConfigurationData>
- <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreCompiledHeaderFile>Stdafx.h</PreCompiledHeaderFile>
- <PreCompiledHeader>Use</PreCompiledHeader>
- <PreCompiledHeaderOutputFile>$(IntDir)\Stdafx.h.pch</PreCompiledHeaderOutputFile>
- </ClCompile>
- <ClCompile Include="Driver.cpp">
- <WppEnabled>true</WppEnabled>
- <WppDllMacro>true</WppDllMacro>
- <WppScanConfigurationData>stdafx.h</WppScanConfigurationData>
- <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreCompiledHeaderFile>Stdafx.h</PreCompiledHeaderFile>
- <PreCompiledHeader>Use</PreCompiledHeader>
- <PreCompiledHeaderOutputFile>$(IntDir)\Stdafx.h.pch</PreCompiledHeaderOutputFile>
- </ClCompile>
- <ClCompile Include="Device.cpp">
- <WppEnabled>true</WppEnabled>
- <WppDllMacro>true</WppDllMacro>
- <WppScanConfigurationData>stdafx.h</WppScanConfigurationData>
- <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreCompiledHeaderFile>Stdafx.h</PreCompiledHeaderFile>
- <PreCompiledHeader>Use</PreCompiledHeader>
- <PreCompiledHeaderOutputFile>$(IntDir)\Stdafx.h.pch</PreCompiledHeaderOutputFile>
- </ClCompile>
- <ClCompile Include="Queue.cpp">
- <WppEnabled>true</WppEnabled>
- <WppDllMacro>true</WppDllMacro>
- <WppScanConfigurationData>stdafx.h</WppScanConfigurationData>
- <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreCompiledHeaderFile>Stdafx.h</PreCompiledHeaderFile>
- <PreCompiledHeader>Use</PreCompiledHeader>
- <PreCompiledHeaderOutputFile>$(IntDir)\Stdafx.h.pch</PreCompiledHeaderOutputFile>
- </ClCompile>
- <ClCompile Include="WpdBaseDriver.cpp">
- <WppEnabled>true</WppEnabled>
- <WppDllMacro>true</WppDllMacro>
- <WppScanConfigurationData>stdafx.h</WppScanConfigurationData>
- <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreCompiledHeaderFile>Stdafx.h</PreCompiledHeaderFile>
- <PreCompiledHeader>Use</PreCompiledHeader>
- <PreCompiledHeaderOutputFile>$(IntDir)\Stdafx.h.pch</PreCompiledHeaderOutputFile>
- </ClCompile>
- <ClCompile Include="WpdObjectEnum.cpp">
- <WppEnabled>true</WppEnabled>
- <WppDllMacro>true</WppDllMacro>
- <WppScanConfigurationData>stdafx.h</WppScanConfigurationData>
- <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreCompiledHeaderFile>Stdafx.h</PreCompiledHeaderFile>
- <PreCompiledHeader>Use</PreCompiledHeader>
- <PreCompiledHeaderOutputFile>$(IntDir)\Stdafx.h.pch</PreCompiledHeaderOutputFile>
- </ClCompile>
- <ClCompile Include="WpdObjectProperties.cpp">
- <WppEnabled>true</WppEnabled>
- <WppDllMacro>true</WppDllMacro>
- <WppScanConfigurationData>stdafx.h</WppScanConfigurationData>
- <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreCompiledHeaderFile>Stdafx.h</PreCompiledHeaderFile>
- <PreCompiledHeader>Use</PreCompiledHeader>
- <PreCompiledHeaderOutputFile>$(IntDir)\Stdafx.h.pch</PreCompiledHeaderOutputFile>
- </ClCompile>
- <ClCompile Include="WpdObjectResources.cpp">
- <WppEnabled>true</WppEnabled>
- <WppDllMacro>true</WppDllMacro>
- <WppScanConfigurationData>stdafx.h</WppScanConfigurationData>
- <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreCompiledHeaderFile>Stdafx.h</PreCompiledHeaderFile>
- <PreCompiledHeader>Use</PreCompiledHeader>
- <PreCompiledHeaderOutputFile>$(IntDir)\Stdafx.h.pch</PreCompiledHeaderOutputFile>
- </ClCompile>
- <ClCompile Include="WpdCapabilities.cpp">
- <WppEnabled>true</WppEnabled>
- <WppDllMacro>true</WppDllMacro>
- <WppScanConfigurationData>stdafx.h</WppScanConfigurationData>
- <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreCompiledHeaderFile>Stdafx.h</PreCompiledHeaderFile>
- <PreCompiledHeader>Use</PreCompiledHeader>
- <PreCompiledHeaderOutputFile>$(IntDir)\Stdafx.h.pch</PreCompiledHeaderOutputFile>
- </ClCompile>
- <Inf Include="WpdMultiTransportDriver.inx">
- <Architecture>$(InfArch)</Architecture>
- <SpecifyArchitecture>true</SpecifyArchitecture>
- <CopyOutput>.\$(IntDir)\WpdMultiTransportDriver.inf</CopyOutput>
- </Inf>
- <OtherWpp Include="WpdMultiTransportDriver.rc; WpdMultiTransportDriver.idl">
- <WppEnabled>true</WppEnabled>
- <WppDllMacro>true</WppDllMacro>
- <WppScanConfigurationData>stdafx.h</WppScanConfigurationData>
- </OtherWpp>
- </ItemGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <TargetName>WpdMultiTransportDriver</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <TargetName>WpdMultiTransportDriver</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <TargetName>WpdMultiTransportDriver</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <TargetName>WpdMultiTransportDriver</TargetName>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Link>
- <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol>
- <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Link>
- <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol>
- <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Link>
- <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol>
- <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Link>
- <EntryPointSymbol Condition="'$(Platform)'=='win32'">_DllMainCRTStartup@12</EntryPointSymbol>
- <EntryPointSymbol Condition="'$(Platform)'!='win32'">_DllMainCRTStartup</EntryPointSymbol>
- </Link>
- </ItemDefinitionGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <UseOfAtl>Dynamic</UseOfAtl>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <UseOfAtl>Dynamic</UseOfAtl>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <UseOfAtl>Dynamic</UseOfAtl>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <UseOfAtl>Dynamic</UseOfAtl>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <ClCompile>
- <TreatWarningAsError>true</TreatWarningAsError>
- <WarningLevel>Level4</WarningLevel>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </ClCompile>
- <ResourceCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </ResourceCompile>
- <Midl>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </Midl>
- <Link>
- <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)\strsafe.lib;$(SDK_LIB_PATH)\kernel32.lib;$(SDK_LIB_PATH)\ole32.lib;$(SDK_LIB_PATH)\oleaut32.lib;$(SDK_LIB_PATH)\uuid.lib;$(SDK_LIB_PATH)\user32.lib;$(SDK_LIB_PATH)\advapi32.lib;$(SDK_LIB_PATH)\shlwapi.lib;$(SDK_LIB_PATH)\PortableDeviceGuids.lib</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <ClCompile>
- <TreatWarningAsError>true</TreatWarningAsError>
- <WarningLevel>Level4</WarningLevel>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </ClCompile>
- <ResourceCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </ResourceCompile>
- <Midl>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </Midl>
- <Link>
- <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)\strsafe.lib;$(SDK_LIB_PATH)\kernel32.lib;$(SDK_LIB_PATH)\ole32.lib;$(SDK_LIB_PATH)\oleaut32.lib;$(SDK_LIB_PATH)\uuid.lib;$(SDK_LIB_PATH)\user32.lib;$(SDK_LIB_PATH)\advapi32.lib;$(SDK_LIB_PATH)\shlwapi.lib;$(SDK_LIB_PATH)\PortableDeviceGuids.lib</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <TreatWarningAsError>true</TreatWarningAsError>
- <WarningLevel>Level4</WarningLevel>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </ClCompile>
- <ResourceCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </ResourceCompile>
- <Midl>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </Midl>
- <Link>
- <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)\strsafe.lib;$(SDK_LIB_PATH)\kernel32.lib;$(SDK_LIB_PATH)\ole32.lib;$(SDK_LIB_PATH)\oleaut32.lib;$(SDK_LIB_PATH)\uuid.lib;$(SDK_LIB_PATH)\user32.lib;$(SDK_LIB_PATH)\advapi32.lib;$(SDK_LIB_PATH)\shlwapi.lib;$(SDK_LIB_PATH)\PortableDeviceGuids.lib</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <TreatWarningAsError>true</TreatWarningAsError>
- <WarningLevel>Level4</WarningLevel>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </ClCompile>
- <ResourceCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </ResourceCompile>
- <Midl>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SDK_INC_PATH);$(DDK_INC_PATH)</AdditionalIncludeDirectories>
- </Midl>
- <Link>
- <AdditionalDependencies>%(AdditionalDependencies);$(SDK_LIB_PATH)\strsafe.lib;$(SDK_LIB_PATH)\kernel32.lib;$(SDK_LIB_PATH)\ole32.lib;$(SDK_LIB_PATH)\oleaut32.lib;$(SDK_LIB_PATH)\uuid.lib;$(SDK_LIB_PATH)\user32.lib;$(SDK_LIB_PATH)\advapi32.lib;$(SDK_LIB_PATH)\shlwapi.lib;$(SDK_LIB_PATH)\PortableDeviceGuids.lib</AdditionalDependencies>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Link>
- <ModuleDefinitionFile>WpdMultiTransportDriver.def</ModuleDefinitionFile>
- </Link>
- <ClCompile>
- <ExceptionHandling>
- </ExceptionHandling>
- </ClCompile>
- <DriverSign>
- <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
- </DriverSign>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Link>
- <ModuleDefinitionFile>WpdMultiTransportDriver.def</ModuleDefinitionFile>
- </Link>
- <ClCompile>
- <ExceptionHandling>
- </ExceptionHandling>
- </ClCompile>
- <DriverSign>
- <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
- </DriverSign>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Link>
- <ModuleDefinitionFile>WpdMultiTransportDriver.def</ModuleDefinitionFile>
- </Link>
- <ClCompile>
- <ExceptionHandling>
- </ExceptionHandling>
- </ClCompile>
- <DriverSign>
- <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
- </DriverSign>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Link>
- <ModuleDefinitionFile>WpdMultiTransportDriver.def</ModuleDefinitionFile>
- </Link>
- <ClCompile>
- <ExceptionHandling>
- </ExceptionHandling>
- </ClCompile>
- <DriverSign>
- <FileDigestAlgorithm>sha256</FileDigestAlgorithm>
- </DriverSign>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="Stdafxsrc.cpp">
- <AdditionalIncludeDirectories>;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <PreCompiledHeaderFile>Stdafx.h</PreCompiledHeaderFile>
- <PreCompiledHeader>Create</PreCompiledHeader>
- <PreCompiledHeaderOutputFile>$(IntDir)\Stdafx.h.pch</PreCompiledHeaderOutputFile>
- </ClCompile>
- <Midl Include="WpdMultiTransportDriver.idl" />
- <ResourceCompile Include="WpdMultiTransportDriver.rc" />
- </ItemGroup>
- <ItemGroup>
- <Inf Exclude="@(Inf)" Include="*.inf" />
- <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" />
- </ItemGroup>
- <ItemGroup>
- <None Exclude="@(None)" Include="*.txt;*.htm;*.html" />
- <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" />
- <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-</Project> \ No newline at end of file
diff --git a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.vcxproj.Filters b/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.vcxproj.Filters
deleted file mode 100644
index 2c61aa74..00000000
--- a/wpd/WpdMultiTransportDriver/WpdMultiTransportDriver.vcxproj.Filters
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions>
- <UniqueIdentifier>{579501AE-BAA7-446C-80E9-F1268F7B5ECE}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files">
- <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
- <UniqueIdentifier>{6A931571-7293-41DC-9CD7-5C971281A12C}</UniqueIdentifier>
- </Filter>
- <Filter Include="Resource Files">
- <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions>
- <UniqueIdentifier>{6C10CC65-5006-46E6-8E6E-30757F853D90}</UniqueIdentifier>
- </Filter>
- <Filter Include="Driver Files">
- <Extensions>inf;inv;inx;mof;mc;</Extensions>
- <UniqueIdentifier>{33EDBFAB-833D-4375-9867-6848F1C9E425}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="Device.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="Driver.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="Queue.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="Stdafxsrc.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="WpdBaseDriver.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="WpdCapabilities.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="WpdMultiTransportDriver.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="WpdObjectEnum.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="WpdObjectProperties.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="WpdObjectResources.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <Midl Include="WpdMultiTransportDriver.idl">
- <Filter>Source Files</Filter>
- </Midl>
- <None Include="WpdMultiTransportDriver.def">
- <Filter>Source Files</Filter>
- </None>
- </ItemGroup>
- <ItemGroup>
- <Inf Include="WpdMultiTransportDriver.inx">
- <Filter>Driver Files</Filter>
- </Inf>
- </ItemGroup>
- <ItemGroup>
- <ResourceCompile Include="WpdMultiTransportDriver.rc">
- <Filter>Resource Files</Filter>
- </ResourceCompile>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="WpdObjectResources.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/wpd/WpdMultiTransportDriver/WpdObjectEnum.cpp b/wpd/WpdMultiTransportDriver/WpdObjectEnum.cpp
deleted file mode 100644
index 1fb4cab3..00000000
--- a/wpd/WpdMultiTransportDriver/WpdObjectEnum.cpp
+++ /dev/null
@@ -1,416 +0,0 @@
-#include "stdafx.h"
-#include "WpdObjectEnum.tmh"
-
-WpdObjectEnumerator::WpdObjectEnumerator()
-{
-
-}
-
-WpdObjectEnumerator::~WpdObjectEnumerator()
-{
-
-}
-
-HRESULT WpdObjectEnumerator::DispatchWpdMessage(_In_ REFPROPERTYKEY Command,
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
-
- if (Command.fmtid != WPD_CATEGORY_OBJECT_ENUMERATION)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "This object does not support this command category %ws",CComBSTR(Command.fmtid));
- }
-
- if (hr == S_OK)
- {
- if (Command.pid == WPD_COMMAND_OBJECT_ENUMERATION_START_FIND.pid)
- {
- hr = OnStartFind(pParams, pResults);
- CHECK_HR(hr, "Failed to begin enumeration");
- }
- else if (Command.pid == WPD_COMMAND_OBJECT_ENUMERATION_FIND_NEXT.pid)
- {
- hr = OnFindNext(pParams, pResults);
- if(FAILED(hr))
- {
- CHECK_HR(hr, "Failed to find next object");
- }
- }
- else if (Command.pid == WPD_COMMAND_OBJECT_ENUMERATION_END_FIND.pid)
- {
- hr = OnEndFind(pParams, pResults);
- CHECK_HR(hr, "Failed to end enumeration");
- }
- else
- {
- hr = E_NOTIMPL;
- CHECK_HR(hr, "This object does not support this command id %d", Command.pid);
- }
- }
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_ENUMERATION_START_FIND
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_ENUMERATION_PARENT_ID: the parent where we should start
- * the enumeration.
- * - WPD_PROPERTY_OBJECT_ENUMERATION_FILTER: the filter to use when doing
- * enumeration. Since this parameter is optional, it may not exist.
- * This driver currently ignores the filter parameter.
- *
- * The driver should:
- * - Create a new context for this enumeration.
- * - Set the string identifier in WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT for the newly created enumeration context.
- * This value will be passed back during OnFindNext and OnEndFind.
- */
-HRESULT WpdObjectEnumerator::OnStartFind(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszParentID = NULL;
- ContextMap* pContextMap = NULL;
- CAtlStringW strEnumContext;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the object identifier of the parent where the enumeration is starting from.
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_ENUMERATION_PARENT_ID, &wszParentID);
- if (hr != S_OK)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_ENUMERATION_PARENT_ID");
- }
-
- // Get the client context map so we can store an enumeration context for this enumeration
- // operation.
- if (hr == S_OK)
- {
- hr = pParams->GetIUnknownValue(PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP, (IUnknown**)&pContextMap);
- CHECK_HR(hr, "Failed to get PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP");
- }
-
- // Create and initialize a new enumeration context.
- // Add the new enumertion context to the client context map. This context is used to
- // keep track of this particular enumeration operation.
- if (hr == S_OK)
- {
- WpdObjectEnumeratorContext* pEnumeratorContext = new WpdObjectEnumeratorContext();
- if (pEnumeratorContext != NULL)
- {
- // Initialize the enumeration context
- InitializeEnumerationContext(pEnumeratorContext, wszParentID);
-
- // Add the enumeration context to the client context map.
- pContextMap->Add(pEnumeratorContext, strEnumContext);
- }
- else
- {
- hr = E_OUTOFMEMORY;
- CHECK_HR(hr, "Failed to allocate enumeration context");
- }
- SAFE_RELEASE(pEnumeratorContext);
- }
-
- // Set the WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT value in the results.
- // This context identifier will be passed back during OnFindNext and OnEndFind to allow the driver to access it.
- if (hr == S_OK)
- {
- hr = pResults->SetStringValue(WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT, strEnumContext);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT");
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszParentID);
-
- SAFE_RELEASE(pContextMap);
-
- return hr;
-}
-
-HRESULT WpdObjectEnumerator::OnFindNext(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszEnumContext = NULL;
- DWORD dwNumObjectsRequested = 0;
- ContextMap* pContextMap = NULL;
- WpdObjectEnumeratorContext* pEnumeratorContext = NULL;
- DWORD NumObjectsEnumerated = 0;
-
- CComPtr<IPortableDevicePropVariantCollection> pObjectIDCollection;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the enumeration context identifier for this enumeration operation.
- // The enumeration context identifier is needed to lookup the specific
- // enumeration context in the client context map for this enumeration operation.
- // NOTE that more than one enumeration may be in progress.
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT, &wszEnumContext);
- if (hr != S_OK)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT");
- }
-
- // Get the number of objects requested for this enumeration call.
- // The driver should always attempt to meet this requested value.
- // If there are fewer children than requested, the driver should return the remaining
- // children and a return code of S_FALSE.
- hr = pParams->GetUnsignedIntegerValue(WPD_PROPERTY_OBJECT_ENUMERATION_NUM_OBJECTS_REQUESTED, &dwNumObjectsRequested);
- if (hr != S_OK)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_ENUMERATION_NUM_OBJECTS_REQUESTED");
- }
-
- // Get the client context map so we can retrieve the enumeration context for this enumeration
- // operation.
- if (hr == S_OK)
- {
- hr = pParams->GetIUnknownValue(PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP, (IUnknown**)&pContextMap);
- CHECK_HR(hr, "Failed to get PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP");
- }
-
- if (hr == S_OK)
- {
- pEnumeratorContext = (WpdObjectEnumeratorContext*)pContextMap->GetContext(wszEnumContext);
- if (pEnumeratorContext == NULL)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing enumeration context");
- }
- }
-
- // CoCreate a collection to store the object identifiers being returned for this enumeration call.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDevicePropVariantCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDevicePropVariantCollection,
- (VOID**) &pObjectIDCollection);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDevicePropVariantCollection");
- }
-
- // If the enumeration context reports that their are more objects to return, then continue, if not,
- // return an empty results set.
- if ((hr == S_OK) && (pEnumeratorContext != NULL) && pEnumeratorContext->HasMoreChildrenToEnumerate())
- {
- if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(L"") == 0)
- {
- // We are being asked for the WPD_DEVICE_OBJECT_ID
- hr = AddStringValueToPropVariantCollection(pObjectIDCollection, WPD_DEVICE_OBJECT_ID);
- CHECK_HR(hr, "Failed to add 'DEVICE' object ID to enumeration collection");
-
- // Update the the number of children we are returning for this enumeration call
- NumObjectsEnumerated++;
- }
- else if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(WPD_DEVICE_OBJECT_ID) == 0)
- {
- // We are being asked for direct children of the WPD_DEVICE_OBJECT_ID
- hr = AddStringValueToPropVariantCollection(pObjectIDCollection, STORAGE_OBJECT_ID);
- CHECK_HR(hr, "Failed to add storage object ID to enumeration collection");
-
- // Update the the number of children we are returning for this enumeration call
- NumObjectsEnumerated++;
- }
- else if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(STORAGE_OBJECT_ID) == 0)
- {
- // We are being asked for direct children of the STORAGE_OBJECT_ID
- hr = AddStringValueToPropVariantCollection(pObjectIDCollection, DOCUMENTS_FOLDER_OBJECT_ID);
- CHECK_HR(hr, "Failed to add documents folder object ID to enumeration collection");
-
- // Update the the number of children we are returning for this enumeration call
- NumObjectsEnumerated++;
- }
- else if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(DOCUMENTS_FOLDER_OBJECT_ID) == 0)
- {
- // We are being asked for direct children of the DOCUMENTS_FOLDER_OBJECT_ID
- hr = AddStringValueToPropVariantCollection(pObjectIDCollection, README_FILE_OBJECT_ID);
- CHECK_HR(hr, "Failed to add documents readme text file object ID to enumeration collection");
-
- // Update the the number of children we are returning for this enumeration call
- NumObjectsEnumerated++;
- }
- }
-
- // Set the collection of object identifiers enumerated in the results
- if (hr == S_OK)
- {
- hr = pResults->SetIPortableDevicePropVariantCollectionValue(WPD_PROPERTY_OBJECT_ENUMERATION_OBJECT_IDS, pObjectIDCollection);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_OBJECT_ENUMERATION_OBJECT_IDS");
- }
-
- // If the enumeration context reports that their are no more objects to return then return S_FALSE indicating to the
- // caller that we are finished.
- if (hr == S_OK)
- {
- if (pEnumeratorContext != NULL)
- {
- // Update the number of children we have enumerated and returned to the caller
- pEnumeratorContext->m_ChildrenEnumerated += NumObjectsEnumerated;
-
- // Check the number requested against the number enumerated and set the HRESULT
- // accordingly.
- if (NumObjectsEnumerated < dwNumObjectsRequested)
- {
- // We returned less than the number of objects requested to the caller
- hr = S_FALSE;
- }
- else
- {
- // We returned exactly the number of objects requested to the caller
- hr = S_OK;
- }
- }
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszEnumContext);
-
- SAFE_RELEASE(pContextMap);
- SAFE_RELEASE(pEnumeratorContext);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_ENUMERATION_END_FIND
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT: the context the driver returned to
- * the client in OnStartFind.
- *
- * The driver should:
- * - Destroy any data associated with this context.
- */
-HRESULT WpdObjectEnumerator::OnEndFind(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszEnumContext = NULL;
- ContextMap* pContextMap = NULL;
-
- UNREFERENCED_PARAMETER(pResults);
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the enumeration context identifier for this enumeration operation. We will
- // need this to lookup the specific enumeration context in the client context map.
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT, &wszEnumContext);
- if (hr != S_OK)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT");
- }
-
- // Get the client context map so we can retrieve the enumeration context for this enumeration
- // operation using the WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT property value obtained above.
- if (hr == S_OK)
- {
- hr = pParams->GetIUnknownValue(PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP, (IUnknown**)&pContextMap);
- CHECK_HR(hr, "Failed to get PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP");
- }
-
- // Destroy any data allocated/associated with the enumeration context and then remove it from the context map.
- // We no longer need to keep this context around because the enumeration has been ended.
- if (hr == S_OK)
- {
- pContextMap->Remove(wszEnumContext);
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszEnumContext);
-
- SAFE_RELEASE(pContextMap);
-
- return hr;
-}
-
-// Initialize the enumeration context
-VOID WpdObjectEnumerator::InitializeEnumerationContext(
- _In_ WpdObjectEnumeratorContext* pEnumeratorContext,
- _In_ LPCWSTR wszParentObjectID)
-{
- if (pEnumeratorContext == NULL)
- {
- return;
- }
-
- // Initialize the enumeration context with the parent object identifier
- pEnumeratorContext->m_strParentObjectID = wszParentObjectID;
-
- // Our sample driver has a very simple object structure where we know
- // how many children are under each parent.
- // The eumeration context is initialized below with this information.
- if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(L"") == 0)
- {
- // Clients passing an 'empty' string for the parent are asking for the
- // 'DEVICE' object. We should return 1 child in this case.
- pEnumeratorContext->m_TotalChildren = 1;
- }
- else if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(WPD_DEVICE_OBJECT_ID) == 0)
- {
- // The device object contains 1 child (the storage object).
- pEnumeratorContext->m_TotalChildren = 1;
- }
- else if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(STORAGE_OBJECT_ID) == 0)
- {
- // The storage object contains 1 child (the documents folder object).
- pEnumeratorContext->m_TotalChildren = 1;
- }
- else if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(DOCUMENTS_FOLDER_OBJECT_ID) == 0)
- {
- // The documents folder object contains 1 child (the readme text file object).
- pEnumeratorContext->m_TotalChildren = 1;
- }
- else if (pEnumeratorContext->m_strParentObjectID.CompareNoCase(README_FILE_OBJECT_ID) == 0)
- {
- // The readme text file object contains no children.
- pEnumeratorContext->m_TotalChildren = 0;
- }
- else
- {
- // Invalid, or non-existing objects contain no children.
- pEnumeratorContext->m_TotalChildren = 0;
- }
-}
-
-HRESULT WpdObjectEnumerator::AddStringValueToPropVariantCollection(
- _In_ IPortableDevicePropVariantCollection* pCollection,
- _In_ LPCWSTR wszValue)
-{
- HRESULT hr = S_OK;
-
- if ((pCollection == NULL) ||
- (wszValue == NULL))
- {
- hr = E_INVALIDARG;
- return hr;
- }
-
- PROPVARIANT pv = {0};
- PropVariantInit(&pv);
-
- pv.vt = VT_LPWSTR;
- pv.pwszVal = (LPWSTR)wszValue;
-
- // The wszValue will be copied into the collection, keeping the ownership
- // of the string belonging to the caller.
- // Don't call PropVariantClear, since we did not allocate the memory for these string values
-
- hr = pCollection->Add(&pv);
-
- return hr;
-}
-
diff --git a/wpd/WpdMultiTransportDriver/WpdObjectEnum.h b/wpd/WpdMultiTransportDriver/WpdObjectEnum.h
deleted file mode 100644
index 8d38526b..00000000
--- a/wpd/WpdMultiTransportDriver/WpdObjectEnum.h
+++ /dev/null
@@ -1,103 +0,0 @@
-#pragma once
-
-// This class is used to store the context for a specific enumeration.
-class WpdObjectEnumeratorContext : public IUnknown
-{
-public:
- WpdObjectEnumeratorContext() :
- m_cRef(1),
- m_TotalChildren(0),
- m_ChildrenEnumerated(0)
- {
-
- }
-
- ~WpdObjectEnumeratorContext()
- {
-
- }
-
-public: // IUnknown
- ULONG __stdcall AddRef()
- {
- InterlockedIncrement((long*) &m_cRef);
- return m_cRef;
- }
-
- _At_(this, __drv_freesMem(Mem))
- ULONG __stdcall Release()
- {
- ULONG ulRefCount = m_cRef - 1;
-
- if (InterlockedDecrement((long*) &m_cRef) == 0)
- {
- delete this;
- return 0;
- }
- return ulRefCount;
- }
-
- HRESULT __stdcall QueryInterface(
- REFIID riid,
- void** ppv)
- {
- HRESULT hr = S_OK;
-
- if(riid == IID_IUnknown)
- {
- *ppv = static_cast<IUnknown*>(this);
- AddRef();
- }
- else
- {
- *ppv = NULL;
- hr = E_NOINTERFACE;
- }
-
- return hr;
- }
-
-private:
- DWORD m_cRef;
-
-public:
- bool HasMoreChildrenToEnumerate()
- {
- return ((m_TotalChildren - m_ChildrenEnumerated) > 0);
- }
-
-// WpdObjectEnumeratorContext specific data
-public:
- CAtlStringW m_strParentObjectID; // object identifier of the object whose children are being enumerated
- DWORD m_TotalChildren; // number of bytes transferred from the resource to the caller
- DWORD m_ChildrenEnumerated; // number of children returned during the enumeration operation
-};
-
-class WpdObjectEnumerator
-{
-public:
- WpdObjectEnumerator();
- virtual ~WpdObjectEnumerator();
-
- HRESULT DispatchWpdMessage(_In_ REFPROPERTYKEY Command,
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnStartFind(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnFindNext(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnEndFind(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
-private:
- VOID InitializeEnumerationContext(
- _In_ WpdObjectEnumeratorContext* pEnumeratorContext,
- _In_ LPCWSTR wszParentObjectID);
-
- HRESULT AddStringValueToPropVariantCollection(
- _In_ IPortableDevicePropVariantCollection* pCollection,
- _In_ LPCWSTR wszValue);
-};
diff --git a/wpd/WpdMultiTransportDriver/WpdObjectProperties.cpp b/wpd/WpdMultiTransportDriver/WpdObjectProperties.cpp
deleted file mode 100644
index 79dc00b4..00000000
--- a/wpd/WpdMultiTransportDriver/WpdObjectProperties.cpp
+++ /dev/null
@@ -1,1421 +0,0 @@
-#include "stdafx.h"
-#include "WpdObjectProperties.tmh"
-
-const PROPERTYKEY g_SupportedCommonProperties[] =
-{
- WPD_OBJECT_ID,
- WPD_OBJECT_PERSISTENT_UNIQUE_ID,
- WPD_OBJECT_PARENT_ID,
- WPD_OBJECT_NAME,
- WPD_OBJECT_FORMAT,
- WPD_OBJECT_CONTENT_TYPE,
- WPD_OBJECT_CAN_DELETE,
-};
-
-const PROPERTYKEY g_SupportedDeviceProperties[] =
-{
- WPD_DEVICE_FIRMWARE_VERSION,
- WPD_DEVICE_POWER_LEVEL,
- WPD_DEVICE_POWER_SOURCE,
- WPD_DEVICE_PROTOCOL,
- WPD_DEVICE_MODEL,
- WPD_DEVICE_SERIAL_NUMBER,
- WPD_DEVICE_SUPPORTS_NON_CONSUMABLE,
- WPD_DEVICE_MANUFACTURER,
- WPD_DEVICE_FRIENDLY_NAME,
- WPD_DEVICE_TYPE,
- WPD_FUNCTIONAL_OBJECT_CATEGORY,
-};
-
-const PROPERTYKEY g_SupportedStorageProperties[] =
-{
- WPD_STORAGE_TYPE,
- WPD_STORAGE_FILE_SYSTEM_TYPE,
- WPD_STORAGE_CAPACITY,
- WPD_STORAGE_FREE_SPACE_IN_BYTES,
- WPD_STORAGE_SERIAL_NUMBER,
- WPD_STORAGE_DESCRIPTION,
- WPD_FUNCTIONAL_OBJECT_CATEGORY,
-};
-
-const PROPERTYKEY g_SupportedCommonFileProperties[] =
-{
- WPD_OBJECT_ORIGINAL_FILE_NAME,
- WPD_OBJECT_SIZE,
- WPD_OBJECT_DATE_MODIFIED,
- WPD_OBJECT_DATE_CREATED,
-};
-
-const PROPERTYKEY g_SupportedCommonFolderProperties[] =
-{
- WPD_OBJECT_ORIGINAL_FILE_NAME,
- WPD_OBJECT_DATE_MODIFIED,
- WPD_OBJECT_DATE_CREATED,
-};
-
-WpdObjectProperties::WpdObjectProperties()
-{
-
-}
-
-WpdObjectProperties::~WpdObjectProperties()
-{
-
-}
-
-HRESULT WpdObjectProperties::DispatchWpdMessage(
- _In_ REFPROPERTYKEY Command,
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
-
- if (Command.fmtid != WPD_CATEGORY_OBJECT_PROPERTIES)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "This object does not support this command category %ws",CComBSTR(Command.fmtid));
- }
-
- if (hr == S_OK)
- {
- if (IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_PROPERTIES_GET_SUPPORTED))
- {
- hr = OnGetSupportedProperties(pParams, pResults);
- CHECK_HR(hr, "Failed to get supported properties");
- }
- else if(IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_PROPERTIES_GET))
- {
- hr = OnGetPropertyValues(pParams, pResults);
- if(FAILED(hr))
- {
- CHECK_HR(hr, "Failed to get properties");
- }
- }
- else if(IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_PROPERTIES_GET_ALL))
- {
- hr = OnGetAllPropertyValues(pParams, pResults);
- if(FAILED(hr))
- {
- CHECK_HR(hr, "Failed to get all properties");
- }
- }
- else if(IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_PROPERTIES_SET))
- {
- hr = OnSetPropertyValues(pParams, pResults);
- if(FAILED(hr))
- {
- CHECK_HR(hr, "Failed to set properties");
- }
- }
- else if(IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_PROPERTIES_GET_ATTRIBUTES))
- {
- hr = OnGetPropertyAttributes(pParams, pResults);
- if(FAILED(hr))
- {
- CHECK_HR(hr, "Failed to get property attributes");
- }
- }
- else if(IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_PROPERTIES_DELETE))
- {
- hr = OnDeleteProperties(pParams, pResults);
- if(FAILED(hr))
- {
- CHECK_HR(hr, "Failed to delete properties");
- }
- }
- else
- {
- hr = E_NOTIMPL;
- CHECK_HR(hr, "This object does not support this command id %d", Command.pid);
- }
- }
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_PROPERTIES_GET_SUPPORTED
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID: identifies the object whose supported properties have
- * been requested.
- *
- * - WPD_PROPERTY_OBJECT_PROPERTIES_FILTER: the filter to use when returning supported properties.
- * Since this parameter is optional, it may not exist.
- * ! This driver currently ignores the filter parameter. !
- *
- * The driver should:
- * - Return supported property keys for the specified object in WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS
- */
-HRESULT WpdObjectProperties::OnGetSupportedProperties(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszObjectID = NULL;
- CComPtr<IPortableDeviceKeyCollection> pKeys;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the object identifier whose supported properties have been requested
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID, &wszObjectID);
- if (hr != S_OK)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing string value for WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID");
- }
-
- // CoCreate a collection to store the supported property keys.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceKeyCollection,
- (VOID**) &pKeys);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceKeyCollection");
- }
-
- // Add supported property keys for the specified object to the collection
- if (hr == S_OK)
- {
- hr = AddSupportedPropertyKeys(wszObjectID, pKeys);
- CHECK_HR(hr, "Failed to add supported property keys for object '%ws'", wszObjectID);
- }
-
- // Set the WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS value in the results.
- if (hr == S_OK)
- {
- hr = pResults->SetIPortableDeviceKeyCollectionValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS, pKeys);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS");
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszObjectID);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_PROPERTIES_GET
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID: identifies the object whose property values have been requested.
- * - WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS: a collection of property keys, identifying which
- * specific property values we are requested to return.
- *
- * The driver should:
- * - Return all requested property values in WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES. If any property read failed, the corresponding value should be
- * set to type VT_ERROR with the 'scode' member holding the HRESULT reason for the failure.
- * - S_OK should be returned if all properties were read successfully.
- * - S_FALSE should be returned if any property read failed.
- * - Any error return indicates that the driver did not fill in any results, and the caller will
- * not attempt to unpack any property values.
- */
-HRESULT WpdObjectProperties::OnGetPropertyValues(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszObjectID = NULL;
- CComPtr<IPortableDeviceValues> pValues;
- CComPtr<IPortableDeviceKeyCollection> pKeys;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the object identifier whose property values have been requested
- if (hr == S_OK)
- {
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID, &wszObjectID);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID");
- }
-
- // Get the list of property keys for the property values the caller wants to retrieve from the specified object
- if (hr == S_OK)
- {
- hr = pParams->GetIPortableDeviceKeyCollectionValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS, &pKeys);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS");
- }
-
- // CoCreate a collection to store the property values.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pValues);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- // Read the specified properties on the specified object and add the property values to the collection.
- if (hr == S_OK)
- {
- hr = GetPropertyValuesForObject(wszObjectID, pKeys, pValues);
- CHECK_HR(hr, "Failed to get property values for object '%ws'", wszObjectID);
- }
-
- // S_OK or S_FALSE can be returned from GetPropertyValuesForObject( ).
- // S_FALSE means that 1 or more property values could not be retrieved successfully.
- // The value for the specified property should be set to an error HRESULT of
- // the reason why the property could not be read.
- // (e.g. If the property being requested is not supported on the object then an error of
- // HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) should be set as the value.
- if (SUCCEEDED(hr))
- {
- // Set the WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES value in the results.
- HRESULT hrTemp = S_OK;
- hrTemp = pResults->SetIPortableDeviceValuesValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES, pValues);
- CHECK_HR(hrTemp, ("Failed to set WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES"));
-
- if(FAILED(hrTemp))
- {
- hr = hrTemp;
- }
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszObjectID);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_PROPERTIES_GET_ALL
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID: identifies the object whose property values have been requested.
- *
- * The driver should:
- * - Return all property values in WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES. If any property read failed, the corresponding value should be
- * set to type VT_ERROR with the 'scode' member holding the HRESULT reason for the failure.
- * - S_OK should be returned if all properties were read successfully.
- * - S_FALSE should be returned if any property read failed.
- * - Any error return indicates that the driver did not fill in any results, and the caller will
- * not attempt to unpack any property values.
- */
-HRESULT WpdObjectProperties::OnGetAllPropertyValues(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszObjectID = NULL;
- CComPtr<IPortableDeviceValues> pValues;
- CComPtr<IPortableDeviceKeyCollection> pKeys;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the object identifier whose property values have been requested
- if (hr == S_OK)
- {
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID, &wszObjectID);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID");
- }
-
- // CoCreate a collection to store the property values.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pValues);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- // CoCreate a collection to store the property keys we are going to use
- // to request the property values of.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceKeyCollection,
- (VOID**) &pKeys);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceKeyCollection");
- }
-
- // First we make a request for ALL supported property keys for the specified object.
- // Next, we delegate to our helper function GetPropertyValuesForObject( ) passing
- // the entire property key collection. This will reuse existing implementation
- // in our driver to perform the GetAllPropertyValues operation.
- if (hr == S_OK)
- {
- hr = AddSupportedPropertyKeys(wszObjectID, pKeys);
- CHECK_HR(hr, "Failed to get ALL supported properties for object '%ws'", wszObjectID);
- if (hr == S_OK)
- {
- hr = GetPropertyValuesForObject(wszObjectID, pKeys, pValues);
- CHECK_HR(hr, "Failed to get property values for object '%ws'", wszObjectID);
- }
- }
-
- // S_OK or S_FALSE can be returned from GetPropertyValuesForObject( ).
- // S_FALSE means that 1 or more property values could not be retrieved successfully.
- // The value for the specified property key should be set to the error HRESULT of
- // the reason why the property could not be read.
- // (i.e. an error of HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) if a property value was
- // requested and is not supported by the specified object.)
- if (SUCCEEDED(hr))
- {
- // Set the WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES value in the results
- HRESULT hrTemp = S_OK;
- hrTemp = pResults->SetIPortableDeviceValuesValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES, pValues);
- CHECK_HR(hrTemp, ("Failed to set WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES"));
-
- if(FAILED(hrTemp))
- {
- hr = hrTemp;
- }
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszObjectID);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_PROPERTIES_SET
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID: identifies the object whose property values we want to return.
- * - WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES: an IPortableDeviceValues of values, identifying which
- * specific property values we are requested to write.
- *
- * The driver should:
- * - Write all requested property values. For each property, a write result should be returned in the
- * write result property store.
- * - If any property write failed, the corresponding write result value should be
- * set to type VT_ERROR with the 'scode' member holding the HRESULT reason for the failure.
- * - S_OK should be returned if all properties were written successfully.
- * - S_FALSE should be returned if any property write failed.
- * - Any error return indicates that the driver did not write any results, and the caller will
- * not attempt to unpack any property write results.
- */
-HRESULT WpdObjectProperties::OnSetPropertyValues(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszObjectID = NULL;
- DWORD cValues = 0;
- CComPtr<IPortableDeviceValues> pValues;
- CComPtr<IPortableDeviceValues> pWriteResults;
- CComPtr<IPortableDeviceValues> pEventParams;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the object identifier whose property values are being set
- if (hr == S_OK)
- {
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID, &wszObjectID);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID");
- }
-
- // Get the caller-supplied property values requested to be set on the object
- if (hr == S_OK)
- {
- hr = pParams->GetIPortableDeviceValuesValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES, &pValues);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES");
- }
-
- // CoCreate a collection to store the property set operation results.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pWriteResults);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- // Set the property values on the specified object
- if (hr == S_OK)
- {
- // Since this driver does not support setting any properties, all property set operation
- // results will be set to E_ACCESSDENIED.
- if (hr == S_OK)
- {
- hr = pValues->GetCount(&cValues);
- CHECK_HR(hr, "Failed to get total number of values");
- }
-
- if (hr == S_OK)
- {
- for (DWORD dwIndex = 0; dwIndex < cValues; dwIndex++)
- {
- PROPERTYKEY Key = WPD_PROPERTY_NULL;
- hr = pValues->GetAt(dwIndex, &Key, NULL);
- CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d", dwIndex);
-
- if (hr == S_OK)
- {
- hr = pWriteResults->SetErrorValue(Key, E_ACCESSDENIED);
- CHECK_HR(hr, "Failed to set error result value at index %d", dwIndex);
- }
- }
- }
-
- // Since we have set failures for the property set operations we must let the application
- // know by returning S_FALSE. This will instruct the application to look at the
- // property set operation results for failure values.
- if (hr == S_OK)
- {
- hr = S_FALSE;
- }
- }
-
- if (SUCCEEDED(hr))
- {
- // Set the WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_WRITE_RESULTS value in the results
- HRESULT hrTemp = pResults->SetIPortableDeviceValuesValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_WRITE_RESULTS, pWriteResults);
- CHECK_HR(hrTemp, ("Failed to set WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_WRITE_RESULTS"));
-
- if (FAILED(hrTemp))
- {
- hr = hrTemp;
- }
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszObjectID);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_PROPERTIES_GET_ATTRIBUTES
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID: identifies the object whose property attributes we want to return.
- * - WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS: a collection of property keys containing a single value,
- * which is the key identifying the specific property attributes we are requested to return.
- *
- * The driver should:
- * - Return the requested property attributes. If any property attributes failed to be retrieved,
- * the corresponding value should be set to type VT_ERROR with the 'scode' member holding the
- * HRESULT reason for the failure.
- * - S_OK should be returned if all property attributes were read successfully.
- * - S_FALSE should be returned if any property attribute failed.
- * - Any error return indicates that the driver did not fill in any results, and the caller will
- * not attempt to unpack any property values.
- */
-HRESULT WpdObjectProperties::OnGetPropertyAttributes(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszObjectID = NULL;
- PROPERTYKEY Key = WPD_PROPERTY_NULL;
- CComPtr<IPortableDeviceValues> pAttributes;
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the object identifier whose property attributes have been requested
- if (hr == S_OK)
- {
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID, &wszObjectID);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID");
- }
-
- // Get the list of property keys whose attributes are being requested
- if (hr == S_OK)
- {
- hr = pParams->GetKeyValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS, &Key);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS");
- }
-
- // CoCreate a collection to store the property attributes.
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pAttributes);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- // Get the attributes for the specified properties on the specified object and add them
- // to the collection.
- if (hr == S_OK)
- {
- hr = GetPropertyAttributesForObject(wszObjectID, Key, pAttributes);
- CHECK_HR(hr, "Failed to get property attributes");
- }
-
- if (SUCCEEDED(hr))
- {
- // Set the WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_ATTRIBUTES value in the results
- HRESULT hrTemp = S_OK;
- hrTemp = pResults->SetIPortableDeviceValuesValue(WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_ATTRIBUTES, pAttributes);
- CHECK_HR(hrTemp, ("Failed to set WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_ATTRIBUTES"));
-
- if(FAILED(hrTemp))
- {
- hr = hrTemp;
- }
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszObjectID);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_PROPERTIES_DELETE
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID: identifies the object whose properties should be deleted.
- * - WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_KEYS: a collection of property keys indicating which
- * properties to delete.
- *
- * The driver should:
- * - Delete the specified properties from the object.
- * - S_OK should be returned if all specified properties were successfully deleted.
- * - E_ACCESSDENIED should be returned if the client attempts to delete a property which is not deletable (i.e.
- * WPD_PROPERTY_ATTRIBUTE_CAN_DELETE is FALSE for that property.)
- */
-HRESULT WpdObjectProperties::OnDeleteProperties(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = E_ACCESSDENIED;
-
- UNREFERENCED_PARAMETER(pParams);
- UNREFERENCED_PARAMETER(pResults);
-
- // This driver has no properties which can be deleted.
-
- return hr;
-}
-
-/**
- * This method is called to populate supported PROPERTYKEYs found on objects.
- *
- * The parameters sent to us are:
- * wszObjectID - the object whose supported property keys are being requested
- * pKeys - An IPortableDeviceKeyCollection to be populated with supported PROPERTYKEYs
- *
- * The driver should:
- * Add PROPERTYKEYs pertaining to the specified object.
- */
-HRESULT AddSupportedPropertyKeys(
- _In_ LPCWSTR wszObjectID,
- _In_ IPortableDeviceKeyCollection* pKeys)
-{
- HRESULT hr = S_OK;
- CAtlStringW strObjectID = wszObjectID;
-
- // Add Common PROPERTYKEYs for ALL WPD objects
- AddCommonPropertyKeys(pKeys);
-
- if (strObjectID.CompareNoCase(WPD_DEVICE_OBJECT_ID) == 0)
- {
- // Add the PROPERTYKEYs for the 'DEVICE' object
- AddDevicePropertyKeys(pKeys);
- }
-
- if (strObjectID.CompareNoCase(STORAGE_OBJECT_ID) == 0)
- {
- // Add the PROPERTYKEYs for the storage object
- AddStoragePropertyKeys(pKeys);
- }
-
- if (strObjectID.CompareNoCase(README_FILE_OBJECT_ID) == 0)
- {
- // Add the PROPERTYKEYs for the file object
- AddFilePropertyKeys(pKeys);
- }
-
- if (strObjectID.CompareNoCase(DOCUMENTS_FOLDER_OBJECT_ID) == 0)
- {
- // Add the PROPERTYKEYs for the folder object
- AddFolderPropertyKeys(pKeys);
- }
-
- // Add other PROPERTYKEYs for other supported objects...
-
- return hr;
-}
-
-/**
- * This method is called to populate common PROPERTYKEYs found on ALL objects.
- *
- * The parameters sent to us are:
- * pKeys - An IPortableDeviceKeyCollection to be populated with PROPERTYKEYs
- *
- * The driver should:
- * Add PROPERTYKEYs pertaining to the ALL objects.
- */
-VOID AddCommonPropertyKeys(
- _In_ IPortableDeviceKeyCollection* pKeys)
-{
- if (pKeys != NULL)
- {
- for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_SupportedCommonProperties); dwIndex++)
- {
- HRESULT hr = S_OK;
- hr = pKeys->Add(g_SupportedCommonProperties[dwIndex] );
- CHECK_HR(hr, "Failed to add common property");
- }
- }
-}
-
-/**
- * This method is called to populate common PROPERTYKEYs found on the DEVICE object.
- *
- * The parameters sent to us are:
- * pKeys - An IPortableDeviceKeyCollection to be populated with PROPERTYKEYs
- *
- * The driver should:
- * Add PROPERTYKEYs pertaining to the DEVICE object.
- */
-VOID AddDevicePropertyKeys(
- _In_ IPortableDeviceKeyCollection* pKeys)
-{
- if (pKeys != NULL)
- {
- for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_SupportedDeviceProperties); dwIndex++)
- {
- HRESULT hr = S_OK;
- hr = pKeys->Add(g_SupportedDeviceProperties[dwIndex] );
- CHECK_HR(hr, "Failed to add device property");
- }
- }
-}
-
-/**
- * This method is called to populate common PROPERTYKEYs found on storage objects.
- *
- * The parameters sent to us are:
- * pKeys - An IPortableDeviceKeyCollection to be populated with PROPERTYKEYs
- *
- * The driver should:
- * Add PROPERTYKEYs pertaining to the storage objects.
- */
-VOID AddStoragePropertyKeys(
- _In_ IPortableDeviceKeyCollection* pKeys)
-{
- if (pKeys != NULL)
- {
- for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_SupportedStorageProperties); dwIndex++)
- {
- HRESULT hr = S_OK;
- hr = pKeys->Add(g_SupportedStorageProperties[dwIndex] );
- CHECK_HR(hr, "Failed to add storage property");
- }
- }
-}
-
-/**
- * This method is called to populate common PROPERTYKEYs found on file objects.
- *
- * The parameters sent to us are:
- * pKeys - An IPortableDeviceKeyCollection to be populated with PROPERTYKEYs
- *
- * The driver should:
- * Add PROPERTYKEYs pertaining to the file objects.
- */
-VOID AddFilePropertyKeys(
- _In_ IPortableDeviceKeyCollection* pKeys)
-{
- if (pKeys != NULL)
- {
- for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_SupportedCommonFileProperties); dwIndex++)
- {
- HRESULT hr = S_OK;
- hr = pKeys->Add(g_SupportedCommonFileProperties[dwIndex] );
- CHECK_HR(hr, "Failed to add common file property");
- }
- }
-}
-
-/**
- * This method is called to populate common PROPERTYKEYs found on folder objects.
- *
- * The parameters sent to us are:
- * pKeys - An IPortableDeviceKeyCollection to be populated with PROPERTYKEYs
- *
- * The driver should:
- * Add PROPERTYKEYs pertaining to the file objects.
- */
-VOID AddFolderPropertyKeys(
- _In_ IPortableDeviceKeyCollection* pKeys)
-{
- if (pKeys != NULL)
- {
- for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(g_SupportedCommonFolderProperties); dwIndex++)
- {
- HRESULT hr = S_OK;
- hr = pKeys->Add(g_SupportedCommonFolderProperties[dwIndex] );
- CHECK_HR(hr, "Failed to add common folder property");
- }
- }
-}
-
-/**
- * This method is called to populate property values for the object specified.
- *
- * The parameters sent to us are:
- * wszObjectID - the object whose properties are being requested.
- * pKeys - the list of property keys of the properties to request from the object
- * pValues - an IPortableDeviceValues which will contain the property values retreived from the object
- *
- * The driver should:
- * Read the specified properties for the specified object and populate pValues with the
- * results.
- */
-HRESULT WpdObjectProperties::GetPropertyValuesForObject(
- _In_ LPCWSTR wszObjectID,
- _In_ IPortableDeviceKeyCollection* pKeys,
- _In_ IPortableDeviceValues* pValues)
-{
- HRESULT hr = S_OK;
- CAtlStringW strObjectID = wszObjectID;
- DWORD cKeys = 0;
-
- if ((wszObjectID == NULL) ||
- (pKeys == NULL) ||
- (pValues == NULL))
- {
- hr = E_INVALIDARG;
- return hr;
- }
-
- hr = pKeys->GetCount(&cKeys);
- CHECK_HR(hr, "Failed to number of PROPERTYKEYs in collection");
-
- if (hr == S_OK)
- {
- // Get values for the DEVICE object
- if (strObjectID.CompareNoCase(WPD_DEVICE_OBJECT_ID) == 0)
- {
- for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
- {
- PROPERTYKEY Key = WPD_PROPERTY_NULL;
- hr = pKeys->GetAt(dwIndex, &Key);
- CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);
-
- if (hr == S_OK)
- {
- // Preset the property value to 'error not supported'. The actual value
- // will replace this value, if read from the device.
- pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));
-
- // Set DEVICE object properties
- if (IsEqualPropertyKey(Key, WPD_DEVICE_FIRMWARE_VERSION))
- {
- hr = pValues->SetStringValue(WPD_DEVICE_FIRMWARE_VERSION, DEVICE_FIRMWARE_VERSION_VALUE);
- CHECK_HR(hr, "Failed to set WPD_DEVICE_FIRMWARE_VERSION");
- }
-
- if (IsEqualPropertyKey(Key, WPD_DEVICE_POWER_LEVEL))
- {
- hr = pValues->SetUnsignedIntegerValue(WPD_DEVICE_POWER_LEVEL, DEVICE_POWER_LEVEL_VALUE);
- CHECK_HR(hr, "Failed to set WPD_DEVICE_POWER_LEVEL");
- }
-
- if (IsEqualPropertyKey(Key, WPD_DEVICE_POWER_SOURCE))
- {
- hr = pValues->SetUnsignedIntegerValue(WPD_DEVICE_POWER_SOURCE, WPD_POWER_SOURCE_EXTERNAL);
- CHECK_HR(hr, "Failed to set WPD_DEVICE_POWER_SOURCE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_DEVICE_PROTOCOL))
- {
- hr = pValues->SetStringValue(WPD_DEVICE_PROTOCOL, DEVICE_PROTOCOL_VALUE);
- CHECK_HR(hr, "Failed to set WPD_DEVICE_PROTOCOL");
- }
-
- if (IsEqualPropertyKey(Key, WPD_DEVICE_MODEL))
- {
- hr = pValues->SetStringValue(WPD_DEVICE_MODEL, DEVICE_MODEL_VALUE);
- CHECK_HR(hr, "Failed to set WPD_DEVICE_MODEL");
- }
-
- if (IsEqualPropertyKey(Key, WPD_DEVICE_SERIAL_NUMBER))
- {
- hr = pValues->SetStringValue(WPD_DEVICE_SERIAL_NUMBER, DEVICE_SERIAL_NUMBER_VALUE);
- CHECK_HR(hr, "Failed to set WPD_DEVICE_SERIAL_NUMBER");
- }
-
- if (IsEqualPropertyKey(Key, WPD_DEVICE_SUPPORTS_NON_CONSUMABLE))
- {
- hr = pValues->SetBoolValue(WPD_DEVICE_SUPPORTS_NON_CONSUMABLE, DEVICE_SUPPORTS_NONCONSUMABLE_VALUE);
- CHECK_HR(hr, "Failed to set WPD_DEVICE_SUPPORTS_NON_CONSUMABLE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_DEVICE_MANUFACTURER))
- {
- hr = pValues->SetStringValue(WPD_DEVICE_MANUFACTURER, DEVICE_MANUFACTURER_VALUE);
- CHECK_HR(hr, "Failed to set WPD_DEVICE_MANUFACTURER");
- }
-
- if (IsEqualPropertyKey(Key, WPD_DEVICE_FRIENDLY_NAME))
- {
- hr = pValues->SetStringValue(WPD_DEVICE_FRIENDLY_NAME, DEVICE_FRIENDLY_NAME_VALUE);
- CHECK_HR(hr, "Failed to set WPD_DEVICE_FRIENDLY_NAME");
- }
-
- if (IsEqualPropertyKey(Key, WPD_DEVICE_TYPE))
- {
- hr = pValues->SetUnsignedIntegerValue(WPD_DEVICE_TYPE, WPD_DEVICE_TYPE_GENERIC);
- CHECK_HR(hr, "Failed to set WPD_DEVICE_TYPE");
- }
-
- // Set general properties for DEVICE
- if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_ID, WPD_DEVICE_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_NAME, WPD_DEVICE_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, WPD_DEVICE_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, L"");
- CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
- {
- hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_UNSPECIFIED);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
- {
- hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
- {
- hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_FUNCTIONAL_OBJECT_CATEGORY))
- {
- hr = pValues->SetGuidValue(WPD_FUNCTIONAL_OBJECT_CATEGORY, WPD_FUNCTIONAL_CATEGORY_DEVICE);
- CHECK_HR(hr, "Failed to set WPD_FUNCTIONAL_OBJECT_CATEGORY");
- }
- }
- }
- }
- else if (strObjectID.CompareNoCase(STORAGE_OBJECT_ID) == 0)
- {
- for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
- {
- PROPERTYKEY Key = WPD_PROPERTY_NULL;
- hr = pKeys->GetAt(dwIndex, &Key);
- CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);
-
- if (hr == S_OK)
- {
- // Preset the property value to 'error not supported'. The actual value
- // will replace this value, if read from the device.
- pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));
-
- // Set storage object properties
- if (IsEqualPropertyKey(Key, WPD_STORAGE_SERIAL_NUMBER))
- {
- hr = pValues->SetStringValue(WPD_STORAGE_SERIAL_NUMBER, STORAGE_SERIAL_NUMBER_VALUE);
- CHECK_HR(hr, "Failed to set WPD_STORAGE_SERIAL_NUMBER");
- }
-
- if (IsEqualPropertyKey(Key, WPD_STORAGE_FREE_SPACE_IN_BYTES))
- {
- hr = pValues->SetUnsignedLargeIntegerValue(WPD_STORAGE_FREE_SPACE_IN_BYTES, (STORAGE_FREE_SPACE_IN_BYTES_VALUE - GetObjectSize(README_FILE_OBJECT_ID)));
- CHECK_HR(hr, "Failed to set WPD_STORAGE_FREE_SPACE_IN_BYTES");
- }
-
- if (IsEqualPropertyKey(Key, WPD_STORAGE_CAPACITY))
- {
- hr = pValues->SetUnsignedLargeIntegerValue(WPD_STORAGE_CAPACITY, STORAGE_CAPACITY_VALUE);
- CHECK_HR(hr, "Failed to set WPD_STORAGE_CAPACITY");
- }
-
- if (IsEqualPropertyKey(Key, WPD_STORAGE_TYPE))
- {
- hr = pValues->SetUnsignedIntegerValue(WPD_STORAGE_TYPE, WPD_STORAGE_TYPE_FIXED_ROM);
- CHECK_HR(hr, "Failed to set WPD_STORAGE_TYPE");
- }
-
- // Set general properties for storage
- if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_ID, STORAGE_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_NAME, STORAGE_OBJECT_NAME_VALUE);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, STORAGE_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, WPD_DEVICE_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
- {
- hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_UNSPECIFIED);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
- {
- hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, WPD_CONTENT_TYPE_FUNCTIONAL_OBJECT);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
- {
- hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_FUNCTIONAL_OBJECT_CATEGORY))
- {
- hr = pValues->SetGuidValue(WPD_FUNCTIONAL_OBJECT_CATEGORY, WPD_FUNCTIONAL_CATEGORY_STORAGE);
- CHECK_HR(hr, "Failed to set WPD_FUNCTIONAL_OBJECT_CATEGORY");
- }
-
- if (IsEqualPropertyKey(Key, WPD_STORAGE_FILE_SYSTEM_TYPE))
- {
- hr = pValues->SetStringValue(WPD_STORAGE_FILE_SYSTEM_TYPE, STORAGE_FILE_SYSTEM_TYPE_VALUE);
- CHECK_HR(hr, "Failed to set WPD_STORAGE_FILE_SYSTEM_TYPE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_STORAGE_DESCRIPTION))
- {
- hr = pValues->SetStringValue(WPD_STORAGE_DESCRIPTION, STORAGE_DESCRIPTION_VALUE);
- CHECK_HR(hr, "Failed to set WPD_STORAGE_DESCRIPTION");
- }
- }
- }
- }
- else if (strObjectID.CompareNoCase(DOCUMENTS_FOLDER_OBJECT_ID) == 0)
- {
- for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
- {
- PROPERTYKEY Key = WPD_PROPERTY_NULL;
- hr = pKeys->GetAt(dwIndex, &Key);
- CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);
-
- if (hr == S_OK)
- {
- // Preset the property value to 'error not supported'. The actual value
- // will replace this value, if read from the device.
- pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));
-
- // Set general properties for the folder object
- if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_ID, DOCUMENTS_FOLDER_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, DOCUMENTS_FOLDER_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, STORAGE_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_NAME, DOCUMENTS_FOLDER_OBJECT_NAME_VALUE);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_ORIGINAL_FILE_NAME))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, DOCUMENTS_FOLDER_OBJECT_ORIGINAL_FILE_NAME_VALUE);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_ORIGINAL_FILE_NAME");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
- {
- hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, WPD_OBJECT_FORMAT_UNSPECIFIED);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
- {
- hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, WPD_CONTENT_TYPE_FOLDER);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
- {
- hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_MODIFIED))
- {
- PROPVARIANT pvDateModified = {0};
- SYSTEMTIME systemtime = {0};
-
- systemtime.wMonth = 6;
- systemtime.wDay = 26;
- systemtime.wYear = 2006;
- systemtime.wHour = 5;
-
- // Initialize the Date Modified PROPVARIANT value
- PropVariantInit(&pvDateModified);
-
- pvDateModified.vt = VT_DATE;
- if (SystemTimeToVariantTime(&systemtime, &pvDateModified.date) == TRUE)
- {
- hr = pValues->SetValue(WPD_OBJECT_DATE_MODIFIED, &pvDateModified);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_MODIFIED");
- }
- else
- {
- LONG lError = GetLastError();
- hr = HRESULT_FROM_WIN32(lError);
- }
-
- PropVariantClear(&pvDateModified);
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_CREATED))
- {
- PROPVARIANT pvDateCreated = {0};
- SYSTEMTIME systemtime = {0};
-
- systemtime.wMonth = 1;
- systemtime.wDay = 24;
- systemtime.wYear = 2006;
- systemtime.wHour = 12;
-
- // Initialize the Date Created PROPVARIANT value
- PropVariantInit(&pvDateCreated);
-
- pvDateCreated.vt = VT_DATE;
- if (SystemTimeToVariantTime(&systemtime, &pvDateCreated.date) == TRUE)
- {
- hr = pValues->SetValue(WPD_OBJECT_DATE_CREATED, &pvDateCreated);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_CREATED");
- }
- else
- {
- LONG lError = GetLastError();
- hr = HRESULT_FROM_WIN32(lError);
- }
-
- PropVariantClear(&pvDateCreated);
- }
- }
- }
- }
- else if (strObjectID.CompareNoCase(README_FILE_OBJECT_ID) == 0)
- {
- for (DWORD dwIndex = 0; dwIndex < cKeys; dwIndex++)
- {
- PROPERTYKEY Key = WPD_PROPERTY_NULL;
- hr = pKeys->GetAt(dwIndex, &Key);
- CHECK_HR(hr, "Failed to get PROPERTYKEY at index %d in collection", dwIndex);
-
- if (hr == S_OK)
- {
- // Preset the property value to 'error not supported'. The actual value
- // will replace this value, if read from the device.
- pValues->SetErrorValue(Key, HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED));
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_ID, README_FILE_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_PERSISTENT_UNIQUE_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_PERSISTENT_UNIQUE_ID, README_FILE_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_PERSISTENT_UNIQUE_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_PARENT_ID))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_PARENT_ID, DOCUMENTS_FOLDER_OBJECT_ID);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_PARENT_ID");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_NAME))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_NAME, README_FILE_OBJECT_NAME_VALUE);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_NAME");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_ORIGINAL_FILE_NAME))
- {
- hr = pValues->SetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, README_FILE_OBJECT_ORIGINAL_FILE_NAME_VALUE);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_ORIGINAL_FILE_NAME");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_FORMAT))
- {
- hr = pValues->SetGuidValue(WPD_OBJECT_FORMAT, GetObjectFormat(strObjectID));
- CHECK_HR(hr, "Failed to set WPD_OBJECT_FORMAT");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_CONTENT_TYPE))
- {
- hr = pValues->SetGuidValue(WPD_OBJECT_CONTENT_TYPE, GetObjectContentType(strObjectID));
- CHECK_HR(hr, "Failed to set WPD_OBJECT_CONTENT_TYPE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_CAN_DELETE))
- {
- hr = pValues->SetBoolValue(WPD_OBJECT_CAN_DELETE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_CAN_DELETE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_SIZE))
- {
- hr = pValues->SetUnsignedLargeIntegerValue(WPD_OBJECT_SIZE, GetObjectSize(strObjectID));
- CHECK_HR(hr, "Failed to set WPD_OBJECT_SIZE");
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_MODIFIED))
- {
- PROPVARIANT pvDateModified = {0};
- SYSTEMTIME systemtime = {0};
-
- systemtime.wMonth = 6;
- systemtime.wDay = 26;
- systemtime.wYear = 2006;
- systemtime.wHour = 5;
-
- // Initialize the Date Modified PROPVARIANT value
- PropVariantInit(&pvDateModified);
-
- pvDateModified.vt = VT_DATE;
- if (SystemTimeToVariantTime(&systemtime, &pvDateModified.date) == TRUE)
- {
- hr = pValues->SetValue(WPD_OBJECT_DATE_MODIFIED, &pvDateModified);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_MODIFIED");
- }
- else
- {
- LONG lError = GetLastError();
- hr = HRESULT_FROM_WIN32(lError);
- }
-
- PropVariantClear(&pvDateModified);
- }
-
- if (IsEqualPropertyKey(Key, WPD_OBJECT_DATE_CREATED))
- {
- PROPVARIANT pvDateCreated = {0};
- SYSTEMTIME systemtime = {0};
-
- systemtime.wMonth = 1;
- systemtime.wDay = 24;
- systemtime.wYear = 2006;
- systemtime.wHour = 12;
-
- // Initialize the Date Created PROPVARIANT value
- PropVariantInit(&pvDateCreated);
-
- pvDateCreated.vt = VT_DATE;
- if (SystemTimeToVariantTime(&systemtime, &pvDateCreated.date) == TRUE)
- {
- hr = pValues->SetValue(WPD_OBJECT_DATE_CREATED, &pvDateCreated);
- CHECK_HR(hr, "Failed to set WPD_OBJECT_DATE_CREATED");
- }
- else
- {
- LONG lError = GetLastError();
- hr = HRESULT_FROM_WIN32(lError);
- }
-
- PropVariantClear(&pvDateCreated);
- }
- }
- }
- }
- }
-
- return hr;
-}
-
-/**
- * This method is called to populate property attributes for the object and property specified.
- *
- * The parameters sent to us are:
- * wszObjectID - the object whose property attributes are being requested.
- * Key - the property whose attributes are being requested
- * pAttributes - an IPortableDeviceValues which will contain the resulting property attributes
- *
- * The driver should:
- * Read the property attributes for the specified property on the specified object and
- * populate pAttributes with the results.
- */
-HRESULT WpdObjectProperties::GetPropertyAttributesForObject(
- _In_ LPCWSTR wszObjectID,
- _In_ REFPROPERTYKEY Key,
- _In_ IPortableDeviceValues* pAttributes)
-{
- HRESULT hr = S_OK;
-
- if ((wszObjectID == NULL) ||
- (pAttributes == NULL))
- {
- hr = E_INVALIDARG;
- return hr;
- }
-
- UNREFERENCED_PARAMETER(wszObjectID);
- UNREFERENCED_PARAMETER(Key);
-
- //
- // Since ALL of our properties have the same attributes, we are ignoring the
- // passed in wszObjectID and Key parameters. These parameters allow you to
- // customize attributes for properties on specific objects. (i.e. WPD_OBJECT_ORIGINAL_FILE_NAME
- // may be READ/WRITE on some objects and READONLY on others. )
- //
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_DELETE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_DELETE");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_READ, TRUE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_READ");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_CAN_WRITE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_CAN_WRITE");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_PROPERTY_ATTRIBUTE_FAST_PROPERTY, TRUE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_FAST_PROPERTY");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetUnsignedIntegerValue(WPD_PROPERTY_ATTRIBUTE_FORM, WPD_PROPERTY_ATTRIBUTE_FORM_UNSPECIFIED);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_ATTRIBUTE_FORM");
- }
-
- return hr;
-}
-
-/**
- * This method is called to return the total size of the specified object
- *
- * The parameters sent to us are:
- * strObjectID - the object whose total size is being requested.
- *
- * The driver should:
- * Calculate or read the total size of the object and return it to the caller.
- */
-ULONGLONG GetObjectSize(_In_ LPCWSTR wszObjectID)
-{
- ULONGLONG FileObjectSize = 0;
-
- if (_wcsicmp(wszObjectID, README_FILE_OBJECT_ID) == 0)
- {
- size_t cbFileObjectContents = 0;
- if (SUCCEEDED(StringCbLengthA(README_FILE_OBJECT_CONTENTS, STRSAFE_MAX_CCH*sizeof(CHAR), &cbFileObjectContents)))
- {
- // StringCbLength() returns the size of the string excluding the null terminator,
- // so we will account for it in our size calculation.
- FileObjectSize = cbFileObjectContents + sizeof(CHAR);
- }
- }
-
- return FileObjectSize;
-}
-
-/**
- * This method is called to return the WPD format of the specified object
- *
- * The parameters sent to us are:
- * strObjectID - the object whose WPD format is being requested.
- *
- * The driver should:
- * Read the native format of the object and return a WPD format to the caller.
- */
-GUID GetObjectFormat(_In_ LPCWSTR wszObjectID)
-{
- GUID FileObjectFormat = WPD_OBJECT_FORMAT_UNSPECIFIED;
-
- if (_wcsicmp(wszObjectID, README_FILE_OBJECT_ID) == 0)
- {
- FileObjectFormat = WPD_OBJECT_FORMAT_TEXT;
- }
-
- return FileObjectFormat;
-}
-
-/**
- * This method is called to return the WPD content type of the specified object
- *
- * The parameters sent to us are:
- * strObjectID - the object whose WPD content type is being requested.
- *
- * The driver should:
- * Read the native content type of the object and return a WPD content type to the caller.
- */
-GUID GetObjectContentType(_In_ LPCWSTR wszObjectID)
-{
- GUID FileObjectFormat = WPD_CONTENT_TYPE_UNSPECIFIED;
-
- if (_wcsicmp(wszObjectID, README_FILE_OBJECT_ID) == 0)
- {
- FileObjectFormat = WPD_CONTENT_TYPE_DOCUMENT;
- }
-
- return FileObjectFormat;
-}
diff --git a/wpd/WpdMultiTransportDriver/WpdObjectProperties.h b/wpd/WpdMultiTransportDriver/WpdObjectProperties.h
deleted file mode 100644
index d76be32d..00000000
--- a/wpd/WpdMultiTransportDriver/WpdObjectProperties.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#pragma once
-
-#define DEVICE_PROTOCOL_VALUE L"Multi-Transport Protocol ver 1.00"
-#define DEVICE_FIRMWARE_VERSION_VALUE L"1.0.0.0"
-#define DEVICE_POWER_LEVEL_VALUE 100
-#define DEVICE_MODEL_VALUE L"Multi-Transport"
-#define DEVICE_FRIENDLY_NAME_VALUE L"Multi-Transport Hello World!"
-#define DEVICE_MANUFACTURER_VALUE L"Windows Portable Devices Group"
-#define DEVICE_SERIAL_NUMBER_VALUE L"01234567890123-45676890123456"
-#define DEVICE_SUPPORTS_NONCONSUMABLE_VALUE TRUE
-
-#define STORAGE_OBJECT_ID L"123ABC"
-#define STORAGE_CAPACITY_VALUE 1024 * 1024
-#define STORAGE_FREE_SPACE_IN_BYTES_VALUE STORAGE_CAPACITY_VALUE
-#define STORAGE_SERIAL_NUMBER_VALUE L"98765432109876-54321098765432"
-#define STORAGE_OBJECT_NAME_VALUE L"Internal Memory"
-#define STORAGE_FILE_SYSTEM_TYPE_VALUE L"FAT32"
-#define STORAGE_DESCRIPTION_VALUE L"Hello World! Memory Storage System"
-
-#define DOCUMENTS_FOLDER_OBJECT_ID L"XYZ456"
-#define DOCUMENTS_FOLDER_OBJECT_NAME_VALUE L"Documents Folder"
-#define DOCUMENTS_FOLDER_OBJECT_ORIGINAL_FILE_NAME_VALUE L"Documents"
-
-#define README_FILE_OBJECT_ID L"6543210"
-#define README_FILE_OBJECT_NAME_VALUE L"Sample ReadMe Text File"
-#define README_FILE_OBJECT_ORIGINAL_FILE_NAME_VALUE L"ReadMe.txt"
-#define README_FILE_OBJECT_CONTENTS "Hello World!\r\nThis is a text file transferred from the WPD Multi-Transport Hello World sample driver.\r\n"
-
-ULONGLONG GetObjectSize(_In_ LPCWSTR strObjectID);
-GUID GetObjectFormat(_In_ LPCWSTR strObjectID);
-GUID GetObjectContentType(_In_ LPCWSTR strObjectID);
-HRESULT AddSupportedPropertyKeys(_In_ LPCWSTR wszObjectID,
- _In_ IPortableDeviceKeyCollection* pKeys);
-
-VOID AddCommonPropertyKeys(_In_ IPortableDeviceKeyCollection* pKeys);
-VOID AddDevicePropertyKeys(_In_ IPortableDeviceKeyCollection* pKeys);
-VOID AddStoragePropertyKeys(_In_ IPortableDeviceKeyCollection* pKeys);
-VOID AddFilePropertyKeys(_In_ IPortableDeviceKeyCollection* pKeys);
-VOID AddFolderPropertyKeys(_In_ IPortableDeviceKeyCollection* pKeys);
-
-class WpdObjectProperties
-{
-public:
- WpdObjectProperties();
- virtual ~WpdObjectProperties();
-
- HRESULT Initialize();
-
- HRESULT DispatchWpdMessage(_In_ REFPROPERTYKEY Command,
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetSupportedProperties(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetPropertyValues(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetAllPropertyValues(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnSetPropertyValues(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetPropertyAttributes(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnDeleteProperties(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
-private:
- HRESULT GetPropertyValuesForObject(_In_ LPCWSTR wszObjectID,
- _In_ IPortableDeviceKeyCollection* pKeys,
- _In_ IPortableDeviceValues* pValues);
-
- HRESULT GetPropertyAttributesForObject(_In_ LPCWSTR wszObjectID,
- _In_ REFPROPERTYKEY Key,
- _In_ IPortableDeviceValues* pAttributes);
-};
diff --git a/wpd/WpdMultiTransportDriver/WpdObjectResources.cpp b/wpd/WpdMultiTransportDriver/WpdObjectResources.cpp
deleted file mode 100644
index 456af6dc..00000000
--- a/wpd/WpdMultiTransportDriver/WpdObjectResources.cpp
+++ /dev/null
@@ -1,674 +0,0 @@
-#include "stdafx.h"
-#include "WpdObjectResources.tmh"
-
-WpdObjectResources::WpdObjectResources()
-{
-
-}
-
-WpdObjectResources::~WpdObjectResources()
-{
-
-}
-
-HRESULT WpdObjectResources::DispatchWpdMessage(
- _In_ REFPROPERTYKEY Command,
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
-
- if (Command.fmtid != WPD_CATEGORY_OBJECT_RESOURCES)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "This object does not support this command category %ws",CComBSTR(Command.fmtid));
- }
-
- if (hr == S_OK)
- {
- if (IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_RESOURCES_GET_SUPPORTED))
- {
- hr = OnGetSupportedResources(pParams, pResults);
- CHECK_HR(hr, "Failed to get supported resources");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_RESOURCES_OPEN))
- {
- hr = OnOpenResource(pParams, pResults);
- CHECK_HR(hr, "Failed to open resource");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_RESOURCES_READ))
- {
- hr = OnReadResource(pParams, pResults);
- CHECK_HR(hr, "Failed to read resource");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_RESOURCES_CLOSE))
- {
- hr = OnCloseResource(pParams, pResults);
- CHECK_HR(hr, "Failed to close resource");
- }
- else if (IsEqualPropertyKey(Command, WPD_COMMAND_OBJECT_RESOURCES_GET_ATTRIBUTES))
- {
- hr = OnGetResourceAttributes(pParams, pResults);
- CHECK_HR(hr, "Failed to get resource attributes");
- }
- else
- {
- hr = E_NOTIMPL;
- CHECK_HR(hr, "This object does not support this command id %d", Command.pid);
- }
- }
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_RESOURCES_GET_SUPPORTED
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_RESOURCES_OBJECT_ID: identifies the object whose resources we want to return.
- *
- * The driver should:
- * - Return all resources for this object in WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_KEYS.
- */
-HRESULT WpdObjectResources::OnGetSupportedResources(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszObjectID = NULL;
-
- CComPtr<IPortableDeviceKeyCollection> pKeys;
-
- // Get the Object ID
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_RESOURCES_OBJECT_ID, &wszObjectID);
- if (hr != S_OK)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_RESOURCES_OBJECT_ID");
- }
-
- // Create the collection to hold the resource keys
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceKeyCollection,
- (VOID**) &pKeys);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceKeyCollection");
- }
-
- if (hr == S_OK)
- {
- hr = GetSupportedResourcesForObject(wszObjectID, pKeys);
- CHECK_HR(hr, "Failed to get supported resources for object '%ws'", wszObjectID);
- }
-
- if (hr == S_OK)
- {
- hr = pResults->SetIUnknownValue(WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_KEYS, pKeys);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_KEYS");
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszObjectID);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_RESOURCES_GET_ATTRIBUTES
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_RESOURCES_OBJECT_ID: identifies the object whose resource attributes we want to return.
- * - WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_KEYS: a collection of property keys containing a single value,
- * which is the key identifying the specific resource we are requested to return attributes for.
- *
- * The driver should:
- * - Return the requested property attributes in WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_ATTRIBUTES.
- * If any resource attributes failed to be retrieved,
- * the corresponding value should be set to type VT_ERROR with the 'scode' member holding the
- * HRESULT reason for the failure.
- * - S_OK should be returned if all resource attributes were read successfully.
- * - S_FALSE should be returned if any resource attribute failed.
- * - Any error return indicates that the driver did not fill in any results, and the caller will
- * not attempt to unpack any property values.
- *
- */
-HRESULT WpdObjectResources::OnGetResourceAttributes(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszObjectID = NULL;
- PROPERTYKEY Key = WPD_PROPERTY_NULL;
- CComPtr<IPortableDeviceValues> pAttributes;
-
- if (hr == S_OK)
- {
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_RESOURCES_OBJECT_ID, &wszObjectID);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_RESOURCES_OBJECT_ID");
- }
-
- if (hr == S_OK)
- {
- hr = pParams->GetKeyValue(WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_KEYS, &Key);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_KEYS");
- }
-
- if (hr == S_OK)
- {
- hr = CoCreateInstance(CLSID_PortableDeviceValues,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IPortableDeviceValues,
- (VOID**) &pAttributes);
- CHECK_HR(hr, "Failed to CoCreate CLSID_PortableDeviceValues");
- }
-
- if (hr == S_OK)
- {
- hr = GetResourceAttributesForObject(wszObjectID, Key, pAttributes);
- CHECK_HR(hr, "Failed to get resource attributes");
- }
-
- if (SUCCEEDED(hr))
- {
- HRESULT hrTemp = S_OK;
-
- hrTemp = pResults->SetIPortableDeviceValuesValue(WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_ATTRIBUTES, pAttributes);
- CHECK_HR(hrTemp, ("Failed to set WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_ATTRIBUTES"));
-
- if(FAILED(hrTemp))
- {
- hr = hrTemp;
- }
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszObjectID);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_RESOURCES_OPEN
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_RESOURCES_OBJECT_ID: the object identifier of the
- * object which contains the specified resource
- *
- * - WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_KEYS: the specified resource
- * to open
- *
- * - WPD_PROPERTY_OBJECT_RESOURCES_ACCESS_MODE: the access mode to which to
- * open the specified resource
- *
- * The driver should:
- * - Create a new context for this resource operation.
- * - Return an identifier for the context in WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT.
- * - Set the optimal transfer size in WPD_PROPERTY_OBJECT_RESOURCES_OPTIMAL_TRANSFER_BUFFER_SIZE
- *
- */
-HRESULT WpdObjectResources::OnOpenResource(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszObjectID = NULL;
- PROPERTYKEY Key = WPD_PROPERTY_NULL;
- DWORD dwMode = STGM_READ;
- CAtlStringW strStrObjectID;
- CAtlStringW strResourceContext;
- ContextMap* pContextMap = NULL;
-
- // Get the Object identifier of the object which contains the specified resource
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_RESOURCES_OBJECT_ID, &wszObjectID);
- if (hr != S_OK)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_RESOURCES_OBJECT_ID");
- }
-
- // Get the resource key
- if (hr == S_OK)
- {
- hr = pParams->GetKeyValue(WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_KEYS, &Key);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_RESOURCES_RESOURCE_KEYS");
- }
-
- // Get the access mode
- if (hr == S_OK)
- {
- hr = pParams->GetUnsignedIntegerValue(WPD_PROPERTY_OBJECT_RESOURCES_ACCESS_MODE, &dwMode);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_RESOURCES_ACCESS_MODE");
- }
-
- // Validate whether the params given to us are correct. In this case, we need to check that the object
- // supports the resource requested, and can be opened in the requested access mode.
- if (hr == S_OK)
- {
- // In this sample, we only have one object (README_FILE_OBJECT_ID) which supports a
- // resource (WPD_RESOURCE_DEFAULT) for reading only.
- // So if any other Object ID or any other resource is specified, it must be invalid.
- strStrObjectID = wszObjectID;
- if(strStrObjectID.CompareNoCase(README_FILE_OBJECT_ID) != 0)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Object [%ws] does not support resources", wszObjectID);
- }
- if (hr == S_OK)
- {
- if (!IsEqualPropertyKey(Key, WPD_RESOURCE_DEFAULT))
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Only WPD_RESOURCE_DEFAULT is supported in this sample driver");
- }
- }
- if (hr == S_OK)
- {
- if ((dwMode & STGM_WRITE) != 0)
- {
- hr = E_ACCESSDENIED;
- CHECK_HR(hr, "This resource is not available for write access");
- }
- }
- }
-
- // Get the context map which the driver stored in pParams for convenience
- if (hr == S_OK)
- {
- hr = pParams->GetIUnknownValue(PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP, (IUnknown**)&pContextMap);
- CHECK_HR(hr, "Failed to get PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP");
- }
-
- // Create a new resource operation context, initialize it, and add it to the client context map.
- if (hr == S_OK)
- {
- WpdObjectResourceContext* pResourceContext = new WpdObjectResourceContext();
- if (pResourceContext != NULL)
- {
- // Initialize the resource context with ...
- pResourceContext->m_strObjectID = wszObjectID;
- pResourceContext->m_Resource = Key;
- pResourceContext->m_BytesTransferred = 0;
- pResourceContext->m_BytesTotal = GetObjectSize(wszObjectID);
-
- // Add the resource context to the context map
- pContextMap->Add(pResourceContext, strResourceContext);
- }
- else
- {
- hr = E_OUTOFMEMORY;
- CHECK_HR(hr, "Failed to allocate resource context");
- }
- SAFE_RELEASE(pResourceContext);
- }
-
- if (hr == S_OK)
- {
- hr = pResults->SetStringValue(WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT, strResourceContext);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT");
- }
-
- // Set the optimal buffer size
- if (hr == S_OK)
- {
- hr = pResults->SetUnsignedIntegerValue(WPD_PROPERTY_OBJECT_RESOURCES_OPTIMAL_TRANSFER_BUFFER_SIZE, FILE_OPTIMAL_READ_BUFFER_SIZE_VALUE);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_OBJECT_RESOURCES_OPTIMAL_TRANSFER_BUFFER_SIZE value");
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszObjectID);
-
- SAFE_RELEASE(pContextMap);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_RESOURCES_READ
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT: the context the driver returned to
- * the client in OnOpenResource.
- * - WPD_PROPERTY_OBJECT_RESOURCES_NUM_BYTES_TO_READ: the number of bytes to
- * read from the resource.
- *
- * The driver should:
- * - Read data associated with the resource and return it back to the caller in
- * WPD_PROPERTY_OBJECT_RESOURCES_DATA.
- * - Report the number of bytes actually read from the resource in
- * WPD_PROPERTY_OBJECT_RESOURCES_NUM_BYTES_READ. This number may be smaller
- * than WPD_PROPERTY_OBJECT_RESOURCES_NUM_BYTES_TO_READ when reading the last
- * chunk of data from the resource.
- */
-HRESULT WpdObjectResources::OnReadResource(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszResourceContext = NULL;
- DWORD dwNumBytesToRead = 0;
- DWORD dwNumBytesRead = 0;
- BYTE* pBuffer = NULL;
- WpdObjectResourceContext* pResourceContext = NULL;
- ContextMap* pContextMap = NULL;
-
- // Get the enumeration context identifier for this enumeration operation. We will
- // need this to lookup the specific enumeration context in the client context map.
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT, &wszResourceContext);
- if (hr != S_OK)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT");
- }
-
- // Get the number of bytes to read
- if (hr == S_OK)
- {
- hr = pParams->GetUnsignedIntegerValue(WPD_PROPERTY_OBJECT_RESOURCES_NUM_BYTES_TO_READ, &dwNumBytesToRead);
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_RESOURCES_NUM_BYTES_TO_READ");
- }
-
- // Allocate the destination buffer
- if (hr == S_OK)
- {
- pBuffer = reinterpret_cast<BYTE *>(CoTaskMemAlloc(dwNumBytesToRead));
- if (pBuffer == NULL)
- {
- hr = E_OUTOFMEMORY;
- CHECK_HR(hr, "Failed to allocate the destination buffer");
- }
- }
-
- // Get the client context map so we can retrieve the resource context for this resource
- // operation using the WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT property value obtained above.
- if (hr == S_OK)
- {
- hr = pParams->GetIUnknownValue(PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP, (IUnknown**)&pContextMap);
- CHECK_HR(hr, "Failed to get PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP");
- }
-
- if (hr == S_OK)
- {
- pResourceContext = (WpdObjectResourceContext*)pContextMap->GetContext(wszResourceContext);
- if (pResourceContext == NULL)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing resource context");
- }
- }
-
- // Read the next chunk of data for this request
- if (hr == S_OK && pBuffer != NULL)
- {
- hr = ReadDataFromResource(pResourceContext, pBuffer, dwNumBytesToRead, &dwNumBytesRead);
- CHECK_HR(hr, "Failed to read %d bytes from resource", dwNumBytesToRead);
- }
-
- if (hr == S_OK && pBuffer != NULL)
- {
- hr = pResults->SetBufferValue(WPD_PROPERTY_OBJECT_RESOURCES_DATA, pBuffer, dwNumBytesRead);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_OBJECT_RESOURCES_DATA");
- }
-
- if (hr == S_OK)
- {
- hr = pResults->SetUnsignedIntegerValue(WPD_PROPERTY_OBJECT_RESOURCES_NUM_BYTES_READ, dwNumBytesRead);
- CHECK_HR(hr, "Failed to set WPD_PROPERTY_OBJECT_RESOURCES_NUM_BYTES_READ");
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszResourceContext);
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(pBuffer);
-
- SAFE_RELEASE(pContextMap);
-
- return hr;
-}
-
-/**
- * This method is called when we receive a WPD_COMMAND_OBJECT_RESOURCES_CLOSE
- * command.
- *
- * The parameters sent to us are:
- * - WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT: the context the driver returned to
- * the client in OnOpenResource.
- *
- * The driver should:
- * - Destroy any data associated with this context.
- */
-HRESULT WpdObjectResources::OnCloseResource(
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults)
-{
- HRESULT hr = S_OK;
- LPWSTR wszResourceContext = NULL;
- ContextMap* pContextMap = NULL;
-
- UNREFERENCED_PARAMETER(pResults);
-
- // First get ALL parameters for this command. If we cannot get ALL parameters
- // then E_INVALIDARG should be returned and no further processing should occur.
-
- // Get the resource context identifier for this resource operation. We will
- // need this to lookup the specific resource context in the client context map.
- hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT, &wszResourceContext);
- if (hr != S_OK)
- {
- hr = E_INVALIDARG;
- CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT");
- }
-
- // Get the client context map so we can retrieve the resource context for this resource
- // operation using the WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT property value obtained above.
- if (hr == S_OK)
- {
- hr = pParams->GetIUnknownValue(PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP, (IUnknown**)&pContextMap);
- CHECK_HR(hr, "Failed to get PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP");
- }
-
- // Destroy any data allocated/associated with the resource context and then remove it from the context map.
- // We no longer need to keep this context around because the resource operation has been ended.
- if (hr == S_OK)
- {
- pContextMap->Remove(wszResourceContext);
- }
-
- // Free the memory. CoTaskMemFree ignores NULLs so no need to check.
- CoTaskMemFree(wszResourceContext);
-
- SAFE_RELEASE(pContextMap);
-
- return hr;
-}
-
-/**
- * This method is called to populate PROPERTYKEYs found on objects.
- *
- * The parameters sent to us are:
- * wszObjectID - the object whose supported resource keys are being requested
- * pKeys - An IPortableDeviceKeyCollection to be populated with supported PROPERTYKEYs
- *
- * The driver should:
- * Add PROPERTYKEYs pertaining to the specified object.
- */
-HRESULT WpdObjectResources::GetSupportedResourcesForObject(
- _In_ LPCWSTR wszObjectID,
- _In_ IPortableDeviceKeyCollection* pKeys)
-{
- HRESULT hr = S_OK;
- CAtlStringW strObjectID;
-
- if ((wszObjectID == NULL) ||
- (pKeys == NULL))
- {
- hr = E_INVALIDARG;
- return hr;
- }
-
- strObjectID = wszObjectID;
-
- if (strObjectID.CompareNoCase(README_FILE_OBJECT_ID) == 0)
- {
- hr = pKeys->Add(WPD_RESOURCE_DEFAULT);
- CHECK_HR(hr, "Failed to set WPD_RESOURCE_DEFAULT");
- }
-
- return hr;
-}
-
-/**
- * This method is called to populate resource attributes found on a particular object
- * resource.
- *
- * The parameters sent to us are:
- * wszObjectID - the object whose resource attributes are being requested
- * Key - the resource on the specified object whose attributes are being returned
- * pAttributes - An IPortableDeviceValues to be populated with resource attributes.
- *
- * The driver should:
- * Add attributes pertaining to the resource on the specified object.
- */
-HRESULT WpdObjectResources::GetResourceAttributesForObject(
- _In_ LPCWSTR wszObjectID,
- _In_ REFPROPERTYKEY Key,
- _In_ IPortableDeviceValues* pAttributes)
-{
- HRESULT hr = S_OK;
- CAtlStringW strObjectID;
-
- if ((wszObjectID == NULL) ||
- (pAttributes == NULL))
- {
- hr = E_INVALIDARG;
- return hr;
- }
-
- strObjectID = wszObjectID;
-
- if ((strObjectID.CompareNoCase(README_FILE_OBJECT_ID) == 0) && (IsEqualPropertyKey(Key, WPD_RESOURCE_DEFAULT)))
- {
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_RESOURCE_ATTRIBUTE_CAN_DELETE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_CAN_DELETE");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetUnsignedLargeIntegerValue(WPD_RESOURCE_ATTRIBUTE_TOTAL_SIZE, GetObjectSize(strObjectID));
- CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_TOTAL_SIZE");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_RESOURCE_ATTRIBUTE_CAN_READ, TRUE);
- CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_CAN_READ");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_RESOURCE_ATTRIBUTE_CAN_WRITE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_CAN_WRITE");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetBoolValue(WPD_RESOURCE_ATTRIBUTE_CAN_DELETE, FALSE);
- CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_CAN_DELETE");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetGuidValue(WPD_RESOURCE_ATTRIBUTE_FORMAT, GetObjectFormat(strObjectID));
- CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_FORMAT");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetUnsignedIntegerValue(WPD_RESOURCE_ATTRIBUTE_OPTIMAL_READ_BUFFER_SIZE, FILE_OPTIMAL_READ_BUFFER_SIZE_VALUE);
- CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_OPTIMAL_READ_BUFFER_SIZE");
- }
-
- if (hr == S_OK)
- {
- hr = pAttributes->SetUnsignedIntegerValue(WPD_RESOURCE_ATTRIBUTE_OPTIMAL_WRITE_BUFFER_SIZE, FILE_OPTIMAL_WRITE_BUFFER_SIZE_VALUE);
- CHECK_HR(hr, "Failed to set WPD_RESOURCE_ATTRIBUTE_OPTIMAL_WRITE_BUFFER_SIZE");
- }
- }
-
- return hr;
-}
-
-/**
- * This method is called to read data from a particular object
- * resource.
- *
- * The parameters sent to us are:
- * pResourceContext - the resource operation context
- * pBuffer - the buffer to read the resource data into
- * dwNumBytesToRead - number of bytes to read into the resource. This is also
- * the total size of the passed in pBuffer.
- * pdwNumBytesRead - On return, should contain the actual number of bytes read into pBuffer
- *
- * The driver should:
- * - Read data from the specified resource
- * - Update the resource operation context with transfer state information
- * - Return the actual number of bytes written in pdwNumBytesRead.
- */
-HRESULT WpdObjectResources::ReadDataFromResource(
- _In_ WpdObjectResourceContext* pResourceContext,
- _Out_writes_to_(dwNumBytesToRead, *pdwNumBytesRead) BYTE* pBuffer,
- DWORD dwNumBytesToRead,
- _Out_ DWORD* pdwNumBytesRead)
-{
- HRESULT hr = S_OK;
-
- if ((pResourceContext == NULL) ||
- (pBuffer == NULL) ||
- (pdwNumBytesRead == NULL))
- {
- hr = E_INVALIDARG;
- return hr;
- }
-
- *pdwNumBytesRead = 0;
- ZeroMemory(pBuffer, dwNumBytesToRead * sizeof(BYTE));
-
- // If we have data left to transfer, then transfer up to dwNumBytesToRead
- // if possible.
- if (pResourceContext->m_BytesTotal >= pResourceContext->m_BytesTransferred)
- {
- dwNumBytesToRead = (DWORD)min((ULONGLONG)dwNumBytesToRead,(pResourceContext->m_BytesTotal - pResourceContext->m_BytesTransferred));
- }
-
- // Read the data from the resource
- if (dwNumBytesToRead > 0)
- {
- // If we are reading from our single file resource, make sure you read
- // from the proper source data contents.
- if (pResourceContext->m_strObjectID.CompareNoCase(README_FILE_OBJECT_ID) == 0)
- {
- hr = StringCbCopyA((LPSTR)pBuffer, dwNumBytesToRead, README_FILE_OBJECT_CONTENTS);
- CHECK_HR(hr, "StringCbCopyA failed, dwNumBytesToRead = %ld", dwNumBytesToRead);
- }
- }
-
- if (SUCCEEDED(hr))
- {
- // update the number of bytes transferred in the resource context
- pResourceContext->m_BytesTransferred += dwNumBytesToRead;
-
- // set the number of bytes actually read into to pBuffer
- *pdwNumBytesRead = dwNumBytesToRead;
- }
-
- return hr;
-}
diff --git a/wpd/WpdMultiTransportDriver/WpdObjectResources.h b/wpd/WpdMultiTransportDriver/WpdObjectResources.h
deleted file mode 100644
index e9d4fb63..00000000
--- a/wpd/WpdMultiTransportDriver/WpdObjectResources.h
+++ /dev/null
@@ -1,111 +0,0 @@
-#pragma once
-
-#define FILE_OPTIMAL_READ_BUFFER_SIZE_VALUE (2 * 1024 * 1024)
-#define FILE_OPTIMAL_WRITE_BUFFER_SIZE_VALUE (2 * 1024 * 1024)
-
-// This class is used to store the context for a specific resource operation.
-class WpdObjectResourceContext : public IUnknown
-{
-public:
- WpdObjectResourceContext() :
- m_cRef(1),
- m_Resource(WPD_RESOURCE_DEFAULT),
- m_BytesTransferred(0),
- m_BytesTotal(0)
- {
-
- }
-
- ~WpdObjectResourceContext()
- {
-
- }
-
-public: // IUnknown
- ULONG __stdcall AddRef()
- {
- InterlockedIncrement((long*) &m_cRef);
- return m_cRef;
- }
-
- _At_(this, __drv_freesMem(Mem))
- ULONG __stdcall Release()
- {
- ULONG ulRefCount = m_cRef - 1;
-
- if (InterlockedDecrement((long*) &m_cRef) == 0)
- {
- delete this;
- return 0;
- }
- return ulRefCount;
- }
-
- HRESULT __stdcall QueryInterface(
- REFIID riid,
- void** ppv)
- {
- HRESULT hr = S_OK;
-
- if(riid == IID_IUnknown)
- {
- *ppv = static_cast<IUnknown*>(this);
- AddRef();
- }
- else
- {
- *ppv = NULL;
- hr = E_NOINTERFACE;
- }
-
- return hr;
- }
-
-private:
- DWORD m_cRef;
-
-// WpdObjectResourceContext specific data
-public:
- CAtlStringW m_strObjectID; // object identifier of the object whose resource is being transferred
- PROPERTYKEY m_Resource; // the specific resource being transferred
- ULONGLONG m_BytesTransferred; // number of bytes transferred from the resource to the caller
- ULONGLONG m_BytesTotal; // total number of bytes of the resource data
-};
-
-class WpdObjectResources
-{
-public:
- WpdObjectResources();
- virtual ~WpdObjectResources();
-
- HRESULT DispatchWpdMessage(_In_ REFPROPERTYKEY Command,
- _In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetSupportedResources(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnGetResourceAttributes(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnOpenResource(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnReadResource(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-
- HRESULT OnCloseResource(_In_ IPortableDeviceValues* pParams,
- _In_ IPortableDeviceValues* pResults);
-private:
- HRESULT GetSupportedResourcesForObject(_In_ LPCWSTR wszObjectID,
- _In_ IPortableDeviceKeyCollection* pKeys);
-
- HRESULT GetResourceAttributesForObject(_In_ LPCWSTR wszObjectID,
- _In_ REFPROPERTYKEY Key,
- _In_ IPortableDeviceValues* pAttributes);
-
- HRESULT ReadDataFromResource(_In_ WpdObjectResourceContext* pResourceContext,
- _Out_writes_to_(dwNumBytesToRead, *pdwNumBytesRead) BYTE* pBuffer,
- DWORD dwNumBytesToRead,
- _Out_ DWORD* pdwNumBytesRead);
-};
diff --git a/wpd/WpdMultiTransportDriver/resource.h b/wpd/WpdMultiTransportDriver/resource.h
deleted file mode 100644
index d59fe80e..00000000
--- a/wpd/WpdMultiTransportDriver/resource.h
+++ /dev/null
@@ -1,3 +0,0 @@
-#pragma once
-#define IDR_WpdMultiTransportDriver 101
-
diff --git a/wpd/WpdMultiTransportDriver/stdafx.h b/wpd/WpdMultiTransportDriver/stdafx.h
deleted file mode 100644
index 67b8525b..00000000
--- a/wpd/WpdMultiTransportDriver/stdafx.h
+++ /dev/null
@@ -1,266 +0,0 @@
-#pragma once
-
-#include "resource.h"
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif
-
-#define STRSAFE_NO_DEPRECATE
-
-#include <stdio.h>
-#include <tchar.h>
-#include <strsafe.h>
-
-#include <atlbase.h>
-#include <atlcom.h>
-#include <atlcoll.h>
-#include <atlstr.h>
-
-#ifndef SAFE_RELEASE
- #define SAFE_RELEASE(p) if( NULL != p ) { ( p )->Release(); p = NULL; }
-#endif
-
-#include "WpdMultiTransportDriver.h"
-#include "PortableDeviceTypes.h"
-#include "PortableDeviceClassExtension.h"
-#include "PortableDevice.h"
-
-#include <initguid.h>
-#include <propkeydef.h>
-
-// {CDD18979-A7B0-4D5E-9EB2-0A826805CBBD}
-DEFINE_PROPERTYKEY(PRIVATE_SAMPLE_DRIVER_WUDF_DEVICE_OBJECT, 0xCDD18979, 0xA7B0, 0x4D5E, 0x9E, 0xB2, 0x0A, 0x82, 0x68, 0x05, 0xCB, 0xBD, 2);
-// {9BD949E5-59CF-41AE-90A9-BE1D044F578F}
-DEFINE_PROPERTYKEY(PRIVATE_SAMPLE_DRIVER_WPD_SERIALIZER_OBJECT, 0x9BD949E5, 0x59CF, 0x41AE, 0x90, 0xA9, 0xBE, 0x1D, 0x04, 0x4F, 0x57, 0x8F, 2);
-// {4DF6C8C7-2CE5-457C-9F53-EFCECAA95C04}
-DEFINE_PROPERTYKEY(PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP, 0x4DF6C8C7, 0x2CE5, 0x457C, 0x9F, 0x53, 0xEF, 0xCE, 0xCA, 0xA9, 0x5C, 0x04, 2);
-
-class ContextMap : public IUnknown
-{
-public:
- ContextMap() :
- m_cRef(1)
- {
-
- }
-
- ~ContextMap()
- {
- CComCritSecLock<CComAutoCriticalSection> Lock(m_CriticalSection);
-
- IUnknown* pUnk = NULL;
- POSITION elementPosition = NULL;
-
- elementPosition = m_Map.GetStartPosition();
- while(elementPosition != NULL)
- {
- pUnk = m_Map.GetNextValue(elementPosition);
- if(pUnk != NULL)
- {
- pUnk->Release();
- }
- }
- }
-
-public: // IUnknown
- ULONG __stdcall AddRef()
- {
- InterlockedIncrement((long*) &m_cRef);
- return m_cRef;
- }
-
- _At_(this, __drv_freesMem(Mem))
- ULONG __stdcall Release()
- {
- ULONG ulRefCount = m_cRef - 1;
-
- if (InterlockedDecrement((long*) &m_cRef) == 0)
- {
- delete this;
- return 0;
- }
- return ulRefCount;
- }
-
- HRESULT __stdcall QueryInterface(
- REFIID riid,
- void** ppv)
- {
- HRESULT hr = S_OK;
-
- if(riid == IID_IUnknown)
- {
- *ppv = static_cast<IUnknown*>(this);
- AddRef();
- }
- else
- {
- *ppv = NULL;
- hr = E_NOINTERFACE;
- }
- return hr;
- }
-
-
-public: // Context accessor methods
-
- // If successful, this method AddRef's the context and returns
- // a context key
- HRESULT Add(
- _In_ IUnknown* pContext,
- _Out_ CAtlStringW& key)
- {
- CComCritSecLock<CComAutoCriticalSection> Lock(m_CriticalSection);
- HRESULT hr = S_OK;
- GUID guidContext = GUID_NULL;
- CComBSTR bstrContext;
-
- key = L"";
-
- // Create a unique context key
- hr = CoCreateGuid(&guidContext);
- if (hr == S_OK)
- {
- bstrContext = guidContext;
- if(bstrContext.Length() > 0)
- {
- key = bstrContext;
- }
- else
- {
- hr = E_OUTOFMEMORY;
- }
- }
-
- if (hr == S_OK)
- {
- // Insert this into the map
- POSITION elementPosition = m_Map.SetAt(key, pContext);
- if(elementPosition != NULL)
- {
- // AddRef since we are holding onto it
- pContext->AddRef();
- }
- else
- {
- hr = E_OUTOFMEMORY;
- }
- }
- return hr;
- }
-
- void Remove(
- _In_ const CAtlStringW& key)
- {
- CComCritSecLock<CComAutoCriticalSection> Lock(m_CriticalSection);
- // Get the element
- IUnknown* pContext = NULL;
-
- if (m_Map.Lookup(key, pContext) == true)
- {
- // Remove the entry for it
- m_Map.RemoveKey(key);
-
- // Release it
- pContext->Release();
- }
- }
-
- // Returns the context pointer. If not found, return value is NULL.
- // If non-NULL, caller is responsible for Releasing when it is done,
- // since this method will AddRef the context.
- IUnknown* GetContext(
- _In_ const CAtlStringW& key)
- {
- CComCritSecLock<CComAutoCriticalSection> Lock(m_CriticalSection);
- // Get the element
- IUnknown* pContext = NULL;
-
- if (m_Map.Lookup(key, pContext) == true)
- {
- // AddRef
- pContext->AddRef();
- }
- return pContext;
- }
-
-private:
- CComAutoCriticalSection m_CriticalSection;
- CAtlMap<CAtlStringW, IUnknown*> m_Map;
- DWORD m_cRef;
-};
-
-HRESULT UpdateDeviceFriendlyName(
- _In_ IPortableDeviceClassExtension* pPortableDeviceClassExtension,
- _In_ PCWSTR wszDeviceFriendlyName);
-
-#include "WpdObjectEnum.h"
-#include "WpdObjectProperties.h"
-#include "WpdObjectResources.h"
-#include "WpdCapabilities.h"
-#include "WpdBaseDriver.h"
-
-extern HINSTANCE g_hInstance;
-
-//
-// Driver specific tracing #defines
-//
-// TODO: Change these values to be appropriate for your driver.
-//
-#define MYDRIVER_TRACING_ID L"Microsoft\\WPD\\MultiTransportDriver"
-
-//
-// TODO: Choose a different trace control GUID
-//
-#define WPP_CONTROL_GUIDS \
- WPP_DEFINE_CONTROL_GUID(MultiTransportDriverCtlGuid,(300fbd95,366b,4d6a,b4d1,c426603ca2e6), \
- WPP_DEFINE_BIT(TRACE_FLAG_ALL) \
- WPP_DEFINE_BIT(TRACE_FLAG_DEVICE) \
- WPP_DEFINE_BIT(TRACE_FLAG_DRIVER) \
- WPP_DEFINE_BIT(TRACE_FLAG_QUEUE) \
- )
-
-#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) \
- WPP_LEVEL_LOGGER(flags)
-
-#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) \
- (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >= lvl)
-
-//
-// This comment block is scanned by the trace preprocessor to define our
-// TraceEvents function.
-//
-// begin_wpp config
-// FUNC Trace{FLAG=TRACE_FLAG_ALL}(LEVEL, MSG, ...);
-// FUNC TraceEvents(LEVEL, FLAGS, MSG, ...);
-// end_wpp
-
-//
-// This comment block is scanned by the trace preprocessor to define our
-// CHECK_HR function.
-//
-//
-// begin_wpp config
-// USEPREFIX (CHECK_HR,"%!STDPREFIX!");
-// FUNC CHECK_HR{FLAG=TRACE_FLAG_ALL}(hrCheck, MSG, ...);
-// USESUFFIX (CHECK_HR, " hr= %!HRESULT!", hrCheck);
-// end_wpp
-
-//
-// PRE macro: The name of the macro includes the condition arguments FLAGS and EXP
-// define in FUNC above
-//
-#define WPP_FLAG_hrCheck_PRE(FLAGS, hrCheck) {if(hrCheck != S_OK) {
-
-//
-// POST macro
-// The name of the macro includes the condition arguments FLAGS and EXP
-// define in FUNC above
-#define WPP_FLAG_hrCheck_POST(FLAGS, hrCheck) ; } }
-
-//
-// The two macros below are for checking if the event should be logged and for
-// choosing the logger handle to use when calling the ETW trace API
-//
-#define WPP_FLAG_hrCheck_ENABLED(FLAGS, hrCheck) WPP_FLAG_ENABLED(FLAGS)
-#define WPP_FLAG_hrCheck_LOGGER(FLAGS, hrCheck) WPP_FLAG_LOGGER(FLAGS)