1 /*++
2
3 Copyright (c) Microsoft Corporation
4
5 Module Name:
6
7 FxRequestSystemBuffer.cpp
8
9 Abstract:
10
11 This module implements class representing the system buffer in an FxRequest
12
13 Author:
14
15
16
17
18 Environment:
19
20 Both kernel and user mode
21
22 Revision History:
23
24
25
26
27 --*/
28
29 #include "coreprivshared.hpp"
30
31 // Tracing support
32 extern "C" {
33 // #include "FxRequestSystemBuffer.tmh"
34 }
35
36 size_t
GetBufferSize(VOID)37 FxRequestSystemBuffer::GetBufferSize(
38 VOID
39 )
40 /*++
41
42 Routine Description:
43 Returns the size of the buffer returned by GetBuffer()
44
45 Arguments:
46 None
47
48 Return Value:
49 Buffer length or 0 on error
50
51 --*/
52 {
53 FxIrp* irp = GetRequest()->GetFxIrp();
54
55 switch (irp->GetMajorFunction()) {
56 case IRP_MJ_READ:
57 return irp->GetParameterReadLength();
58
59 case IRP_MJ_WRITE:
60 return irp->GetParameterWriteLength();
61
62 case IRP_MJ_DEVICE_CONTROL:
63 case IRP_MJ_INTERNAL_DEVICE_CONTROL:
64 return irp->GetParameterIoctlInputBufferLength();
65
66 default:
67 // should not get here
68 ASSERT(FALSE);
69 return 0;
70 }
71 }
72
73 _Must_inspect_result_
74 PMDL
GetMdl(VOID)75 FxRequestSystemBuffer::GetMdl(
76 VOID
77 )
78 /*++
79
80 Routine Description:
81 Returns the PMDL from the irp if one exists, otherwise NULL
82
83 Arguments:
84 None
85
86 Return Value:
87 a valid PMDL or NULL (not an error condition)
88
89 --*/
90 {
91 FxDevice* pDevice;
92 FxIrp* irp = GetRequest()->GetFxIrp();
93
94 switch (irp->GetMajorFunction()) {
95 case IRP_MJ_READ:
96 case IRP_MJ_WRITE:
97 pDevice = FxDevice::GetFxDevice(irp->GetDeviceObject());
98
99 if (pDevice->GetIoType() == WdfDeviceIoDirect) {
100 return m_Mdl;
101 }
102 // || || Fall through || ||
103 // \/ \/ \/ \/
104
105 case IRP_MJ_DEVICE_CONTROL:
106 case IRP_MJ_INTERNAL_DEVICE_CONTROL:
107 //
108 // For IOCLs, the outbuffer will return the PMDL
109 //
110 // || || Fall through || ||
111 // \/ \/ \/ \/
112
113 default:
114 return NULL;
115 }
116 }
117
118 WDFMEMORY
GetHandle(VOID)119 FxRequestSystemBuffer::GetHandle(
120 VOID
121 )
122 /*++
123
124 Routine Description:
125 Returns the handle that will represent this object to the driver writer.
126
127 Arguments:
128 None
129
130 Return Value:
131 Valid WDF handle
132
133 --*/
134 {
135 return GetRequest()->GetMemoryHandle(
136 FIELD_OFFSET(FxRequest, m_SystemBufferOffset));
137 }
138
139 USHORT
GetFlags(VOID)140 FxRequestSystemBuffer::GetFlags(
141 VOID
142 )
143 /*++
144
145 Routine Description:
146 Returns the flags associated with this buffer. This currently only includes
147 whether the buffer is read only or not
148
149 Arguments:
150 None
151
152 Return Value:
153 flags from IFxMemoryFlags
154
155 --*/
156 {
157 FxIrp* irp = GetRequest()->GetFxIrp();
158
159 switch (irp->GetMajorFunction()) {
160 case IRP_MJ_DEVICE_CONTROL:
161 case IRP_MJ_INTERNAL_DEVICE_CONTROL:
162 switch (irp->GetParameterIoctlCodeBufferMethod()) {
163 case METHOD_BUFFERED:
164 case METHOD_NEITHER:
165 return 0;
166
167 case METHOD_IN_DIRECT:
168 case METHOD_OUT_DIRECT:
169 return IFxMemoryFlagReadOnly;
170 }
171
172 case IRP_MJ_READ:
173 return 0;
174
175 case IRP_MJ_WRITE:
176 return IFxMemoryFlagReadOnly;
177
178 default:
179 ASSERT(FALSE);
180 return 0;
181 }
182 }
183
184 PFX_DRIVER_GLOBALS
GetDriverGlobals(VOID)185 FxRequestSystemBuffer::GetDriverGlobals(
186 VOID
187 )
188 /*++
189
190 Routine Description:
191 Returns the driver globals
192
193 Arguments:
194 none
195
196 Return Value:
197 Driver globals pointer
198
199 --*/
200 {
201 return GetRequest()->GetDriverGlobals();
202 }
203
204 ULONG
AddRef(__in PVOID Tag,__in LONG Line,__in_opt PSTR File)205 FxRequestSystemBuffer::AddRef(
206 __in PVOID Tag,
207 __in LONG Line,
208 __in_opt PSTR File
209 )
210 /*++
211
212 Routine Description:
213 Adds an irp reference to the owning FxRequest. This object does not maintain
214 its own reference count. A request cannot be completed with outstanding
215 irp references.
216
217 Arguments:
218 Tag - the tag to use to track the reference
219
220 Line - The line number of the caller
221
222 File - the file name of the caller
223
224 Return Value:
225 current reference count
226
227 --*/
228 {
229 UNREFERENCED_PARAMETER(Tag);
230 UNREFERENCED_PARAMETER(Line);
231 UNREFERENCED_PARAMETER(File);
232
233 GetRequest()->AddIrpReference();
234
235 //
236 // This value should never be used by the caller
237 //
238 return 2;
239 }
240
241 ULONG
Release(__in PVOID Tag,__in LONG Line,__in_opt PSTR File)242 FxRequestSystemBuffer::Release(
243 __in PVOID Tag,
244 __in LONG Line,
245 __in_opt PSTR File
246 )
247 /*++
248
249 Routine Description:
250 Removes an irp reference to the owning FxRequest. This object does not maintain
251 its own reference count. A request cannot be completed with outstanding
252 irp references.
253
254 Arguments:
255 Tag - the tag to use to track the release
256
257 Line - The line number of the caller
258
259 File - the file name of the caller
260
261 Return Value:
262 current reference count
263
264 --*/
265 {
266 UNREFERENCED_PARAMETER(Tag);
267 UNREFERENCED_PARAMETER(Line);
268 UNREFERENCED_PARAMETER(File);
269
270 GetRequest()->ReleaseIrpReference();
271
272 return 1;
273 }
274
275 FxRequest*
GetRequest(VOID)276 FxRequestSystemBuffer::GetRequest(
277 VOID
278 )
279 /*++
280
281 Routine Description:
282 Return the owning FxRequest based on this object's address
283
284 Arguments:
285 None
286
287 Return Value:
288 owning FxRequest
289
290 --*/
291 {
292 return CONTAINING_RECORD(this, FxRequest, m_SystemBuffer);
293 }
294
295 VOID
Delete(VOID)296 FxRequestSystemBuffer::Delete(
297 VOID
298 )
299 /*++
300
301 Routine Description:
302 Attempt to delete this interface. Since this is an embedded object, it
303 cannot be deleted. Since this function is only called internally, the
304 internal caller knows if the IFxMemory is deletable because the internal
305 caller allocated the IFxMemory to begin with.
306
307 Arguments:
308 None
309
310 Return Value:
311 None
312
313 --*/
314 {
315 // this function should never be called
316 ASSERT(FALSE);
317 }
318