1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#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;
};
|