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
|
#include "stdafx.h"
#include "WpdNetworkConfig.tmh"
WpdNetworkConfig::WpdNetworkConfig()
{
}
WpdNetworkConfig::~WpdNetworkConfig()
{
}
HRESULT WpdNetworkConfig::Initialize(_In_ FakeDevice *pFakeDevice)
{
HRESULT hr = S_OK;
if(pFakeDevice == NULL)
{
hr = E_POINTER;
CHECK_HR(hr, "Cannot have NULL parameter");
return hr;
}
m_pFakeDevice = pFakeDevice;
return hr;
}
HRESULT WpdNetworkConfig::DispatchWpdMessage(_In_ REFPROPERTYKEY Command,
_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults)
{
HRESULT hr = S_OK;
if (hr == S_OK)
{
if (Command.fmtid != WPD_CATEGORY_NETWORK_CONFIGURATION)
{
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_PROCESS_WIRELESS_PROFILE))
{
hr = OnProcessWFCObject(pParams, pResults);
CHECK_HR(hr, "Failed to commit WFC file");
}
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_PROCESS_WIRELESS_PROFILE
* command.
*
* The parameters sent to us are:
* - WPD_PROPERTY_OBJECT_ID: identifies the object to process.
*
* The driver should:
* -
*/
HRESULT WpdNetworkConfig::OnProcessWFCObject(
_In_ IPortableDeviceValues* pParams,
_In_ IPortableDeviceValues* pResults)
{
HRESULT hr = S_OK;
LPWSTR pszObjectID = NULL;
UNREFERENCED_PARAMETER(pResults);
// Get the Object ID
hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID, &pszObjectID);
if (hr == S_OK)
{
FakeContent* pElement = NULL;
// Check if the object exists
if(m_pFakeDevice->GetContent(pszObjectID, &pElement))
{
// Check if the object is of the proper content type
if (IsEqualGUID(pElement->ContentType, WPD_CONTENT_TYPE_WIRELESS_PROFILE))
{
BYTE Buffer[16];
DWORD dwNumBytesRead = 0;
// Perform minimal validation on the object contents (just read some bytes for this sample)
hr = pElement->ReadData(WPD_RESOURCE_DEFAULT, 0, Buffer, sizeof(Buffer), &dwNumBytesRead);
CHECK_HR(hr, "Failed to read resource data for %ws.%d", CComBSTR(WPD_RESOURCE_DEFAULT.fmtid), WPD_RESOURCE_DEFAULT.pid);
}
else
{
hr = E_INVALIDARG;
CHECK_HR(hr, "Invalid ObjectID for OnProcessWFCObject [%ws]", pszObjectID);
}
}
else
{
hr = E_INVALIDARG;
CHECK_HR(hr, "Invalid ObjectID [%ws]", pszObjectID);
}
CoTaskMemFree(pszObjectID);
}
else
{
CHECK_HR(hr, "Missing or invalid value for WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID");
}
return hr;
}
|