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
|
// Queue.h : Declaration of the CQueue
#pragma once
#include "resource.h" // main symbols
#include "WpdBasicHardwareDriver.h"
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);
HRESULT GetWpdBaseDriver(
_In_ IWDFDevice* pDevice,
_Outptr_result_nullonfailure_ WpdBaseDriver** ppWpdBaseDriver);
CComPtr<IWpdSerializer> m_pWpdSerializer;
CComAutoCriticalSection m_CriticalSection;
};
|