1 /*++
2
3 Copyright (c) Microsoft Corporation. All rights reserved.
4
5 _WdfVersionBuild_
6
7 Module Name:
8
9 wdfio.h
10
11 Abstract:
12
13 This module contains contains the Windows Driver Framework I/O
14 interfaces.
15
16 Environment:
17
18 kernel mode only
19
20 Revision History:
21
22
23 --*/
24
25 //
26 // NOTE: This header is generated by stubwork. Please make any
27 // modifications to the corresponding template files
28 // (.x or .y) and use stubwork to regenerate the header
29 //
30
31 #ifndef _WDFIO_H_
32 #define _WDFIO_H_
33
34 #ifndef WDF_EXTERN_C
35 #ifdef __cplusplus
36 #define WDF_EXTERN_C extern "C"
37 #define WDF_EXTERN_C_START extern "C" {
38 #define WDF_EXTERN_C_END }
39 #else
40 #define WDF_EXTERN_C
41 #define WDF_EXTERN_C_START
42 #define WDF_EXTERN_C_END
43 #endif
44 #endif
45
46 WDF_EXTERN_C_START
47
48
49
50 #if (NTDDI_VERSION >= NTDDI_WIN2K)
51
52 //
53 // Types
54 //
55
56 //
57 // This defines the dispatch type of the queue. This controls how
58 // the queue raises I/O events to the driver through the registered
59 // callbacks.
60 //
61 // Sequential allows the driver to have the queue automatically dispatch
62 // one request at a time, and will hold requests until a current request
63 // is completed.
64 //
65 // Parallel has the queue dispatch requests to the driver as they arrive
66 // at the queue, and the queue is in a processing state. The driver can
67 // look at the requests in real time, and decide to service them, forward them
68 // to another queue, pend them, or return a status to have the queue held
69 // due to a hardware or other resource limit.
70 //
71 // Manual allows the driver to create multiple queues for requests, and control
72 // when it wants to retrieve requests from the queue by calling the queues
73 // WdfIoQueueRetrieveNextRequest() API.
74 //
75
76 typedef enum _WDF_IO_QUEUE_DISPATCH_TYPE {
77 WdfIoQueueDispatchInvalid = 0,
78 WdfIoQueueDispatchSequential,
79 WdfIoQueueDispatchParallel,
80 WdfIoQueueDispatchManual,
81 WdfIoQueueDispatchMax,
82 } WDF_IO_QUEUE_DISPATCH_TYPE;
83
84 //
85 // This defines the status of the queue.
86 //
87 // WdfIoQueueAcceptRequests - If TRUE, Queue will accept requests from WDM
88 // dispatch through WdfDeviceConfigureRequestDispatching,
89 // or from WdfRequestForwardToIoQueue.
90 //
91 // If FALSE, Queue will complete requests with
92 // STATUS_CANCELLED from WdfDeviceConfigureRequestDispatching,
93 // and fail WdfRequestForwardToIoQueue with
94 // STATUS_WDF_BUSY.
95 //
96 //
97 // WdfIoQueueDispatchRequests - If TRUE, and the Queue is configured for
98 // automatic dispatch as either
99 // WdfIoQueueDispatchSequential,
100 // or WdfIoQueueDispatchParallel, the Queue will
101 // present the requests to the driver according
102 // to the drivers configuration.
103 //
104 // If FALSE, requests are not automatically
105 // presented to the device driver.
106 //
107 // This has no effect on the drivers ability to
108 // retrieve requests with WdfIoQueueRetrieveNextRequest.
109 //
110 // WdfIoQueueNoRequests - If TRUE, the Queue has no requests to present
111 // or return to the device driver.
112 //
113 // WdfIoQueueDriverNoRequests - If TRUE, the device driver is not operating
114 // on any requests retrieved from or presented
115 // by this Queue.
116 //
117 // WdfIoQueuePnpHeld - The Framework PnP stage has requested that
118 // the device driver stop receiving new requests.
119 //
120 // Automatic request dispatch stops, and
121 // WdfIoQueueRetrieveNextRequest returns STATUS_WDF_BUSY.
122 //
123
124 typedef enum _WDF_IO_QUEUE_STATE {
125 WdfIoQueueAcceptRequests = 0x01,
126 WdfIoQueueDispatchRequests = 0x02,
127 WdfIoQueueNoRequests = 0x04,
128 WdfIoQueueDriverNoRequests = 0x08,
129 WdfIoQueuePnpHeld = 0x10,
130 } WDF_IO_QUEUE_STATE;
131
132
133
134
135 //
136 // These macros represent some common Queue states
137 //
138
139 //
140 // A Queue is idle if it has no requests, and the driver
141 // is not operating on any.
142 //
143
144 FORCEINLINE
145 BOOLEAN
WDF_IO_QUEUE_IDLE(_In_ WDF_IO_QUEUE_STATE State)146 WDF_IO_QUEUE_IDLE(
147 _In_ WDF_IO_QUEUE_STATE State
148 )
149 {
150 return ((State & WdfIoQueueNoRequests) &&
151 (State & WdfIoQueueDriverNoRequests)) ? TRUE: FALSE;
152 }
153
154 //
155 // A Queue is ready if it can accept and dispatch requests and
156 // queue is not held by PNP
157 //
158 FORCEINLINE
159 BOOLEAN
WDF_IO_QUEUE_READY(_In_ WDF_IO_QUEUE_STATE State)160 WDF_IO_QUEUE_READY(
161 _In_ WDF_IO_QUEUE_STATE State
162 )
163 {
164 return ((State & WdfIoQueueDispatchRequests) &&
165 (State & WdfIoQueueAcceptRequests) &&
166 ((State & WdfIoQueuePnpHeld)==0)) ? TRUE: FALSE;
167 }
168
169 //
170 // A Queue is stopped if it can accept new requests, but
171 // is not automatically delivering them to the device driver,
172 // and the queue is idle.
173 //
174 FORCEINLINE
175 BOOLEAN
WDF_IO_QUEUE_STOPPED(_In_ WDF_IO_QUEUE_STATE State)176 WDF_IO_QUEUE_STOPPED(
177 _In_ WDF_IO_QUEUE_STATE State
178 )
179 {
180 return (((State & WdfIoQueueDispatchRequests) == 0) &&
181 (State & WdfIoQueueAcceptRequests) &&
182 (State & WdfIoQueueDriverNoRequests)) ? TRUE: FALSE;
183
184 }
185
186 //
187 // A Queue is drained if it can not accept new requests but
188 // can dispatch existing requests, and there are no requests
189 // either in the Queue or the device driver.
190 //
191
192 FORCEINLINE
193 BOOLEAN
WDF_IO_QUEUE_DRAINED(_In_ WDF_IO_QUEUE_STATE State)194 WDF_IO_QUEUE_DRAINED(
195 _In_ WDF_IO_QUEUE_STATE State
196 )
197 {
198 return ( ((State & WdfIoQueueAcceptRequests)==0) &&
199 (State & WdfIoQueueDispatchRequests) &&
200 (State & WdfIoQueueNoRequests) &&
201 (State & WdfIoQueueDriverNoRequests) ) ? TRUE: FALSE;
202
203 }
204
205 //
206 // A Queue is purged if it can not accept new requests
207 // and there are no requests either in the Queue or
208 // the device driver.
209 //
210 FORCEINLINE
211 BOOLEAN
WDF_IO_QUEUE_PURGED(_In_ WDF_IO_QUEUE_STATE State)212 WDF_IO_QUEUE_PURGED(
213 _In_ WDF_IO_QUEUE_STATE State
214 )
215 {
216 return ( ((State & WdfIoQueueAcceptRequests)==0) &&
217 (State & WdfIoQueueNoRequests) &&
218 (State & WdfIoQueueDriverNoRequests) ) ? TRUE: FALSE;
219
220 }
221
222 //
223 // Event callback definitions
224 //
225
226 typedef
227 _Function_class_(EVT_WDF_IO_QUEUE_IO_DEFAULT)
228 _IRQL_requires_same_
229 _IRQL_requires_max_(DISPATCH_LEVEL)
230 VOID
231 STDCALL
232 EVT_WDF_IO_QUEUE_IO_DEFAULT(
233 _In_
234 WDFQUEUE Queue,
235 _In_
236 WDFREQUEST Request
237 );
238
239 typedef EVT_WDF_IO_QUEUE_IO_DEFAULT *PFN_WDF_IO_QUEUE_IO_DEFAULT;
240
241
242 typedef
243 _Function_class_(EVT_WDF_IO_QUEUE_IO_STOP)
244 _IRQL_requires_same_
245 _IRQL_requires_max_(DISPATCH_LEVEL)
246 VOID
247 STDCALL
248 EVT_WDF_IO_QUEUE_IO_STOP(
249 _In_
250 WDFQUEUE Queue,
251 _In_
252 WDFREQUEST Request,
253 _In_
254 ULONG ActionFlags
255 );
256
257 typedef EVT_WDF_IO_QUEUE_IO_STOP *PFN_WDF_IO_QUEUE_IO_STOP;
258
259 typedef
260 _Function_class_(EVT_WDF_IO_QUEUE_IO_RESUME)
261 _IRQL_requires_same_
262 _IRQL_requires_max_(DISPATCH_LEVEL)
263 VOID
264 STDCALL
265 EVT_WDF_IO_QUEUE_IO_RESUME(
266 _In_
267 WDFQUEUE Queue,
268 _In_
269 WDFREQUEST Request
270 );
271
272 typedef EVT_WDF_IO_QUEUE_IO_RESUME *PFN_WDF_IO_QUEUE_IO_RESUME;
273
274 typedef
275 _Function_class_(EVT_WDF_IO_QUEUE_IO_READ)
276 _IRQL_requires_same_
277 _IRQL_requires_max_(DISPATCH_LEVEL)
278 VOID
279 STDCALL
280 EVT_WDF_IO_QUEUE_IO_READ(
281 _In_
282 WDFQUEUE Queue,
283 _In_
284 WDFREQUEST Request,
285 _In_
286 size_t Length
287 );
288
289 typedef EVT_WDF_IO_QUEUE_IO_READ *PFN_WDF_IO_QUEUE_IO_READ;
290
291 typedef
292 _Function_class_(EVT_WDF_IO_QUEUE_IO_WRITE)
293 _IRQL_requires_same_
294 _IRQL_requires_max_(DISPATCH_LEVEL)
295 VOID
296 STDCALL
297 EVT_WDF_IO_QUEUE_IO_WRITE(
298 _In_
299 WDFQUEUE Queue,
300 _In_
301 WDFREQUEST Request,
302 _In_
303 size_t Length
304 );
305
306 typedef EVT_WDF_IO_QUEUE_IO_WRITE *PFN_WDF_IO_QUEUE_IO_WRITE;
307
308 typedef
309 _Function_class_(EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL)
310 _IRQL_requires_same_
311 _IRQL_requires_max_(DISPATCH_LEVEL)
312 VOID
313 STDCALL
314 EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL(
315 _In_
316 WDFQUEUE Queue,
317 _In_
318 WDFREQUEST Request,
319 _In_
320 size_t OutputBufferLength,
321 _In_
322 size_t InputBufferLength,
323 _In_
324 ULONG IoControlCode
325 );
326
327 typedef EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL *PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL;
328
329 typedef
330 _Function_class_(EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL)
331 _IRQL_requires_same_
332 _IRQL_requires_max_(DISPATCH_LEVEL)
333 VOID
334 STDCALL
335 EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL(
336 _In_
337 WDFQUEUE Queue,
338 _In_
339 WDFREQUEST Request,
340 _In_
341 size_t OutputBufferLength,
342 _In_
343 size_t InputBufferLength,
344 _In_
345 ULONG IoControlCode
346 );
347
348 typedef EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL *PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL;
349
350
351 typedef
352 _Function_class_(EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE)
353 _IRQL_requires_same_
354 _IRQL_requires_max_(DISPATCH_LEVEL)
355 VOID
356 STDCALL
357 EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE(
358 _In_
359 WDFQUEUE Queue,
360 _In_
361 WDFREQUEST Request
362 );
363
364 typedef EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE *PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE;
365
366
367 typedef
368 _Function_class_(EVT_WDF_IO_QUEUE_STATE)
369 _IRQL_requires_same_
370 _IRQL_requires_max_(DISPATCH_LEVEL)
371 VOID
372 STDCALL
373 EVT_WDF_IO_QUEUE_STATE(
374 _In_
375 WDFQUEUE Queue,
376 _In_
377 WDFCONTEXT Context
378 );
379
380 typedef EVT_WDF_IO_QUEUE_STATE *PFN_WDF_IO_QUEUE_STATE;
381
382 //
383 // This is the structure used to configure an IoQueue and
384 // register callback events to it.
385 //
386
387 typedef struct _WDF_IO_QUEUE_CONFIG {
388
389 ULONG Size;
390
391 WDF_IO_QUEUE_DISPATCH_TYPE DispatchType;
392
393 WDF_TRI_STATE PowerManaged;
394
395 BOOLEAN AllowZeroLengthRequests;
396
397 BOOLEAN DefaultQueue;
398
399 PFN_WDF_IO_QUEUE_IO_DEFAULT EvtIoDefault;
400
401 PFN_WDF_IO_QUEUE_IO_READ EvtIoRead;
402
403 PFN_WDF_IO_QUEUE_IO_WRITE EvtIoWrite;
404
405 PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl;
406
407 PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl;
408
409 PFN_WDF_IO_QUEUE_IO_STOP EvtIoStop;
410
411 PFN_WDF_IO_QUEUE_IO_RESUME EvtIoResume;
412
413 PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue;
414
415 union {
416 struct {
417 ULONG NumberOfPresentedRequests;
418 } Parallel;
419 } Settings;
420
421 WDFDRIVER Driver;
422 } WDF_IO_QUEUE_CONFIG, *PWDF_IO_QUEUE_CONFIG;
423
424 FORCEINLINE
425 VOID
WDF_IO_QUEUE_CONFIG_INIT(_Out_ PWDF_IO_QUEUE_CONFIG Config,_In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)426 WDF_IO_QUEUE_CONFIG_INIT(
427 _Out_ PWDF_IO_QUEUE_CONFIG Config,
428 _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType
429 )
430 {
431 RtlZeroMemory(Config, sizeof(WDF_IO_QUEUE_CONFIG));
432
433 Config->Size = sizeof(WDF_IO_QUEUE_CONFIG);
434 Config->PowerManaged = WdfUseDefault;
435 Config->DispatchType = DispatchType;
436 if (Config->DispatchType == WdfIoQueueDispatchParallel) {
437 Config->Settings.Parallel.NumberOfPresentedRequests = (ULONG)-1;
438 }
439 }
440
441 FORCEINLINE
442 VOID
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(_Out_ PWDF_IO_QUEUE_CONFIG Config,_In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)443 WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(
444 _Out_ PWDF_IO_QUEUE_CONFIG Config,
445 _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType
446 )
447 {
448 RtlZeroMemory(Config, sizeof(WDF_IO_QUEUE_CONFIG));
449
450 Config->Size = sizeof(WDF_IO_QUEUE_CONFIG);
451 Config->PowerManaged = WdfUseDefault;
452 Config->DefaultQueue = TRUE;
453 Config->DispatchType = DispatchType;
454 if (Config->DispatchType == WdfIoQueueDispatchParallel) {
455 Config->Settings.Parallel.NumberOfPresentedRequests = (ULONG)-1;
456 }
457 }
458
459 typedef enum _WDF_IO_FORWARD_PROGRESS_ACTION {
460 WdfIoForwardProgressActionInvalid = 0x0,
461 WdfIoForwardProgressActionFailRequest,
462 WdfIoForwardProgressActionUseReservedRequest
463 } WDF_IO_FORWARD_PROGRESS_ACTION;
464
465 typedef enum _WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY {
466 WdfIoForwardProgressInvalidPolicy =0x0,
467 WdfIoForwardProgressReservedPolicyAlwaysUseReservedRequest,
468 WdfIoForwardProgressReservedPolicyUseExamine,
469 WdfIoForwardProgressReservedPolicyPagingIO
470 } WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY;
471
472 typedef
473 _Function_class_(EVT_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST)
474 _IRQL_requires_same_
475 _IRQL_requires_max_(DISPATCH_LEVEL)
476 NTSTATUS
477 STDCALL
478 EVT_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST(
479 _In_
480 WDFQUEUE Queue,
481 _In_
482 WDFREQUEST Request
483 );
484
485 typedef EVT_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST *PFN_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST;
486
487 typedef
488 _Function_class_(EVT_WDF_IO_ALLOCATE_REQUEST_RESOURCES)
489 _IRQL_requires_same_
490 _IRQL_requires_max_(DISPATCH_LEVEL)
491 NTSTATUS
492 STDCALL
493 EVT_WDF_IO_ALLOCATE_REQUEST_RESOURCES(
494 _In_
495 WDFQUEUE Queue,
496 _In_
497 WDFREQUEST Request
498 );
499
500 typedef EVT_WDF_IO_ALLOCATE_REQUEST_RESOURCES *PFN_WDF_IO_ALLOCATE_REQUEST_RESOURCES;
501
502 typedef
503 _Function_class_(EVT_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS)
504 _IRQL_requires_same_
505 _IRQL_requires_max_(DISPATCH_LEVEL)
506 WDF_IO_FORWARD_PROGRESS_ACTION
507 STDCALL
508 EVT_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS(
509 _In_
510 WDFQUEUE Queue,
511 _In_
512 PIRP Irp
513 );
514
515 typedef EVT_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS *PFN_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS;
516
517 typedef struct _WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY_SETTINGS {
518 union {
519
520 struct {
521 PFN_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS EvtIoWdmIrpForForwardProgress;
522 } ExaminePolicy;
523
524 } Policy;
525 } WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY_SETTINGS;
526
527 typedef struct _WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY {
528 ULONG Size;
529
530 ULONG TotalForwardProgressRequests;
531
532 //
533 // Specify the type of the policy here.
534 //
535 WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY ForwardProgressReservedPolicy;
536
537 //
538 // Structure which contains the policy specific fields
539 //
540 WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY_SETTINGS ForwardProgressReservePolicySettings;
541
542 //
543 // Callback for reserved request given at initialization time
544 //
545 PFN_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST EvtIoAllocateResourcesForReservedRequest;
546
547 //
548 // Callback for reserved request given at run time
549 //
550 PFN_WDF_IO_ALLOCATE_REQUEST_RESOURCES EvtIoAllocateRequestResources;
551
552 } WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY, *PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY;
553
554 FORCEINLINE
555 VOID
WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_DEFAULT_INIT(_Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy,_In_ ULONG TotalForwardProgressRequests)556 WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_DEFAULT_INIT(
557 _Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy,
558 _In_ ULONG TotalForwardProgressRequests
559 )
560 {
561 RtlZeroMemory(Policy, sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY));
562
563 Policy->Size = sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY);
564 Policy->TotalForwardProgressRequests = TotalForwardProgressRequests;
565 Policy->ForwardProgressReservedPolicy = WdfIoForwardProgressReservedPolicyAlwaysUseReservedRequest;
566 }
567
568
569 FORCEINLINE
570 VOID
WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_EXAMINE_INIT(_Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy,_In_ ULONG TotalForwardProgressRequests,_In_ PFN_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS EvtIoWdmIrpForForwardProgress)571 WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_EXAMINE_INIT(
572 _Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy,
573 _In_ ULONG TotalForwardProgressRequests,
574 _In_ PFN_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS EvtIoWdmIrpForForwardProgress
575 )
576 {
577 RtlZeroMemory(Policy, sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY));
578
579 Policy->Size = sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY);
580 Policy->TotalForwardProgressRequests = TotalForwardProgressRequests;
581 Policy->ForwardProgressReservedPolicy = WdfIoForwardProgressReservedPolicyUseExamine;
582 Policy->ForwardProgressReservePolicySettings.Policy.ExaminePolicy.EvtIoWdmIrpForForwardProgress =
583 EvtIoWdmIrpForForwardProgress;
584 }
585
586 FORCEINLINE
587 VOID
WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_PAGINGIO_INIT(_Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy,_In_ ULONG TotalForwardProgressRequests)588 WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_PAGINGIO_INIT(
589 _Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy,
590 _In_ ULONG TotalForwardProgressRequests
591 )
592 {
593 RtlZeroMemory(Policy, sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY));
594
595 Policy->Size = sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY);
596 Policy->TotalForwardProgressRequests = TotalForwardProgressRequests;
597 Policy->ForwardProgressReservedPolicy = WdfIoForwardProgressReservedPolicyPagingIO;
598 }
599
600
601 //
602 // WDF Function: WdfIoQueueCreate
603 //
604 typedef
605 _Must_inspect_result_
606 _IRQL_requires_max_(DISPATCH_LEVEL)
607 WDFAPI
608 NTSTATUS
609 (STDCALL *PFN_WDFIOQUEUECREATE)(
610 _In_
611 PWDF_DRIVER_GLOBALS DriverGlobals,
612 _In_
613 WDFDEVICE Device,
614 _In_
615 PWDF_IO_QUEUE_CONFIG Config,
616 _In_opt_
617 PWDF_OBJECT_ATTRIBUTES QueueAttributes,
618 _Out_opt_
619 WDFQUEUE* Queue
620 );
621
622 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)623 _IRQL_requires_max_(DISPATCH_LEVEL)
624 FORCEINLINE
625 NTSTATUS
626 WdfIoQueueCreate(
627 _In_
628 WDFDEVICE Device,
629 _In_
630 PWDF_IO_QUEUE_CONFIG Config,
631 _In_opt_
632 PWDF_OBJECT_ATTRIBUTES QueueAttributes,
633 _Out_opt_
634 WDFQUEUE* Queue
635 )
636 {
637 return ((PFN_WDFIOQUEUECREATE) WdfFunctions[WdfIoQueueCreateTableIndex])(WdfDriverGlobals, Device, Config, QueueAttributes, Queue);
638 }
639
640 //
641 // WDF Function: WdfIoQueueGetState
642 //
643 typedef
644 _IRQL_requires_max_(DISPATCH_LEVEL)
645 WDFAPI
646 WDF_IO_QUEUE_STATE
647 (STDCALL *PFN_WDFIOQUEUEGETSTATE)(
648 _In_
649 PWDF_DRIVER_GLOBALS DriverGlobals,
650 _In_
651 WDFQUEUE Queue,
652 _Out_opt_
653 PULONG QueueRequests,
654 _Out_opt_
655 PULONG DriverRequests
656 );
657
_IRQL_requires_max_(DISPATCH_LEVEL)658 _IRQL_requires_max_(DISPATCH_LEVEL)
659 FORCEINLINE
660 WDF_IO_QUEUE_STATE
661 WdfIoQueueGetState(
662 _In_
663 WDFQUEUE Queue,
664 _Out_opt_
665 PULONG QueueRequests,
666 _Out_opt_
667 PULONG DriverRequests
668 )
669 {
670 return ((PFN_WDFIOQUEUEGETSTATE) WdfFunctions[WdfIoQueueGetStateTableIndex])(WdfDriverGlobals, Queue, QueueRequests, DriverRequests);
671 }
672
673 //
674 // WDF Function: WdfIoQueueStart
675 //
676 typedef
677 _IRQL_requires_max_(DISPATCH_LEVEL)
678 WDFAPI
679 VOID
680 (STDCALL *PFN_WDFIOQUEUESTART)(
681 _In_
682 PWDF_DRIVER_GLOBALS DriverGlobals,
683 _In_
684 WDFQUEUE Queue
685 );
686
_IRQL_requires_max_(DISPATCH_LEVEL)687 _IRQL_requires_max_(DISPATCH_LEVEL)
688 FORCEINLINE
689 VOID
690 WdfIoQueueStart(
691 _In_
692 WDFQUEUE Queue
693 )
694 {
695 ((PFN_WDFIOQUEUESTART) WdfFunctions[WdfIoQueueStartTableIndex])(WdfDriverGlobals, Queue);
696 }
697
698 //
699 // WDF Function: WdfIoQueueStop
700 //
701 typedef
702 _IRQL_requires_max_(DISPATCH_LEVEL)
703 WDFAPI
704 VOID
705 (STDCALL *PFN_WDFIOQUEUESTOP)(
706 _In_
707 PWDF_DRIVER_GLOBALS DriverGlobals,
708 _In_
709 WDFQUEUE Queue,
710 _When_(Context != 0, _In_)
711 _When_(Context == 0, _In_opt_)
712 PFN_WDF_IO_QUEUE_STATE StopComplete,
713 _When_(StopComplete != 0, _In_)
714 _When_(StopComplete == 0, _In_opt_)
715 WDFCONTEXT Context
716 );
717
_IRQL_requires_max_(DISPATCH_LEVEL)718 _IRQL_requires_max_(DISPATCH_LEVEL)
719 FORCEINLINE
720 VOID
721 WdfIoQueueStop(
722 _In_
723 WDFQUEUE Queue,
724 _When_(Context != 0, _In_)
725 _When_(Context == 0, _In_opt_)
726 PFN_WDF_IO_QUEUE_STATE StopComplete,
727 _When_(StopComplete != 0, _In_)
728 _When_(StopComplete == 0, _In_opt_)
729 WDFCONTEXT Context
730 )
731 {
732 ((PFN_WDFIOQUEUESTOP) WdfFunctions[WdfIoQueueStopTableIndex])(WdfDriverGlobals, Queue, StopComplete, Context);
733 }
734
735 //
736 // WDF Function: WdfIoQueueStopSynchronously
737 //
738 typedef
739 _IRQL_requires_max_(PASSIVE_LEVEL)
740 WDFAPI
741 VOID
742 (STDCALL *PFN_WDFIOQUEUESTOPSYNCHRONOUSLY)(
743 _In_
744 PWDF_DRIVER_GLOBALS DriverGlobals,
745 _In_
746 WDFQUEUE Queue
747 );
748
_IRQL_requires_max_(PASSIVE_LEVEL)749 _IRQL_requires_max_(PASSIVE_LEVEL)
750 FORCEINLINE
751 VOID
752 WdfIoQueueStopSynchronously(
753 _In_
754 WDFQUEUE Queue
755 )
756 {
757 ((PFN_WDFIOQUEUESTOPSYNCHRONOUSLY) WdfFunctions[WdfIoQueueStopSynchronouslyTableIndex])(WdfDriverGlobals, Queue);
758 }
759
760 //
761 // WDF Function: WdfIoQueueGetDevice
762 //
763 typedef
764 _IRQL_requires_max_(DISPATCH_LEVEL)
765 WDFAPI
766 WDFDEVICE
767 (STDCALL *PFN_WDFIOQUEUEGETDEVICE)(
768 _In_
769 PWDF_DRIVER_GLOBALS DriverGlobals,
770 _In_
771 WDFQUEUE Queue
772 );
773
_IRQL_requires_max_(DISPATCH_LEVEL)774 _IRQL_requires_max_(DISPATCH_LEVEL)
775 FORCEINLINE
776 WDFDEVICE
777 WdfIoQueueGetDevice(
778 _In_
779 WDFQUEUE Queue
780 )
781 {
782 return ((PFN_WDFIOQUEUEGETDEVICE) WdfFunctions[WdfIoQueueGetDeviceTableIndex])(WdfDriverGlobals, Queue);
783 }
784
785 //
786 // WDF Function: WdfIoQueueRetrieveNextRequest
787 //
788 typedef
789 _Must_inspect_result_
790 _IRQL_requires_max_(DISPATCH_LEVEL)
791 WDFAPI
792 NTSTATUS
793 (STDCALL *PFN_WDFIOQUEUERETRIEVENEXTREQUEST)(
794 _In_
795 PWDF_DRIVER_GLOBALS DriverGlobals,
796 _In_
797 WDFQUEUE Queue,
798 _Out_
799 WDFREQUEST* OutRequest
800 );
801
802 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)803 _IRQL_requires_max_(DISPATCH_LEVEL)
804 FORCEINLINE
805 NTSTATUS
806 WdfIoQueueRetrieveNextRequest(
807 _In_
808 WDFQUEUE Queue,
809 _Out_
810 WDFREQUEST* OutRequest
811 )
812 {
813 return ((PFN_WDFIOQUEUERETRIEVENEXTREQUEST) WdfFunctions[WdfIoQueueRetrieveNextRequestTableIndex])(WdfDriverGlobals, Queue, OutRequest);
814 }
815
816 //
817 // WDF Function: WdfIoQueueRetrieveRequestByFileObject
818 //
819 typedef
820 _Must_inspect_result_
821 _IRQL_requires_max_(DISPATCH_LEVEL)
822 WDFAPI
823 NTSTATUS
824 (STDCALL *PFN_WDFIOQUEUERETRIEVEREQUESTBYFILEOBJECT)(
825 _In_
826 PWDF_DRIVER_GLOBALS DriverGlobals,
827 _In_
828 WDFQUEUE Queue,
829 _In_
830 WDFFILEOBJECT FileObject,
831 _Out_
832 WDFREQUEST* OutRequest
833 );
834
835 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)836 _IRQL_requires_max_(DISPATCH_LEVEL)
837 FORCEINLINE
838 NTSTATUS
839 WdfIoQueueRetrieveRequestByFileObject(
840 _In_
841 WDFQUEUE Queue,
842 _In_
843 WDFFILEOBJECT FileObject,
844 _Out_
845 WDFREQUEST* OutRequest
846 )
847 {
848 return ((PFN_WDFIOQUEUERETRIEVEREQUESTBYFILEOBJECT) WdfFunctions[WdfIoQueueRetrieveRequestByFileObjectTableIndex])(WdfDriverGlobals, Queue, FileObject, OutRequest);
849 }
850
851 //
852 // WDF Function: WdfIoQueueFindRequest
853 //
854 typedef
855 _Must_inspect_result_
856 _IRQL_requires_max_(DISPATCH_LEVEL)
857 WDFAPI
858 NTSTATUS
859 (STDCALL *PFN_WDFIOQUEUEFINDREQUEST)(
860 _In_
861 PWDF_DRIVER_GLOBALS DriverGlobals,
862 _In_
863 WDFQUEUE Queue,
864 _In_opt_
865 WDFREQUEST FoundRequest,
866 _In_opt_
867 WDFFILEOBJECT FileObject,
868 _Inout_opt_
869 PWDF_REQUEST_PARAMETERS Parameters,
870 _Out_
871 WDFREQUEST* OutRequest
872 );
873
874 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)875 _IRQL_requires_max_(DISPATCH_LEVEL)
876 FORCEINLINE
877 NTSTATUS
878 WdfIoQueueFindRequest(
879 _In_
880 WDFQUEUE Queue,
881 _In_opt_
882 WDFREQUEST FoundRequest,
883 _In_opt_
884 WDFFILEOBJECT FileObject,
885 _Inout_opt_
886 PWDF_REQUEST_PARAMETERS Parameters,
887 _Out_
888 WDFREQUEST* OutRequest
889 )
890 {
891 return ((PFN_WDFIOQUEUEFINDREQUEST) WdfFunctions[WdfIoQueueFindRequestTableIndex])(WdfDriverGlobals, Queue, FoundRequest, FileObject, Parameters, OutRequest);
892 }
893
894 //
895 // WDF Function: WdfIoQueueRetrieveFoundRequest
896 //
897 typedef
898 _Must_inspect_result_
899 _IRQL_requires_max_(DISPATCH_LEVEL)
900 WDFAPI
901 NTSTATUS
902 (STDCALL *PFN_WDFIOQUEUERETRIEVEFOUNDREQUEST)(
903 _In_
904 PWDF_DRIVER_GLOBALS DriverGlobals,
905 _In_
906 WDFQUEUE Queue,
907 _In_
908 WDFREQUEST FoundRequest,
909 _Out_
910 WDFREQUEST* OutRequest
911 );
912
913 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)914 _IRQL_requires_max_(DISPATCH_LEVEL)
915 FORCEINLINE
916 NTSTATUS
917 WdfIoQueueRetrieveFoundRequest(
918 _In_
919 WDFQUEUE Queue,
920 _In_
921 WDFREQUEST FoundRequest,
922 _Out_
923 WDFREQUEST* OutRequest
924 )
925 {
926 return ((PFN_WDFIOQUEUERETRIEVEFOUNDREQUEST) WdfFunctions[WdfIoQueueRetrieveFoundRequestTableIndex])(WdfDriverGlobals, Queue, FoundRequest, OutRequest);
927 }
928
929 //
930 // WDF Function: WdfIoQueueDrainSynchronously
931 //
932 typedef
933 _IRQL_requires_max_(PASSIVE_LEVEL)
934 WDFAPI
935 VOID
936 (STDCALL *PFN_WDFIOQUEUEDRAINSYNCHRONOUSLY)(
937 _In_
938 PWDF_DRIVER_GLOBALS DriverGlobals,
939 _In_
940 WDFQUEUE Queue
941 );
942
_IRQL_requires_max_(PASSIVE_LEVEL)943 _IRQL_requires_max_(PASSIVE_LEVEL)
944 FORCEINLINE
945 VOID
946 WdfIoQueueDrainSynchronously(
947 _In_
948 WDFQUEUE Queue
949 )
950 {
951 ((PFN_WDFIOQUEUEDRAINSYNCHRONOUSLY) WdfFunctions[WdfIoQueueDrainSynchronouslyTableIndex])(WdfDriverGlobals, Queue);
952 }
953
954 //
955 // WDF Function: WdfIoQueueDrain
956 //
957 typedef
958 _IRQL_requires_max_(DISPATCH_LEVEL)
959 WDFAPI
960 VOID
961 (STDCALL *PFN_WDFIOQUEUEDRAIN)(
962 _In_
963 PWDF_DRIVER_GLOBALS DriverGlobals,
964 _In_
965 WDFQUEUE Queue,
966 _When_(Context != 0, _In_)
967 _When_(Context == 0, _In_opt_)
968 PFN_WDF_IO_QUEUE_STATE DrainComplete,
969 _When_(DrainComplete != 0, _In_)
970 _When_(DrainComplete == 0, _In_opt_)
971 WDFCONTEXT Context
972 );
973
_IRQL_requires_max_(DISPATCH_LEVEL)974 _IRQL_requires_max_(DISPATCH_LEVEL)
975 FORCEINLINE
976 VOID
977 WdfIoQueueDrain(
978 _In_
979 WDFQUEUE Queue,
980 _When_(Context != 0, _In_)
981 _When_(Context == 0, _In_opt_)
982 PFN_WDF_IO_QUEUE_STATE DrainComplete,
983 _When_(DrainComplete != 0, _In_)
984 _When_(DrainComplete == 0, _In_opt_)
985 WDFCONTEXT Context
986 )
987 {
988 ((PFN_WDFIOQUEUEDRAIN) WdfFunctions[WdfIoQueueDrainTableIndex])(WdfDriverGlobals, Queue, DrainComplete, Context);
989 }
990
991 //
992 // WDF Function: WdfIoQueuePurgeSynchronously
993 //
994 typedef
995 _IRQL_requires_max_(PASSIVE_LEVEL)
996 WDFAPI
997 VOID
998 (STDCALL *PFN_WDFIOQUEUEPURGESYNCHRONOUSLY)(
999 _In_
1000 PWDF_DRIVER_GLOBALS DriverGlobals,
1001 _In_
1002 WDFQUEUE Queue
1003 );
1004
_IRQL_requires_max_(PASSIVE_LEVEL)1005 _IRQL_requires_max_(PASSIVE_LEVEL)
1006 FORCEINLINE
1007 VOID
1008 WdfIoQueuePurgeSynchronously(
1009 _In_
1010 WDFQUEUE Queue
1011 )
1012 {
1013 ((PFN_WDFIOQUEUEPURGESYNCHRONOUSLY) WdfFunctions[WdfIoQueuePurgeSynchronouslyTableIndex])(WdfDriverGlobals, Queue);
1014 }
1015
1016 //
1017 // WDF Function: WdfIoQueuePurge
1018 //
1019 typedef
1020 _IRQL_requires_max_(DISPATCH_LEVEL)
1021 WDFAPI
1022 VOID
1023 (STDCALL *PFN_WDFIOQUEUEPURGE)(
1024 _In_
1025 PWDF_DRIVER_GLOBALS DriverGlobals,
1026 _In_
1027 WDFQUEUE Queue,
1028 _When_(Context != 0, _In_)
1029 _When_(Context == 0, _In_opt_)
1030 PFN_WDF_IO_QUEUE_STATE PurgeComplete,
1031 _When_(PurgeComplete != 0, _In_)
1032 _When_(PurgeComplete == 0, _In_opt_)
1033 WDFCONTEXT Context
1034 );
1035
_IRQL_requires_max_(DISPATCH_LEVEL)1036 _IRQL_requires_max_(DISPATCH_LEVEL)
1037 FORCEINLINE
1038 VOID
1039 WdfIoQueuePurge(
1040 _In_
1041 WDFQUEUE Queue,
1042 _When_(Context != 0, _In_)
1043 _When_(Context == 0, _In_opt_)
1044 PFN_WDF_IO_QUEUE_STATE PurgeComplete,
1045 _When_(PurgeComplete != 0, _In_)
1046 _When_(PurgeComplete == 0, _In_opt_)
1047 WDFCONTEXT Context
1048 )
1049 {
1050 ((PFN_WDFIOQUEUEPURGE) WdfFunctions[WdfIoQueuePurgeTableIndex])(WdfDriverGlobals, Queue, PurgeComplete, Context);
1051 }
1052
1053 //
1054 // WDF Function: WdfIoQueueReadyNotify
1055 //
1056 typedef
1057 _Must_inspect_result_
1058 _IRQL_requires_max_(DISPATCH_LEVEL)
1059 WDFAPI
1060 NTSTATUS
1061 (STDCALL *PFN_WDFIOQUEUEREADYNOTIFY)(
1062 _In_
1063 PWDF_DRIVER_GLOBALS DriverGlobals,
1064 _In_
1065 WDFQUEUE Queue,
1066 _In_opt_
1067 PFN_WDF_IO_QUEUE_STATE QueueReady,
1068 _In_opt_
1069 WDFCONTEXT Context
1070 );
1071
1072 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)1073 _IRQL_requires_max_(DISPATCH_LEVEL)
1074 FORCEINLINE
1075 NTSTATUS
1076 WdfIoQueueReadyNotify(
1077 _In_
1078 WDFQUEUE Queue,
1079 _In_opt_
1080 PFN_WDF_IO_QUEUE_STATE QueueReady,
1081 _In_opt_
1082 WDFCONTEXT Context
1083 )
1084 {
1085 return ((PFN_WDFIOQUEUEREADYNOTIFY) WdfFunctions[WdfIoQueueReadyNotifyTableIndex])(WdfDriverGlobals, Queue, QueueReady, Context);
1086 }
1087
1088 //
1089 // WDF Function: WdfIoQueueAssignForwardProgressPolicy
1090 //
1091 typedef
1092 _Must_inspect_result_
1093 _IRQL_requires_max_(PASSIVE_LEVEL)
1094 WDFAPI
1095 NTSTATUS
1096 (STDCALL *PFN_WDFIOQUEUEASSIGNFORWARDPROGRESSPOLICY)(
1097 _In_
1098 PWDF_DRIVER_GLOBALS DriverGlobals,
1099 _In_
1100 WDFQUEUE Queue,
1101 _In_
1102 PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY ForwardProgressPolicy
1103 );
1104
1105 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1106 _IRQL_requires_max_(PASSIVE_LEVEL)
1107 FORCEINLINE
1108 NTSTATUS
1109 WdfIoQueueAssignForwardProgressPolicy(
1110 _In_
1111 WDFQUEUE Queue,
1112 _In_
1113 PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY ForwardProgressPolicy
1114 )
1115 {
1116 return ((PFN_WDFIOQUEUEASSIGNFORWARDPROGRESSPOLICY) WdfFunctions[WdfIoQueueAssignForwardProgressPolicyTableIndex])(WdfDriverGlobals, Queue, ForwardProgressPolicy);
1117 }
1118
1119 //
1120 // WDF Function: WdfIoQueueStopAndPurge
1121 //
1122 typedef
1123 _IRQL_requires_max_(DISPATCH_LEVEL)
1124 WDFAPI
1125 VOID
1126 (STDCALL *PFN_WDFIOQUEUESTOPANDPURGE)(
1127 _In_
1128 PWDF_DRIVER_GLOBALS DriverGlobals,
1129 _In_
1130 WDFQUEUE Queue,
1131 _When_(Context != 0, _In_)
1132 _When_(Context == 0, _In_opt_)
1133 PFN_WDF_IO_QUEUE_STATE StopAndPurgeComplete,
1134 _When_(StopAndPurgeComplete != 0, _In_)
1135 _When_(StopAndPurgeComplete == 0, _In_opt_)
1136 WDFCONTEXT Context
1137 );
1138
_IRQL_requires_max_(DISPATCH_LEVEL)1139 _IRQL_requires_max_(DISPATCH_LEVEL)
1140 FORCEINLINE
1141 VOID
1142 WdfIoQueueStopAndPurge(
1143 _In_
1144 WDFQUEUE Queue,
1145 _When_(Context != 0, _In_)
1146 _When_(Context == 0, _In_opt_)
1147 PFN_WDF_IO_QUEUE_STATE StopAndPurgeComplete,
1148 _When_(StopAndPurgeComplete != 0, _In_)
1149 _When_(StopAndPurgeComplete == 0, _In_opt_)
1150 WDFCONTEXT Context
1151 )
1152 {
1153 ((PFN_WDFIOQUEUESTOPANDPURGE) WdfFunctions[WdfIoQueueStopAndPurgeTableIndex])(WdfDriverGlobals, Queue, StopAndPurgeComplete, Context);
1154 }
1155
1156 //
1157 // WDF Function: WdfIoQueueStopAndPurgeSynchronously
1158 //
1159 typedef
1160 _IRQL_requires_max_(PASSIVE_LEVEL)
1161 WDFAPI
1162 VOID
1163 (STDCALL *PFN_WDFIOQUEUESTOPANDPURGESYNCHRONOUSLY)(
1164 _In_
1165 PWDF_DRIVER_GLOBALS DriverGlobals,
1166 _In_
1167 WDFQUEUE Queue
1168 );
1169
_IRQL_requires_max_(PASSIVE_LEVEL)1170 _IRQL_requires_max_(PASSIVE_LEVEL)
1171 FORCEINLINE
1172 VOID
1173 WdfIoQueueStopAndPurgeSynchronously(
1174 _In_
1175 WDFQUEUE Queue
1176 )
1177 {
1178 ((PFN_WDFIOQUEUESTOPANDPURGESYNCHRONOUSLY) WdfFunctions[WdfIoQueueStopAndPurgeSynchronouslyTableIndex])(WdfDriverGlobals, Queue);
1179 }
1180
1181
1182
1183 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1184
1185
1186 WDF_EXTERN_C_END
1187
1188 #endif // _WDFIO_H_
1189
1190