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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
/*++
Copyright (c) Microsoft Corporation, All Rights Reserved
Module Name:
queue.h
Abstract:
This file defines the queue callback interface.
Environment:
Windows User-Mode Driver Framework (WUDF)
--*/
#pragma once
#define MAX_TRANSFER_SIZE(x) 64*1024*1024
//
// Queue Callback Object.
//
class CMyReadWriteQueue :
public IQueueCallbackRead,
public IQueueCallbackWrite,
public IRequestCallbackRequestCompletion,
public IQueueCallbackIoStop,
public CMyQueue
{
protected:
HRESULT
Initialize(
);
void
ForwardFormattedRequest(
_In_ IWDFIoRequest* pRequest,
_In_ IWDFIoTarget* pIoTarget
);
public:
CMyReadWriteQueue(
_In_ PCMyDevice Device
);
virtual ~CMyReadWriteQueue();
static
HRESULT
CreateInstance(
_In_ PCMyDevice Device,
_Out_ PCMyReadWriteQueue *Queue
);
HRESULT
Configure(
VOID
)
{
return CMyQueue::Configure();
}
IQueueCallbackWrite *
QueryIQueueCallbackWrite(
VOID
)
{
AddRef();
return static_cast<IQueueCallbackWrite *>(this);
}
IQueueCallbackRead *
QueryIQueueCallbackRead(
VOID
)
{
AddRef();
return static_cast<IQueueCallbackRead *>(this);
}
IRequestCallbackRequestCompletion *
QueryIRequestCallbackRequestCompletion(
VOID
)
{
AddRef();
return static_cast<IRequestCallbackRequestCompletion *>(this);
}
IQueueCallbackIoStop*
QueryIQueueCallbackIoStop(
VOID
)
{
AddRef();
return static_cast<IQueueCallbackIoStop *>(this);
}
//
// IUnknown
//
STDMETHOD_(ULONG,AddRef) (VOID) {return CUnknown::AddRef();}
_At_(this, __drv_freesMem(object))
STDMETHOD_(ULONG,Release) (VOID) {return CUnknown::Release();}
STDMETHOD_(HRESULT, QueryInterface)(
_In_ REFIID InterfaceId,
_Outptr_ PVOID *Object
);
//
// Wdf Callbacks
//
//
// IQueueCallbackWrite
//
STDMETHOD_ (void, OnWrite)(
_In_ IWDFIoQueue *pWdfQueue,
_In_ IWDFIoRequest *pWdfRequest,
_In_ SIZE_T NumOfBytesToWrite
);
//
// IQueueCallbackRead
//
STDMETHOD_ (void, OnRead)(
_In_ IWDFIoQueue *pWdfQueue,
_In_ IWDFIoRequest *pWdfRequest,
_In_ SIZE_T NumOfBytesToRead
);
//
//IRequestCallbackRequestCompletion
//
STDMETHOD_ (void, OnCompletion)(
_In_ IWDFIoRequest* pWdfRequest,
_In_ IWDFIoTarget* pIoTarget,
_In_ IWDFRequestCompletionParams* pParams,
_In_ PVOID pContext
);
//
//IQueueCallbackIoStop
//
STDMETHOD_ (void, OnIoStop)(
_In_ IWDFIoQueue * pWdfQueue,
_In_ IWDFIoRequest * pWdfRequest,
_In_ ULONG ActionFlags
);
};
|