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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
#pragma once
// This class is used to store the context for a specific enumeration.
// Currently, this is done by storing the object index.
class BulkPropertiesContext : public IUnknown
{
public:
BulkPropertiesContext() :
NextObject(0),
m_cRef(1)
{
}
~BulkPropertiesContext()
{
}
CComPtr<IPortableDevicePropVariantCollection> ObjectIDs;
DWORD NextObject;
CComPtr<IPortableDeviceKeyCollection> Properties;
CComPtr<IPortableDeviceValuesCollection> ValuesCollection;
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;
};
class WpdObjectPropertiesBulk
{
public:
WpdObjectPropertiesBulk();
~WpdObjectPropertiesBulk();
HRESULT Initialize(_In_ FakeDevice *pFakeDevice);
HRESULT DispatchWpdMessage(_In_ REFPROPERTYKEY Command,
_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnGetValuesByObjectListStart(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnGetValuesByObjectListNext(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnGetValuesByObjectListEnd(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnGetValuesByObjectFormatStart(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnGetValuesByObjectFormatNext(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnGetValuesByObjectFormatEnd(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnSetValuesByObjectListStart(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnSetValuesByObjectListNext(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnSetValuesByObjectListEnd(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
private:
HRESULT CreateBulkPropertiesContext(
_In_ ContextMap* pContextMap,
_In_ IPortableDevicePropVariantCollection* pObjectIDs,
_In_ IPortableDeviceKeyCollection* pProperties,
_Outptr_result_nullonfailure_ LPWSTR* ppszBulkPropertiesContext);
HRESULT CreateBulkPropertiesContext(
_In_ ContextMap* pContextMap,
_In_ REFGUID guidObjectFormat,
_In_ LPCWSTR pszParentObjectID,
_In_ DWORD dwDepth,
_In_ IPortableDeviceKeyCollection* pProperties,
_Outptr_result_nullonfailure_ LPWSTR* ppszBulkPropertiesContext);
HRESULT CreateBulkPropertiesContext(
_In_ ContextMap* pContextMap,
_In_ IPortableDeviceValuesCollection* pValuesCollection,
_Outptr_result_nullonfailure_ LPWSTR* ppszBulkPropertiesContext);
HRESULT DestroyBulkPropertiesContext(
_In_ ContextMap* pContextMap,
_In_ LPCWSTR pszBulkPropertiesContext);
FakeDevice* m_pFakeDevice;
};
|