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
|
#pragma once
// This class is used to store the context for a specific enumeration.
// Currently, this is done by storing the object index.
class ObjectManagementContext : public IUnknown
{
public:
ObjectManagementContext() :
m_cRef(1),
UpdateRequest(FALSE)
{
}
~ObjectManagementContext()
{
}
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:
CAtlStringW Name;
CComPtr<IPortableDeviceValues> ObjectProperties;
BOOL UpdateRequest;
private:
DWORD m_cRef;
};
class WpdObjectManagement
{
public:
WpdObjectManagement();
~WpdObjectManagement();
HRESULT Initialize(_In_ FakeDevice *pFakeDevice);
HRESULT DispatchWpdMessage(_In_ REFPROPERTYKEY Command,
_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnDelete(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnCreateObjectWithPropertiesOnly(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnCreateObjectWithPropertiesAndData(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnWriteObjectData(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnRevert(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnCommit(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnMove(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnCopy(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT OnUpdateObjectWithPropertiesAndData(_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
private:
HRESULT CreateObjectManagementContext(
_In_ ContextMap* pContextMap,
_In_ LPCWSTR pszObjectName,
_In_ IPortableDeviceValues* pObjectProperties,
_In_ BOOL bUpdateRequest,
_Outptr_result_nullonfailure_ LPWSTR* ppszObjectManagementContext);
HRESULT DestroyObjectManagementContext(
_In_ ContextMap* pContextMap,
_In_ LPCWSTR pszObjectManagementContext);
HRESULT CommitNewObject(
_In_ ObjectManagementContext* pContext,
_In_ LPCWSTR pszContext,
_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
HRESULT UpdateObject(
_In_ ObjectManagementContext* pContext,
_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults);
FakeDevice* m_pFakeDevice;
};
|