xref: /reactos/sdk/include/wdf/kmdf/1.17/wdfusb.h (revision 545df815)
1 /*++
2 
3 Copyright (c) Microsoft Corporation.  All rights reserved.
4 
5 _WdfVersionBuild_
6 
7 Module Name:
8 
9     WdfUsb.h
10 
11 Abstract:
12 
13     Contains prototypes for interfacing with a USB connected device
14 
15 Environment:
16 
17     kernel mode only
18 
19 Revision History:
20 
21 --*/
22 
23 //
24 // NOTE: This header is generated by stubwork.  Please make any
25 //       modifications to the corresponding template files
26 //       (.x or .y) and use stubwork to regenerate the header
27 //
28 
29 #ifndef _WDFUSB_H_
30 #define _WDFUSB_H_
31 
32 #ifndef WDF_EXTERN_C
33   #ifdef __cplusplus
34     #define WDF_EXTERN_C       extern "C"
35     #define WDF_EXTERN_C_START extern "C" {
36     #define WDF_EXTERN_C_END   }
37   #else
38     #define WDF_EXTERN_C
39     #define WDF_EXTERN_C_START
40     #define WDF_EXTERN_C_END
41   #endif
42 #endif
43 
44 WDF_EXTERN_C_START
45 
46 
47 
48 #if (NTDDI_VERSION >= NTDDI_WIN2K)
49 
50 #ifndef BMREQUEST_HOST_TO_DEVICE
51 #define BMREQUEST_HOST_TO_DEVICE        0
52 #endif  // BMREQUEST_HOST_TO_DEVICE
53 
54 #ifndef BMREQUEST_DEVICE_TO_HOST
55 #define BMREQUEST_DEVICE_TO_HOST        1
56 #endif  // BMREQUEST_DEVICE_TO_HOST
57 
58 #ifndef BMREQUEST_STANDARD
59 #define BMREQUEST_STANDARD              0
60 #endif  // BMREQUEST_STANDARD
61 
62 #ifndef BMREQUEST_CLASS
63 #define BMREQUEST_CLASS                 1
64 #endif  // BMREQUEST_CLASS
65 
66 #ifndef BMREQUEST_VENDOR
67 #define BMREQUEST_VENDOR                2
68 #endif  // BMREQUEST_VENDOR
69 
70 #ifndef BMREQUEST_TO_DEVICE
71 #define BMREQUEST_TO_DEVICE             0
72 #endif  // BMREQUEST_TO_DEVICE
73 
74 #ifndef BMREQUEST_TO_INTERFACE
75 #define BMREQUEST_TO_INTERFACE          1
76 #endif  // BMREQUEST_TO_INTERFACE
77 
78 #ifndef BMREQUEST_TO_ENDPOINT
79 #define BMREQUEST_TO_ENDPOINT           2
80 #endif  // BMREQUEST_TO_ENDPOINT
81 
82 #ifndef BMREQUEST_TO_OTHER
83 #define BMREQUEST_TO_OTHER              3
84 #endif  // BMREQUEST_TO_OTHER
85 
86 typedef enum _WDF_USB_REQUEST_TYPE {
87     WdfUsbRequestTypeInvalid = 0,
88     WdfUsbRequestTypeNoFormat,
89     WdfUsbRequestTypeDeviceString,
90     WdfUsbRequestTypeDeviceControlTransfer,
91     WdfUsbRequestTypeDeviceUrb,
92     WdfUsbRequestTypePipeWrite,
93     WdfUsbRequestTypePipeRead,
94     WdfUsbRequestTypePipeAbort,
95     WdfUsbRequestTypePipeReset,
96     WdfUsbRequestTypePipeUrb,
97 } WDF_USB_REQUEST_TYPE, *PWDF_USB_REQUEST_TYPE;
98 
99 typedef enum _WDF_USB_BMREQUEST_DIRECTION {
100     BmRequestHostToDevice = BMREQUEST_HOST_TO_DEVICE,
101     BmRequestDeviceToHost = BMREQUEST_DEVICE_TO_HOST,
102 } WDF_USB_BMREQUEST_DIRECTION;
103 
104 typedef enum _WDF_USB_BMREQUEST_TYPE {
105     BmRequestStandard = BMREQUEST_STANDARD,
106     BmRequestClass = BMREQUEST_CLASS,
107     BmRequestVendor = BMREQUEST_VENDOR,
108 } WDF_USB_BMREQUEST_TYPE;
109 
110 typedef enum _WDF_USB_BMREQUEST_RECIPIENT {
111     BmRequestToDevice = BMREQUEST_TO_DEVICE,
112     BmRequestToInterface = BMREQUEST_TO_INTERFACE,
113     BmRequestToEndpoint = BMREQUEST_TO_ENDPOINT,
114     BmRequestToOther = BMREQUEST_TO_OTHER,
115 } WDF_USB_BMREQUEST_RECIPIENT;
116 
117 typedef enum _WDF_USB_PIPE_TYPE {
118     WdfUsbPipeTypeInvalid = 0,
119     WdfUsbPipeTypeControl,
120     WdfUsbPipeTypeIsochronous,
121     WdfUsbPipeTypeBulk,
122     WdfUsbPipeTypeInterrupt,
123 } WDF_USB_PIPE_TYPE;
124 
125 typedef enum _WdfUsbTargetDeviceSelectConfigType {
126     WdfUsbTargetDeviceSelectConfigTypeInvalid = 0,
127     WdfUsbTargetDeviceSelectConfigTypeDeconfig = 1,
128     WdfUsbTargetDeviceSelectConfigTypeSingleInterface = 2,
129     WdfUsbTargetDeviceSelectConfigTypeMultiInterface = 3,
130     WdfUsbTargetDeviceSelectConfigTypeInterfacesPairs = 4,
131     WdfUsbTargetDeviceSelectConfigTypeInterfacesDescriptor = 5,
132     WdfUsbTargetDeviceSelectConfigTypeUrb = 6,
133 } WdfUsbTargetDeviceSelectConfigType;
134 
135 typedef enum _WdfUsbTargetDeviceSelectSettingType {
136     WdfUsbInterfaceSelectSettingTypeDescriptor = 0x10,
137     WdfUsbInterfaceSelectSettingTypeSetting = 0x11,
138     WdfUsbInterfaceSelectSettingTypeUrb = 0x12,
139 } WdfUsbTargetDeviceSelectSettingType;
140 
141 typedef enum _WDF_USB_DEVICE_TRAITS {
142     WDF_USB_DEVICE_TRAIT_SELF_POWERED =        0x00000001,
143     WDF_USB_DEVICE_TRAIT_REMOTE_WAKE_CAPABLE = 0x00000002,
144     WDF_USB_DEVICE_TRAIT_AT_HIGH_SPEED =       0x00000004,
145 } WDF_USB_DEVICE_TRAITS;
146 
147 
148 
149 typedef union _WDF_USB_CONTROL_SETUP_PACKET {
150     struct {
151         union {
152             struct {
153                 //
154                 // Valid values are BMREQUEST_TO_DEVICE, BMREQUEST_TO_INTERFACE,
155                 // BMREQUEST_TO_ENDPOINT, BMREQUEST_TO_OTHER
156                 //
157                 BYTE Recipient:2;
158 
159                 BYTE Reserved:3;
160 
161                 //
162                 // Valid values are BMREQUEST_STANDARD, BMREQUEST_CLASS,
163                 // BMREQUEST_VENDOR
164                 //
165                 BYTE Type:2;
166 
167                 //
168                 // Valid values are BMREQUEST_HOST_TO_DEVICE,
169                 // BMREQUEST_DEVICE_TO_HOST
170                 //
171                 BYTE Dir:1;
172             } Request;
173             BYTE Byte;
174         } bm;
175 
176         BYTE bRequest;
177 
178         union {
179             struct {
180                 BYTE LowByte;
181                 BYTE HiByte;
182             } Bytes;
183             USHORT Value;
184         } wValue;
185 
186         union {
187             struct {
188                 BYTE LowByte;
189                 BYTE HiByte;
190             } Bytes;
191             USHORT Value;
192         } wIndex;
193 
194         USHORT wLength;
195     } Packet;
196 
197     struct {
198         BYTE Bytes[8];
199     } Generic;
200 } WDF_USB_CONTROL_SETUP_PACKET, *PWDF_USB_CONTROL_SETUP_PACKET;
201 
202 FORCEINLINE
203 VOID
WDF_USB_CONTROL_SETUP_PACKET_INIT(_Out_ PWDF_USB_CONTROL_SETUP_PACKET Packet,_In_ WDF_USB_BMREQUEST_DIRECTION Direction,_In_ WDF_USB_BMREQUEST_RECIPIENT Recipient,_In_ BYTE Request,_In_ USHORT Value,_In_ USHORT Index)204 WDF_USB_CONTROL_SETUP_PACKET_INIT(
205     _Out_ PWDF_USB_CONTROL_SETUP_PACKET Packet,
206     _In_ WDF_USB_BMREQUEST_DIRECTION Direction,
207     _In_ WDF_USB_BMREQUEST_RECIPIENT Recipient,
208     _In_ BYTE Request,
209     _In_ USHORT Value,
210     _In_ USHORT Index
211     )
212 {
213     RtlZeroMemory(Packet, sizeof(WDF_USB_CONTROL_SETUP_PACKET));
214 
215     Packet->Packet.bm.Request.Dir = (BYTE) Direction;
216     Packet->Packet.bm.Request.Type = (BYTE) BmRequestStandard;
217     Packet->Packet.bm.Request.Recipient = (BYTE) Recipient;
218 
219     Packet->Packet.bRequest = Request;
220     Packet->Packet.wValue.Value = Value;
221     Packet->Packet.wIndex.Value = Index;
222 
223     // Packet->Packet.wLength will be set by the formatting function
224 }
225 
226 FORCEINLINE
227 VOID
WDF_USB_CONTROL_SETUP_PACKET_INIT_CLASS(_Out_ PWDF_USB_CONTROL_SETUP_PACKET Packet,_In_ WDF_USB_BMREQUEST_DIRECTION Direction,_In_ WDF_USB_BMREQUEST_RECIPIENT Recipient,_In_ BYTE Request,_In_ USHORT Value,_In_ USHORT Index)228 WDF_USB_CONTROL_SETUP_PACKET_INIT_CLASS(
229     _Out_ PWDF_USB_CONTROL_SETUP_PACKET Packet,
230     _In_ WDF_USB_BMREQUEST_DIRECTION Direction,
231     _In_ WDF_USB_BMREQUEST_RECIPIENT Recipient,
232     _In_ BYTE Request,
233     _In_ USHORT Value,
234     _In_ USHORT Index
235     )
236 {
237     RtlZeroMemory(Packet, sizeof(WDF_USB_CONTROL_SETUP_PACKET));
238 
239     Packet->Packet.bm.Request.Dir = (BYTE) Direction;
240     Packet->Packet.bm.Request.Type = (BYTE) BmRequestClass;
241     Packet->Packet.bm.Request.Recipient = (BYTE) Recipient;
242 
243     Packet->Packet.bRequest = Request;
244     Packet->Packet.wValue.Value = Value;
245     Packet->Packet.wIndex.Value = Index;
246 
247     // Packet->Packet.wLength will be set by the formatting function
248 }
249 
250 FORCEINLINE
251 VOID
WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(_Out_ PWDF_USB_CONTROL_SETUP_PACKET Packet,_In_ WDF_USB_BMREQUEST_DIRECTION Direction,_In_ WDF_USB_BMREQUEST_RECIPIENT Recipient,_In_ BYTE Request,_In_ USHORT Value,_In_ USHORT Index)252 WDF_USB_CONTROL_SETUP_PACKET_INIT_VENDOR(
253     _Out_ PWDF_USB_CONTROL_SETUP_PACKET Packet,
254     _In_ WDF_USB_BMREQUEST_DIRECTION Direction,
255     _In_ WDF_USB_BMREQUEST_RECIPIENT Recipient,
256     _In_ BYTE Request,
257     _In_ USHORT Value,
258     _In_ USHORT Index
259     )
260 {
261     RtlZeroMemory(Packet, sizeof(WDF_USB_CONTROL_SETUP_PACKET));
262 
263     Packet->Packet.bm.Request.Dir = (BYTE) Direction;
264     Packet->Packet.bm.Request.Type = (BYTE) BmRequestVendor;
265     Packet->Packet.bm.Request.Recipient = (BYTE) Recipient;
266 
267     Packet->Packet.bRequest = Request;
268     Packet->Packet.wValue.Value = Value;
269     Packet->Packet.wIndex.Value = Index;
270 
271     // Packet->Packet.wLength will be set by the formatting function
272 }
273 
274 FORCEINLINE
275 VOID
WDF_USB_CONTROL_SETUP_PACKET_INIT_FEATURE(_Out_ PWDF_USB_CONTROL_SETUP_PACKET Packet,_In_ WDF_USB_BMREQUEST_RECIPIENT BmRequestRecipient,_In_ USHORT FeatureSelector,_In_ USHORT Index,_In_ BOOLEAN SetFeature)276 WDF_USB_CONTROL_SETUP_PACKET_INIT_FEATURE(
277     _Out_ PWDF_USB_CONTROL_SETUP_PACKET Packet,
278     _In_ WDF_USB_BMREQUEST_RECIPIENT BmRequestRecipient,
279     _In_ USHORT FeatureSelector,
280     _In_ USHORT Index,
281     _In_ BOOLEAN SetFeature
282     )
283 {
284     RtlZeroMemory(Packet, sizeof(WDF_USB_CONTROL_SETUP_PACKET));
285 
286     Packet->Packet.bm.Request.Dir = (BYTE) BmRequestHostToDevice;
287     Packet->Packet.bm.Request.Type = (BYTE) BmRequestStandard;
288     Packet->Packet.bm.Request.Recipient = (BYTE) BmRequestRecipient;
289 
290     if (SetFeature) {
291         Packet->Packet.bRequest = USB_REQUEST_SET_FEATURE;
292     }
293     else {
294         Packet->Packet.bRequest = USB_REQUEST_CLEAR_FEATURE;
295     }
296 
297     Packet->Packet.wValue.Value = FeatureSelector;
298     Packet->Packet.wIndex.Value = Index;
299 
300     // Packet->Packet.wLength will be set by the formatting function
301 }
302 
303 FORCEINLINE
304 VOID
WDF_USB_CONTROL_SETUP_PACKET_INIT_GET_STATUS(_Out_ PWDF_USB_CONTROL_SETUP_PACKET Packet,_In_ WDF_USB_BMREQUEST_RECIPIENT BmRequestRecipient,_In_ USHORT Index)305 WDF_USB_CONTROL_SETUP_PACKET_INIT_GET_STATUS(
306     _Out_ PWDF_USB_CONTROL_SETUP_PACKET Packet,
307     _In_ WDF_USB_BMREQUEST_RECIPIENT BmRequestRecipient,
308     _In_ USHORT Index
309     )
310 {
311     RtlZeroMemory(Packet, sizeof(WDF_USB_CONTROL_SETUP_PACKET));
312 
313     Packet->Packet.bm.Request.Dir = (BYTE) BmRequestDeviceToHost;
314     Packet->Packet.bm.Request.Type = (BYTE) BmRequestStandard;
315     Packet->Packet.bm.Request.Recipient = (BYTE) BmRequestRecipient;
316 
317     Packet->Packet.bRequest = USB_REQUEST_GET_STATUS;
318     Packet->Packet.wIndex.Value = Index;
319     Packet->Packet.wValue.Value = 0;
320 
321     // Packet->Packet.wLength will be set by the formatting function
322 }
323 
324 typedef struct _WDF_USB_REQUEST_COMPLETION_PARAMS {
325     USBD_STATUS UsbdStatus;
326 
327     WDF_USB_REQUEST_TYPE Type;
328 
329     union {
330         struct {
331             WDFMEMORY Buffer;
332             USHORT LangID;
333             UCHAR StringIndex;
334 
335             //
336             // If STATUS_BUFFER_OVERFLOW is returned, this field will contain the
337             // number of bytes required to retrieve the entire string.
338             //
339             UCHAR RequiredSize;
340         } DeviceString;
341 
342         struct {
343             WDFMEMORY Buffer;
344             WDF_USB_CONTROL_SETUP_PACKET SetupPacket;
345             ULONG Length;
346         } DeviceControlTransfer;
347 
348         struct {
349             WDFMEMORY Buffer;
350         } DeviceUrb;
351 
352         struct {
353             WDFMEMORY Buffer;
354             size_t Length;
355             size_t Offset;
356         } PipeWrite;
357 
358         struct {
359             WDFMEMORY Buffer;
360             size_t Length;
361             size_t Offset;
362         } PipeRead;
363 
364         struct {
365             WDFMEMORY Buffer;
366         } PipeUrb;
367     } Parameters;
368 
369 } WDF_USB_REQUEST_COMPLETION_PARAMS, *PWDF_USB_REQUEST_COMPLETION_PARAMS;
370 
371 typedef
372 _Function_class_(EVT_WDF_USB_READER_COMPLETION_ROUTINE)
373 _IRQL_requires_same_
374 _IRQL_requires_max_(DISPATCH_LEVEL)
375 VOID
376 STDCALL
377 EVT_WDF_USB_READER_COMPLETION_ROUTINE(
378     _In_
379     WDFUSBPIPE Pipe,
380     _In_
381     WDFMEMORY Buffer,
382     _In_
383     size_t NumBytesTransferred,
384     _In_
385     WDFCONTEXT Context
386     );
387 
388 typedef EVT_WDF_USB_READER_COMPLETION_ROUTINE *PFN_WDF_USB_READER_COMPLETION_ROUTINE;
389 
390 typedef
391 _Function_class_(EVT_WDF_USB_READERS_FAILED)
392 _IRQL_requires_same_
393 _IRQL_requires_max_(PASSIVE_LEVEL)
394 BOOLEAN
395 STDCALL
396 EVT_WDF_USB_READERS_FAILED(
397     _In_
398     WDFUSBPIPE Pipe,
399     _In_
400     NTSTATUS Status,
401     _In_
402     USBD_STATUS UsbdStatus
403     );
404 
405 typedef EVT_WDF_USB_READERS_FAILED *PFN_WDF_USB_READERS_FAILED;
406 
407 typedef struct _WDF_USB_CONTINUOUS_READER_CONFIG {
408     //
409     // Size of the string in bytes
410     //
411     ULONG Size;
412 
413     //
414     // Number of bytes to send ask for from the usb device.
415     //
416     size_t TransferLength;
417 
418     //
419     // Number of bytes to allocate before the requested transfer length
420     //
421     size_t HeaderLength;
422 
423     //
424     // Number of bytes to allocate after the requested transfer length
425     //
426     size_t TrailerLength;
427 
428     //
429     // Number of reads to send to the device at once.  If zero is specified, the
430     // default will be used.
431     //
432     UCHAR NumPendingReads;
433 
434     //
435     // Optional attributes to apply to each WDFMEMORY allocated for each read
436     //
437     PWDF_OBJECT_ATTRIBUTES BufferAttributes;
438 
439     //
440     // Event callback invoked when a read is completed
441     //
442     PFN_WDF_USB_READER_COMPLETION_ROUTINE EvtUsbTargetPipeReadComplete;
443 
444     //
445     // Context to be passed to EvtUsbTargetPipeReadComplete
446     //
447     WDFCONTEXT EvtUsbTargetPipeReadCompleteContext;
448 
449     //
450     // Event callback invoked when a reader fails.  If TRUE is returned, the
451     // readers are restarted.
452     //
453     PFN_WDF_USB_READERS_FAILED EvtUsbTargetPipeReadersFailed;
454 
455 } WDF_USB_CONTINUOUS_READER_CONFIG, *PWDF_USB_CONTINUOUS_READER_CONFIG;
456 
457 
458 FORCEINLINE
459 VOID
WDF_USB_CONTINUOUS_READER_CONFIG_INIT(_Out_ PWDF_USB_CONTINUOUS_READER_CONFIG Config,_In_ PFN_WDF_USB_READER_COMPLETION_ROUTINE EvtUsbTargetPipeReadComplete,_In_ WDFCONTEXT EvtUsbTargetPipeReadCompleteContext,_In_ size_t TransferLength)460 WDF_USB_CONTINUOUS_READER_CONFIG_INIT(
461     _Out_ PWDF_USB_CONTINUOUS_READER_CONFIG Config,
462     _In_ PFN_WDF_USB_READER_COMPLETION_ROUTINE EvtUsbTargetPipeReadComplete,
463     _In_ WDFCONTEXT EvtUsbTargetPipeReadCompleteContext,
464     _In_ size_t TransferLength
465     )
466 
467 {
468     RtlZeroMemory(Config, sizeof(WDF_USB_CONTINUOUS_READER_CONFIG));
469     Config->Size = sizeof(WDF_USB_CONTINUOUS_READER_CONFIG);
470 
471     Config->EvtUsbTargetPipeReadComplete = EvtUsbTargetPipeReadComplete;
472     Config->EvtUsbTargetPipeReadCompleteContext = EvtUsbTargetPipeReadCompleteContext;
473     Config->TransferLength = TransferLength;
474 }
475 
476 FORCEINLINE
477 WDFIOTARGET
WdfUsbTargetDeviceGetIoTarget(_In_ WDFUSBDEVICE UsbDevice)478 WdfUsbTargetDeviceGetIoTarget(
479     _In_ WDFUSBDEVICE UsbDevice
480     )
481 {
482     return (WDFIOTARGET) UsbDevice;
483 }
484 
485 typedef struct _WDF_USB_DEVICE_INFORMATION {
486     //
487     // Size of this structure in bytes
488     //
489     ULONG Size;
490 
491     //
492     // USBD version information
493     //
494     USBD_VERSION_INFORMATION UsbdVersionInformation;
495 
496     //
497     // Usb controller port capabilities
498     //
499     ULONG HcdPortCapabilities;
500 
501     //
502     // Bitfield of WDF_USB_DEVICE_TRAITS values
503     //
504     ULONG Traits;
505 
506 } WDF_USB_DEVICE_INFORMATION, *PWDF_USB_DEVICE_INFORMATION;
507 
508 FORCEINLINE
509 VOID
WDF_USB_DEVICE_INFORMATION_INIT(_Out_ PWDF_USB_DEVICE_INFORMATION Udi)510 WDF_USB_DEVICE_INFORMATION_INIT(
511     _Out_ PWDF_USB_DEVICE_INFORMATION Udi
512     )
513 {
514     RtlZeroMemory(Udi, sizeof(WDF_USB_DEVICE_INFORMATION));
515     Udi->Size = sizeof(WDF_USB_DEVICE_INFORMATION);
516 }
517 
518 typedef struct _WDF_USB_INTERFACE_SETTING_PAIR {
519     //
520     // Interface to select
521     //
522     WDFUSBINTERFACE UsbInterface;
523 
524     //
525     // Setting to select on UsbInterface
526     //
527     UCHAR SettingIndex;
528 
529 } WDF_USB_INTERFACE_SETTING_PAIR, *PWDF_USB_INTERFACE_SETTING_PAIR;
530 
531 typedef struct _WDF_USB_DEVICE_SELECT_CONFIG_PARAMS {
532     //
533     // Size of the structure in bytes
534     //
535     ULONG Size;
536 
537     //
538     // Type of select config, one of WdfUsbTargetDeviceSelectConfigType values
539     //
540     WdfUsbTargetDeviceSelectConfigType Type;
541 
542 
543     union {
544         struct {
545             //
546             // Configuration descriptor to use
547             //
548             PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
549 
550             //
551             // Array of interface descriptors pointers.
552             //
553             PUSB_INTERFACE_DESCRIPTOR * InterfaceDescriptors;
554 
555             //
556             // Number of elements in the InterfaceDescrtiptors pointer array.
557             //
558             ULONG NumInterfaceDescriptors;
559 
560         } Descriptor;
561 
562         struct {
563             //
564             // Preallocated select config URB formatted by the caller.
565             // Will be used, as supplied without modification, as the select
566             // config request.
567             //
568             PURB Urb;
569 
570         } Urb;
571 
572         struct {
573             //
574             // Number of pipes configured on the single after.  This value is
575             // returned to the caller after a succssful call.
576             //
577             UCHAR   NumberConfiguredPipes;
578 
579             //
580             // The interface which was configred.  This value is returned to the
581             // caller after a successful call.
582             //
583             WDFUSBINTERFACE ConfiguredUsbInterface;
584 
585         } SingleInterface;
586 
587         struct {
588             //
589             // Number of interface pairs in the Pairs array
590             //
591             UCHAR NumberInterfaces;
592 
593             //
594             // Array of interface + settings
595             //
596             PWDF_USB_INTERFACE_SETTING_PAIR Pairs;
597 
598             //
599             // Number of interfaces which were configured after a successful call
600             //
601             UCHAR NumberOfConfiguredInterfaces;
602 
603         } MultiInterface;
604 
605     } Types;
606 
607 } WDF_USB_DEVICE_SELECT_CONFIG_PARAMS, *PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS;
608 
609 
610 FORCEINLINE
611 VOID
WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_SINGLE_INTERFACE(_Out_ PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params)612 WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_SINGLE_INTERFACE(
613     _Out_ PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params
614     )
615 {
616     RtlZeroMemory(Params, sizeof(WDF_USB_DEVICE_SELECT_CONFIG_PARAMS));
617 
618     Params->Size = sizeof(WDF_USB_DEVICE_SELECT_CONFIG_PARAMS);
619     Params->Type = WdfUsbTargetDeviceSelectConfigTypeSingleInterface;
620 }
621 
622 FORCEINLINE
623 VOID
WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_MULTIPLE_INTERFACES(_Out_ PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params,_In_opt_ UCHAR NumberInterfaces,_In_opt_ PWDF_USB_INTERFACE_SETTING_PAIR SettingPairs)624 WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_MULTIPLE_INTERFACES(
625     _Out_  PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params,
626     _In_opt_ UCHAR NumberInterfaces,
627     _In_opt_ PWDF_USB_INTERFACE_SETTING_PAIR SettingPairs
628     )
629 {
630     RtlZeroMemory(Params, sizeof(WDF_USB_DEVICE_SELECT_CONFIG_PARAMS));
631 
632     Params->Size = sizeof(WDF_USB_DEVICE_SELECT_CONFIG_PARAMS);
633 
634     if (SettingPairs != NULL && NumberInterfaces != 0) {
635         Params->Type = WdfUsbTargetDeviceSelectConfigTypeInterfacesPairs;
636 
637         Params->Types.MultiInterface.NumberInterfaces = NumberInterfaces;
638         Params->Types.MultiInterface.Pairs = SettingPairs;
639     }
640     else {
641         Params->Type = WdfUsbTargetDeviceSelectConfigTypeMultiInterface;
642     }
643 }
644 
645 FORCEINLINE
646 VOID
WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_INTERFACES_DESCRIPTORS(_Out_ PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params,_In_ PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor,_In_ PUSB_INTERFACE_DESCRIPTOR * InterfaceDescriptors,_In_ ULONG NumInterfaceDescriptors)647 WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_INTERFACES_DESCRIPTORS(
648     _Out_ PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params,
649     _In_  PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor,
650     _In_  PUSB_INTERFACE_DESCRIPTOR* InterfaceDescriptors,
651     _In_  ULONG NumInterfaceDescriptors
652     )
653 {
654     RtlZeroMemory(Params, sizeof(WDF_USB_DEVICE_SELECT_CONFIG_PARAMS));
655 
656     Params->Size = sizeof(WDF_USB_DEVICE_SELECT_CONFIG_PARAMS);
657     Params->Type = WdfUsbTargetDeviceSelectConfigTypeInterfacesDescriptor;
658     Params->Types.Descriptor.ConfigurationDescriptor = ConfigDescriptor;
659     Params->Types.Descriptor.InterfaceDescriptors = InterfaceDescriptors;
660     Params->Types.Descriptor.NumInterfaceDescriptors = NumInterfaceDescriptors;
661 }
662 
663 FORCEINLINE
664 VOID
WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_URB(_Out_ PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params,_In_ PURB Urb)665 WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_URB(
666     _Out_ PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params,
667     _In_  PURB Urb
668     )
669 {
670     RtlZeroMemory(Params, sizeof(WDF_USB_DEVICE_SELECT_CONFIG_PARAMS));
671 
672     Params->Size = sizeof(WDF_USB_DEVICE_SELECT_CONFIG_PARAMS);
673     Params->Type = WdfUsbTargetDeviceSelectConfigTypeUrb;
674     Params->Types.Urb.Urb = Urb;
675 }
676 
677 
678 VOID
679 FORCEINLINE
WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_DECONFIG(_Out_ PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params)680 WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_DECONFIG(
681     _Out_ PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params
682     )
683 {
684     RtlZeroMemory(Params, sizeof(WDF_USB_DEVICE_SELECT_CONFIG_PARAMS));
685 
686     Params->Size = sizeof(WDF_USB_DEVICE_SELECT_CONFIG_PARAMS);
687     Params->Type = WdfUsbTargetDeviceSelectConfigTypeDeconfig;
688 }
689 
690 typedef struct _WDF_USB_INTERFACE_SELECT_SETTING_PARAMS {
691     //
692     // Size of this data structure in bytes
693     //
694     ULONG Size;
695 
696     //
697     // Type of select interface as indicated by one of the
698     // WdfUsbTargetDeviceSelectSettingType values.
699     //
700     WdfUsbTargetDeviceSelectSettingType Type;
701 
702     union {
703 
704         struct {
705             //
706             // Interface descriptor that will be used in the interface selection
707             //
708             PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
709 
710         } Descriptor;
711 
712         struct {
713             //
714             // The setting index of the WDFUSBINTERFACE to use
715             //
716             UCHAR SettingIndex;
717 
718         } Interface;
719 
720         struct {
721             //
722             // Preformatted select interface URB which will be used in the
723             // select interface request.
724             //
725             PURB Urb;
726 
727         } Urb;
728 
729     } Types;
730 
731 } WDF_USB_INTERFACE_SELECT_SETTING_PARAMS, *PWDF_USB_INTERFACE_SELECT_SETTING_PARAMS;
732 
733 FORCEINLINE
734 VOID
WDF_USB_INTERFACE_SELECT_SETTING_PARAMS_INIT_DESCRIPTOR(_Out_ PWDF_USB_INTERFACE_SELECT_SETTING_PARAMS Params,_In_ PUSB_INTERFACE_DESCRIPTOR Interface)735 WDF_USB_INTERFACE_SELECT_SETTING_PARAMS_INIT_DESCRIPTOR(
736     _Out_ PWDF_USB_INTERFACE_SELECT_SETTING_PARAMS Params,
737     _In_  PUSB_INTERFACE_DESCRIPTOR Interface
738     )
739 {
740     RtlZeroMemory(Params, sizeof(WDF_USB_INTERFACE_SELECT_SETTING_PARAMS));
741 
742     Params->Size = sizeof(WDF_USB_INTERFACE_SELECT_SETTING_PARAMS);
743     Params->Type = WdfUsbInterfaceSelectSettingTypeDescriptor;
744     Params->Types.Descriptor.InterfaceDescriptor = Interface;
745 }
746 
747 FORCEINLINE
748 VOID
WDF_USB_INTERFACE_SELECT_SETTING_PARAMS_INIT_URB(_Out_ PWDF_USB_INTERFACE_SELECT_SETTING_PARAMS Params,_In_ PURB Urb)749 WDF_USB_INTERFACE_SELECT_SETTING_PARAMS_INIT_URB(
750     _Out_ PWDF_USB_INTERFACE_SELECT_SETTING_PARAMS Params,
751     _In_  PURB Urb
752     )
753 {
754     RtlZeroMemory(Params, sizeof(WDF_USB_INTERFACE_SELECT_SETTING_PARAMS));
755 
756     Params->Size = sizeof(WDF_USB_INTERFACE_SELECT_SETTING_PARAMS);
757     Params->Type = WdfUsbInterfaceSelectSettingTypeUrb;
758     Params->Types.Urb.Urb = Urb;
759 }
760 
761 FORCEINLINE
762 VOID
WDF_USB_INTERFACE_SELECT_SETTING_PARAMS_INIT_SETTING(_Out_ PWDF_USB_INTERFACE_SELECT_SETTING_PARAMS Params,_In_ UCHAR SettingIndex)763 WDF_USB_INTERFACE_SELECT_SETTING_PARAMS_INIT_SETTING(
764     _Out_ PWDF_USB_INTERFACE_SELECT_SETTING_PARAMS Params,
765     _In_  UCHAR SettingIndex
766     )
767 {
768     RtlZeroMemory(Params, sizeof(WDF_USB_INTERFACE_SELECT_SETTING_PARAMS));
769 
770     Params->Size = sizeof(WDF_USB_INTERFACE_SELECT_SETTING_PARAMS);
771     Params->Type = WdfUsbInterfaceSelectSettingTypeSetting;
772     Params->Types.Interface.SettingIndex = SettingIndex;
773 }
774 
775 FORCEINLINE
776 WDFIOTARGET
WdfUsbTargetPipeGetIoTarget(_In_ WDFUSBPIPE Pipe)777 WdfUsbTargetPipeGetIoTarget(
778     _In_ WDFUSBPIPE Pipe
779     )
780 {
781     return (WDFIOTARGET) Pipe;
782 }
783 
784 typedef struct _WDF_USB_PIPE_INFORMATION {
785     //
786     // Size of the structure in bytes
787     //
788     ULONG Size;
789 
790     //
791     // Maximum packet size this device is capable of
792     //
793     ULONG MaximumPacketSize;
794 
795     //
796     // Raw endpoint address of the device as described by its descriptor
797     //
798     UCHAR EndpointAddress;
799 
800     //
801     // Polling interval
802     //
803     UCHAR Interval;
804 
805     //
806     // Which alternate setting this structure is relevant for
807     //
808     UCHAR SettingIndex;
809 
810     //
811     // The type of the pipe
812     WDF_USB_PIPE_TYPE PipeType;
813 
814     //
815     // Maximum size of one transfer which should be sent to the host controller
816     //
817     ULONG  MaximumTransferSize;
818 
819 } WDF_USB_PIPE_INFORMATION, *PWDF_USB_PIPE_INFORMATION;
820 
821 FORCEINLINE
822 VOID
WDF_USB_PIPE_INFORMATION_INIT(_Out_ PWDF_USB_PIPE_INFORMATION Info)823 WDF_USB_PIPE_INFORMATION_INIT(
824     _Out_ PWDF_USB_PIPE_INFORMATION Info
825     )
826 {
827     RtlZeroMemory(Info, sizeof(WDF_USB_PIPE_INFORMATION));
828 
829     Info->Size = sizeof(WDF_USB_PIPE_INFORMATION);
830 }
831 
832 FORCEINLINE
833 BOOLEAN
WDF_USB_PIPE_DIRECTION_IN(_In_ UCHAR EndpointAddress)834 WDF_USB_PIPE_DIRECTION_IN(
835     _In_ UCHAR EndpointAddress
836     )
837 {
838     //
839     // If the high bit is set, we have an IN pipe
840     //
841     return (EndpointAddress & USB_ENDPOINT_DIRECTION_MASK) ? TRUE : FALSE;
842 }
843 
844 FORCEINLINE
845 BOOLEAN
WDF_USB_PIPE_DIRECTION_OUT(_In_ UCHAR EndpointAddress)846 WDF_USB_PIPE_DIRECTION_OUT(
847     _In_ UCHAR EndpointAddress
848     )
849 {
850     //
851     // If the high bit is clear, we have an OUT pipe
852     //
853     return (EndpointAddress & USB_ENDPOINT_DIRECTION_MASK) == 0x00 ? TRUE : FALSE;
854 }
855 
856 typedef struct _WDF_USB_DEVICE_CREATE_CONFIG {
857     //
858     // Size of this structure in bytes
859     //
860     ULONG   Size;
861 
862     //
863     // USBD Client Contraction of the Wdf Client
864     //
865     ULONG   USBDClientContractVersion;
866 
867 } WDF_USB_DEVICE_CREATE_CONFIG, *PWDF_USB_DEVICE_CREATE_CONFIG;
868 
869 FORCEINLINE
870 VOID
WDF_USB_DEVICE_CREATE_CONFIG_INIT(_Out_ PWDF_USB_DEVICE_CREATE_CONFIG Config,_In_ ULONG USBDClientContractVersion)871 WDF_USB_DEVICE_CREATE_CONFIG_INIT(
872     _Out_ PWDF_USB_DEVICE_CREATE_CONFIG Config,
873     _In_ ULONG USBDClientContractVersion
874     )
875 {
876     RtlZeroMemory(Config, sizeof(WDF_USB_DEVICE_CREATE_CONFIG));
877 
878     Config->Size = sizeof(WDF_USB_DEVICE_CREATE_CONFIG);
879     Config->USBDClientContractVersion = USBDClientContractVersion;
880 }
881 
882 //
883 // For WdfUsbTargetDeviceCreateIsochUrb's typedef
884 //
885 #ifdef __MSC_VER
886 #pragma warning(disable:28285)
887 #endif
888 
889 //
890 // WDF Function: WdfUsbTargetDeviceCreate
891 //
892 typedef
893 _Must_inspect_result_
894 _IRQL_requires_max_(PASSIVE_LEVEL)
895 WDFAPI
896 NTSTATUS
897 (STDCALL *PFN_WDFUSBTARGETDEVICECREATE)(
898     _In_
899     PWDF_DRIVER_GLOBALS DriverGlobals,
900     _In_
901     WDFDEVICE Device,
902     _In_opt_
903     PWDF_OBJECT_ATTRIBUTES Attributes,
904     _Out_
905     WDFUSBDEVICE* UsbDevice
906     );
907 
908 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)909 _IRQL_requires_max_(PASSIVE_LEVEL)
910 FORCEINLINE
911 NTSTATUS
912 WdfUsbTargetDeviceCreate(
913     _In_
914     WDFDEVICE Device,
915     _In_opt_
916     PWDF_OBJECT_ATTRIBUTES Attributes,
917     _Out_
918     WDFUSBDEVICE* UsbDevice
919     )
920 {
921     return ((PFN_WDFUSBTARGETDEVICECREATE) WdfFunctions[WdfUsbTargetDeviceCreateTableIndex])(WdfDriverGlobals, Device, Attributes, UsbDevice);
922 }
923 
924 //
925 // WDF Function: WdfUsbTargetDeviceCreateWithParameters
926 //
927 typedef
928 _Must_inspect_result_
929 _IRQL_requires_max_(PASSIVE_LEVEL)
930 WDFAPI
931 NTSTATUS
932 (STDCALL *PFN_WDFUSBTARGETDEVICECREATEWITHPARAMETERS)(
933     _In_
934     PWDF_DRIVER_GLOBALS DriverGlobals,
935     _In_
936     WDFDEVICE Device,
937     _In_
938     PWDF_USB_DEVICE_CREATE_CONFIG Config,
939     _In_opt_
940     PWDF_OBJECT_ATTRIBUTES Attributes,
941     _Out_
942     WDFUSBDEVICE* UsbDevice
943     );
944 
945 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)946 _IRQL_requires_max_(PASSIVE_LEVEL)
947 FORCEINLINE
948 NTSTATUS
949 WdfUsbTargetDeviceCreateWithParameters(
950     _In_
951     WDFDEVICE Device,
952     _In_
953     PWDF_USB_DEVICE_CREATE_CONFIG Config,
954     _In_opt_
955     PWDF_OBJECT_ATTRIBUTES Attributes,
956     _Out_
957     WDFUSBDEVICE* UsbDevice
958     )
959 {
960     return ((PFN_WDFUSBTARGETDEVICECREATEWITHPARAMETERS) WdfFunctions[WdfUsbTargetDeviceCreateWithParametersTableIndex])(WdfDriverGlobals, Device, Config, Attributes, UsbDevice);
961 }
962 
963 //
964 // WDF Function: WdfUsbTargetDeviceRetrieveInformation
965 //
966 typedef
967 _Must_inspect_result_
968 _IRQL_requires_max_(DISPATCH_LEVEL)
969 WDFAPI
970 NTSTATUS
971 (STDCALL *PFN_WDFUSBTARGETDEVICERETRIEVEINFORMATION)(
972     _In_
973     PWDF_DRIVER_GLOBALS DriverGlobals,
974     _In_
975     WDFUSBDEVICE UsbDevice,
976     _Out_
977     PWDF_USB_DEVICE_INFORMATION Information
978     );
979 
980 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)981 _IRQL_requires_max_(DISPATCH_LEVEL)
982 FORCEINLINE
983 NTSTATUS
984 WdfUsbTargetDeviceRetrieveInformation(
985     _In_
986     WDFUSBDEVICE UsbDevice,
987     _Out_
988     PWDF_USB_DEVICE_INFORMATION Information
989     )
990 {
991     return ((PFN_WDFUSBTARGETDEVICERETRIEVEINFORMATION) WdfFunctions[WdfUsbTargetDeviceRetrieveInformationTableIndex])(WdfDriverGlobals, UsbDevice, Information);
992 }
993 
994 //
995 // WDF Function: WdfUsbTargetDeviceGetDeviceDescriptor
996 //
997 typedef
998 _IRQL_requires_max_(PASSIVE_LEVEL)
999 WDFAPI
1000 VOID
1001 (STDCALL *PFN_WDFUSBTARGETDEVICEGETDEVICEDESCRIPTOR)(
1002     _In_
1003     PWDF_DRIVER_GLOBALS DriverGlobals,
1004     _In_
1005     WDFUSBDEVICE UsbDevice,
1006     _Out_
1007     PUSB_DEVICE_DESCRIPTOR UsbDeviceDescriptor
1008     );
1009 
_IRQL_requires_max_(PASSIVE_LEVEL)1010 _IRQL_requires_max_(PASSIVE_LEVEL)
1011 FORCEINLINE
1012 VOID
1013 WdfUsbTargetDeviceGetDeviceDescriptor(
1014     _In_
1015     WDFUSBDEVICE UsbDevice,
1016     _Out_
1017     PUSB_DEVICE_DESCRIPTOR UsbDeviceDescriptor
1018     )
1019 {
1020     ((PFN_WDFUSBTARGETDEVICEGETDEVICEDESCRIPTOR) WdfFunctions[WdfUsbTargetDeviceGetDeviceDescriptorTableIndex])(WdfDriverGlobals, UsbDevice, UsbDeviceDescriptor);
1021 }
1022 
1023 //
1024 // WDF Function: WdfUsbTargetDeviceRetrieveConfigDescriptor
1025 //
1026 typedef
1027 _Must_inspect_result_
1028 _IRQL_requires_max_(PASSIVE_LEVEL)
1029 WDFAPI
1030 NTSTATUS
1031 (STDCALL *PFN_WDFUSBTARGETDEVICERETRIEVECONFIGDESCRIPTOR)(
1032     _In_
1033     PWDF_DRIVER_GLOBALS DriverGlobals,
1034     _In_
1035     WDFUSBDEVICE UsbDevice,
1036     _Out_writes_bytes_to_opt_(*ConfigDescriptorLength,*ConfigDescriptorLength)
1037     PVOID ConfigDescriptor,
1038     _Inout_
1039     PUSHORT ConfigDescriptorLength
1040     );
1041 
1042 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1043 _IRQL_requires_max_(PASSIVE_LEVEL)
1044 FORCEINLINE
1045 NTSTATUS
1046 WdfUsbTargetDeviceRetrieveConfigDescriptor(
1047     _In_
1048     WDFUSBDEVICE UsbDevice,
1049     _Out_writes_bytes_to_opt_(*ConfigDescriptorLength,*ConfigDescriptorLength)
1050     PVOID ConfigDescriptor,
1051     _Inout_
1052     PUSHORT ConfigDescriptorLength
1053     )
1054 {
1055     return ((PFN_WDFUSBTARGETDEVICERETRIEVECONFIGDESCRIPTOR) WdfFunctions[WdfUsbTargetDeviceRetrieveConfigDescriptorTableIndex])(WdfDriverGlobals, UsbDevice, ConfigDescriptor, ConfigDescriptorLength);
1056 }
1057 
1058 //
1059 // WDF Function: WdfUsbTargetDeviceQueryString
1060 //
1061 typedef
1062 _Must_inspect_result_
1063 _IRQL_requires_max_(PASSIVE_LEVEL)
1064 WDFAPI
1065 NTSTATUS
1066 (STDCALL *PFN_WDFUSBTARGETDEVICEQUERYSTRING)(
1067     _In_
1068     PWDF_DRIVER_GLOBALS DriverGlobals,
1069     _In_
1070     WDFUSBDEVICE UsbDevice,
1071     _In_opt_
1072     WDFREQUEST Request,
1073     _In_opt_
1074     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
1075     _Out_writes_opt_(*NumCharacters)
1076     PUSHORT String,
1077     _Inout_
1078     PUSHORT NumCharacters,
1079     _In_
1080     UCHAR StringIndex,
1081     _In_opt_
1082     USHORT LangID
1083     );
1084 
1085 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1086 _IRQL_requires_max_(PASSIVE_LEVEL)
1087 FORCEINLINE
1088 NTSTATUS
1089 WdfUsbTargetDeviceQueryString(
1090     _In_
1091     WDFUSBDEVICE UsbDevice,
1092     _In_opt_
1093     WDFREQUEST Request,
1094     _In_opt_
1095     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
1096     _Out_writes_opt_(*NumCharacters)
1097     PUSHORT String,
1098     _Inout_
1099     PUSHORT NumCharacters,
1100     _In_
1101     UCHAR StringIndex,
1102     _In_opt_
1103     USHORT LangID
1104     )
1105 {
1106     return ((PFN_WDFUSBTARGETDEVICEQUERYSTRING) WdfFunctions[WdfUsbTargetDeviceQueryStringTableIndex])(WdfDriverGlobals, UsbDevice, Request, RequestOptions, String, NumCharacters, StringIndex, LangID);
1107 }
1108 
1109 //
1110 // WDF Function: WdfUsbTargetDeviceAllocAndQueryString
1111 //
1112 typedef
1113 _Must_inspect_result_
1114 _IRQL_requires_max_(PASSIVE_LEVEL)
1115 WDFAPI
1116 NTSTATUS
1117 (STDCALL *PFN_WDFUSBTARGETDEVICEALLOCANDQUERYSTRING)(
1118     _In_
1119     PWDF_DRIVER_GLOBALS DriverGlobals,
1120     _In_
1121     WDFUSBDEVICE UsbDevice,
1122     _In_opt_
1123     PWDF_OBJECT_ATTRIBUTES StringMemoryAttributes,
1124     _Out_
1125     WDFMEMORY* StringMemory,
1126     _Out_opt_
1127     PUSHORT NumCharacters,
1128     _In_
1129     UCHAR StringIndex,
1130     _In_opt_
1131     USHORT LangID
1132     );
1133 
1134 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1135 _IRQL_requires_max_(PASSIVE_LEVEL)
1136 FORCEINLINE
1137 NTSTATUS
1138 WdfUsbTargetDeviceAllocAndQueryString(
1139     _In_
1140     WDFUSBDEVICE UsbDevice,
1141     _In_opt_
1142     PWDF_OBJECT_ATTRIBUTES StringMemoryAttributes,
1143     _Out_
1144     WDFMEMORY* StringMemory,
1145     _Out_opt_
1146     PUSHORT NumCharacters,
1147     _In_
1148     UCHAR StringIndex,
1149     _In_opt_
1150     USHORT LangID
1151     )
1152 {
1153     return ((PFN_WDFUSBTARGETDEVICEALLOCANDQUERYSTRING) WdfFunctions[WdfUsbTargetDeviceAllocAndQueryStringTableIndex])(WdfDriverGlobals, UsbDevice, StringMemoryAttributes, StringMemory, NumCharacters, StringIndex, LangID);
1154 }
1155 
1156 //
1157 // WDF Function: WdfUsbTargetDeviceFormatRequestForString
1158 //
1159 typedef
1160 _Must_inspect_result_
1161 _IRQL_requires_max_(DISPATCH_LEVEL)
1162 WDFAPI
1163 NTSTATUS
1164 (STDCALL *PFN_WDFUSBTARGETDEVICEFORMATREQUESTFORSTRING)(
1165     _In_
1166     PWDF_DRIVER_GLOBALS DriverGlobals,
1167     _In_
1168     WDFUSBDEVICE UsbDevice,
1169     _In_
1170     WDFREQUEST Request,
1171     _In_
1172     WDFMEMORY Memory,
1173     _In_opt_
1174     PWDFMEMORY_OFFSET Offset,
1175     _In_
1176     UCHAR StringIndex,
1177     _In_opt_
1178     USHORT LangID
1179     );
1180 
1181 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)1182 _IRQL_requires_max_(DISPATCH_LEVEL)
1183 FORCEINLINE
1184 NTSTATUS
1185 WdfUsbTargetDeviceFormatRequestForString(
1186     _In_
1187     WDFUSBDEVICE UsbDevice,
1188     _In_
1189     WDFREQUEST Request,
1190     _In_
1191     WDFMEMORY Memory,
1192     _In_opt_
1193     PWDFMEMORY_OFFSET Offset,
1194     _In_
1195     UCHAR StringIndex,
1196     _In_opt_
1197     USHORT LangID
1198     )
1199 {
1200     return ((PFN_WDFUSBTARGETDEVICEFORMATREQUESTFORSTRING) WdfFunctions[WdfUsbTargetDeviceFormatRequestForStringTableIndex])(WdfDriverGlobals, UsbDevice, Request, Memory, Offset, StringIndex, LangID);
1201 }
1202 
1203 //
1204 // WDF Function: WdfUsbTargetDeviceGetNumInterfaces
1205 //
1206 typedef
1207 _IRQL_requires_max_(DISPATCH_LEVEL)
1208 WDFAPI
1209 UCHAR
1210 (STDCALL *PFN_WDFUSBTARGETDEVICEGETNUMINTERFACES)(
1211     _In_
1212     PWDF_DRIVER_GLOBALS DriverGlobals,
1213     _In_
1214     WDFUSBDEVICE UsbDevice
1215     );
1216 
_IRQL_requires_max_(DISPATCH_LEVEL)1217 _IRQL_requires_max_(DISPATCH_LEVEL)
1218 FORCEINLINE
1219 UCHAR
1220 WdfUsbTargetDeviceGetNumInterfaces(
1221     _In_
1222     WDFUSBDEVICE UsbDevice
1223     )
1224 {
1225     return ((PFN_WDFUSBTARGETDEVICEGETNUMINTERFACES) WdfFunctions[WdfUsbTargetDeviceGetNumInterfacesTableIndex])(WdfDriverGlobals, UsbDevice);
1226 }
1227 
1228 //
1229 // WDF Function: WdfUsbTargetDeviceSelectConfig
1230 //
1231 typedef
1232 _Must_inspect_result_
1233 _IRQL_requires_max_(PASSIVE_LEVEL)
1234 WDFAPI
1235 NTSTATUS
1236 (STDCALL *PFN_WDFUSBTARGETDEVICESELECTCONFIG)(
1237     _In_
1238     PWDF_DRIVER_GLOBALS DriverGlobals,
1239     _In_
1240     WDFUSBDEVICE UsbDevice,
1241     _In_opt_
1242     PWDF_OBJECT_ATTRIBUTES PipeAttributes,
1243     _Inout_
1244     PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params
1245     );
1246 
1247 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1248 _IRQL_requires_max_(PASSIVE_LEVEL)
1249 FORCEINLINE
1250 NTSTATUS
1251 WdfUsbTargetDeviceSelectConfig(
1252     _In_
1253     WDFUSBDEVICE UsbDevice,
1254     _In_opt_
1255     PWDF_OBJECT_ATTRIBUTES PipeAttributes,
1256     _Inout_
1257     PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params
1258     )
1259 {
1260     return ((PFN_WDFUSBTARGETDEVICESELECTCONFIG) WdfFunctions[WdfUsbTargetDeviceSelectConfigTableIndex])(WdfDriverGlobals, UsbDevice, PipeAttributes, Params);
1261 }
1262 
1263 //
1264 // WDF Function: WdfUsbTargetDeviceWdmGetConfigurationHandle
1265 //
1266 typedef
1267 _IRQL_requires_max_(DISPATCH_LEVEL)
1268 WDFAPI
1269 USBD_CONFIGURATION_HANDLE
1270 (STDCALL *PFN_WDFUSBTARGETDEVICEWDMGETCONFIGURATIONHANDLE)(
1271     _In_
1272     PWDF_DRIVER_GLOBALS DriverGlobals,
1273     _In_
1274     WDFUSBDEVICE UsbDevice
1275     );
1276 
_IRQL_requires_max_(DISPATCH_LEVEL)1277 _IRQL_requires_max_(DISPATCH_LEVEL)
1278 FORCEINLINE
1279 USBD_CONFIGURATION_HANDLE
1280 WdfUsbTargetDeviceWdmGetConfigurationHandle(
1281     _In_
1282     WDFUSBDEVICE UsbDevice
1283     )
1284 {
1285     return ((PFN_WDFUSBTARGETDEVICEWDMGETCONFIGURATIONHANDLE) WdfFunctions[WdfUsbTargetDeviceWdmGetConfigurationHandleTableIndex])(WdfDriverGlobals, UsbDevice);
1286 }
1287 
1288 //
1289 // WDF Function: WdfUsbTargetDeviceRetrieveCurrentFrameNumber
1290 //
1291 typedef
1292 _Must_inspect_result_
1293 _IRQL_requires_max_(DISPATCH_LEVEL)
1294 WDFAPI
1295 NTSTATUS
1296 (STDCALL *PFN_WDFUSBTARGETDEVICERETRIEVECURRENTFRAMENUMBER)(
1297     _In_
1298     PWDF_DRIVER_GLOBALS DriverGlobals,
1299     _In_
1300     WDFUSBDEVICE UsbDevice,
1301     _Out_
1302     PULONG CurrentFrameNumber
1303     );
1304 
1305 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)1306 _IRQL_requires_max_(DISPATCH_LEVEL)
1307 FORCEINLINE
1308 NTSTATUS
1309 WdfUsbTargetDeviceRetrieveCurrentFrameNumber(
1310     _In_
1311     WDFUSBDEVICE UsbDevice,
1312     _Out_
1313     PULONG CurrentFrameNumber
1314     )
1315 {
1316     return ((PFN_WDFUSBTARGETDEVICERETRIEVECURRENTFRAMENUMBER) WdfFunctions[WdfUsbTargetDeviceRetrieveCurrentFrameNumberTableIndex])(WdfDriverGlobals, UsbDevice, CurrentFrameNumber);
1317 }
1318 
1319 //
1320 // WDF Function: WdfUsbTargetDeviceSendControlTransferSynchronously
1321 //
1322 typedef
1323 _Must_inspect_result_
1324 _IRQL_requires_max_(PASSIVE_LEVEL)
1325 WDFAPI
1326 NTSTATUS
1327 (STDCALL *PFN_WDFUSBTARGETDEVICESENDCONTROLTRANSFERSYNCHRONOUSLY)(
1328     _In_
1329     PWDF_DRIVER_GLOBALS DriverGlobals,
1330     _In_
1331     WDFUSBDEVICE UsbDevice,
1332     _In_opt_
1333     WDFREQUEST Request,
1334     _In_opt_
1335     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
1336     _In_
1337     PWDF_USB_CONTROL_SETUP_PACKET SetupPacket,
1338     _In_opt_
1339     PWDF_MEMORY_DESCRIPTOR MemoryDescriptor,
1340     _Out_opt_
1341     PULONG BytesTransferred
1342     );
1343 
1344 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1345 _IRQL_requires_max_(PASSIVE_LEVEL)
1346 FORCEINLINE
1347 NTSTATUS
1348 WdfUsbTargetDeviceSendControlTransferSynchronously(
1349     _In_
1350     WDFUSBDEVICE UsbDevice,
1351     _In_opt_
1352     WDFREQUEST Request,
1353     _In_opt_
1354     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
1355     _In_
1356     PWDF_USB_CONTROL_SETUP_PACKET SetupPacket,
1357     _In_opt_
1358     PWDF_MEMORY_DESCRIPTOR MemoryDescriptor,
1359     _Out_opt_
1360     PULONG BytesTransferred
1361     )
1362 {
1363     return ((PFN_WDFUSBTARGETDEVICESENDCONTROLTRANSFERSYNCHRONOUSLY) WdfFunctions[WdfUsbTargetDeviceSendControlTransferSynchronouslyTableIndex])(WdfDriverGlobals, UsbDevice, Request, RequestOptions, SetupPacket, MemoryDescriptor, BytesTransferred);
1364 }
1365 
1366 //
1367 // WDF Function: WdfUsbTargetDeviceFormatRequestForControlTransfer
1368 //
1369 typedef
1370 _Must_inspect_result_
1371 _IRQL_requires_max_(DISPATCH_LEVEL)
1372 WDFAPI
1373 NTSTATUS
1374 (STDCALL *PFN_WDFUSBTARGETDEVICEFORMATREQUESTFORCONTROLTRANSFER)(
1375     _In_
1376     PWDF_DRIVER_GLOBALS DriverGlobals,
1377     _In_
1378     WDFUSBDEVICE UsbDevice,
1379     _In_
1380     WDFREQUEST Request,
1381     _In_
1382     PWDF_USB_CONTROL_SETUP_PACKET SetupPacket,
1383     _In_opt_
1384     WDFMEMORY TransferMemory,
1385     _In_opt_
1386     PWDFMEMORY_OFFSET TransferOffset
1387     );
1388 
1389 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)1390 _IRQL_requires_max_(DISPATCH_LEVEL)
1391 FORCEINLINE
1392 NTSTATUS
1393 WdfUsbTargetDeviceFormatRequestForControlTransfer(
1394     _In_
1395     WDFUSBDEVICE UsbDevice,
1396     _In_
1397     WDFREQUEST Request,
1398     _In_
1399     PWDF_USB_CONTROL_SETUP_PACKET SetupPacket,
1400     _In_opt_
1401     WDFMEMORY TransferMemory,
1402     _In_opt_
1403     PWDFMEMORY_OFFSET TransferOffset
1404     )
1405 {
1406     return ((PFN_WDFUSBTARGETDEVICEFORMATREQUESTFORCONTROLTRANSFER) WdfFunctions[WdfUsbTargetDeviceFormatRequestForControlTransferTableIndex])(WdfDriverGlobals, UsbDevice, Request, SetupPacket, TransferMemory, TransferOffset);
1407 }
1408 
1409 //
1410 // WDF Function: WdfUsbTargetDeviceIsConnectedSynchronous
1411 //
1412 typedef
1413 _Must_inspect_result_
1414 _IRQL_requires_max_(PASSIVE_LEVEL)
1415 WDFAPI
1416 NTSTATUS
1417 (STDCALL *PFN_WDFUSBTARGETDEVICEISCONNECTEDSYNCHRONOUS)(
1418     _In_
1419     PWDF_DRIVER_GLOBALS DriverGlobals,
1420     _In_
1421     WDFUSBDEVICE UsbDevice
1422     );
1423 
1424 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1425 _IRQL_requires_max_(PASSIVE_LEVEL)
1426 FORCEINLINE
1427 NTSTATUS
1428 WdfUsbTargetDeviceIsConnectedSynchronous(
1429     _In_
1430     WDFUSBDEVICE UsbDevice
1431     )
1432 {
1433     return ((PFN_WDFUSBTARGETDEVICEISCONNECTEDSYNCHRONOUS) WdfFunctions[WdfUsbTargetDeviceIsConnectedSynchronousTableIndex])(WdfDriverGlobals, UsbDevice);
1434 }
1435 
1436 //
1437 // WDF Function: WdfUsbTargetDeviceResetPortSynchronously
1438 //
1439 typedef
1440 _Must_inspect_result_
1441 _IRQL_requires_max_(PASSIVE_LEVEL)
1442 WDFAPI
1443 NTSTATUS
1444 (STDCALL *PFN_WDFUSBTARGETDEVICERESETPORTSYNCHRONOUSLY)(
1445     _In_
1446     PWDF_DRIVER_GLOBALS DriverGlobals,
1447     _In_
1448     WDFUSBDEVICE UsbDevice
1449     );
1450 
1451 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1452 _IRQL_requires_max_(PASSIVE_LEVEL)
1453 FORCEINLINE
1454 NTSTATUS
1455 WdfUsbTargetDeviceResetPortSynchronously(
1456     _In_
1457     WDFUSBDEVICE UsbDevice
1458     )
1459 {
1460     return ((PFN_WDFUSBTARGETDEVICERESETPORTSYNCHRONOUSLY) WdfFunctions[WdfUsbTargetDeviceResetPortSynchronouslyTableIndex])(WdfDriverGlobals, UsbDevice);
1461 }
1462 
1463 //
1464 // WDF Function: WdfUsbTargetDeviceCyclePortSynchronously
1465 //
1466 typedef
1467 _Must_inspect_result_
1468 _IRQL_requires_max_(PASSIVE_LEVEL)
1469 WDFAPI
1470 NTSTATUS
1471 (STDCALL *PFN_WDFUSBTARGETDEVICECYCLEPORTSYNCHRONOUSLY)(
1472     _In_
1473     PWDF_DRIVER_GLOBALS DriverGlobals,
1474     _In_
1475     WDFUSBDEVICE UsbDevice
1476     );
1477 
1478 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1479 _IRQL_requires_max_(PASSIVE_LEVEL)
1480 FORCEINLINE
1481 NTSTATUS
1482 WdfUsbTargetDeviceCyclePortSynchronously(
1483     _In_
1484     WDFUSBDEVICE UsbDevice
1485     )
1486 {
1487     return ((PFN_WDFUSBTARGETDEVICECYCLEPORTSYNCHRONOUSLY) WdfFunctions[WdfUsbTargetDeviceCyclePortSynchronouslyTableIndex])(WdfDriverGlobals, UsbDevice);
1488 }
1489 
1490 //
1491 // WDF Function: WdfUsbTargetDeviceFormatRequestForCyclePort
1492 //
1493 typedef
1494 _Must_inspect_result_
1495 _IRQL_requires_max_(DISPATCH_LEVEL)
1496 WDFAPI
1497 NTSTATUS
1498 (STDCALL *PFN_WDFUSBTARGETDEVICEFORMATREQUESTFORCYCLEPORT)(
1499     _In_
1500     PWDF_DRIVER_GLOBALS DriverGlobals,
1501     _In_
1502     WDFUSBDEVICE UsbDevice,
1503     _In_
1504     WDFREQUEST Request
1505     );
1506 
1507 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)1508 _IRQL_requires_max_(DISPATCH_LEVEL)
1509 FORCEINLINE
1510 NTSTATUS
1511 WdfUsbTargetDeviceFormatRequestForCyclePort(
1512     _In_
1513     WDFUSBDEVICE UsbDevice,
1514     _In_
1515     WDFREQUEST Request
1516     )
1517 {
1518     return ((PFN_WDFUSBTARGETDEVICEFORMATREQUESTFORCYCLEPORT) WdfFunctions[WdfUsbTargetDeviceFormatRequestForCyclePortTableIndex])(WdfDriverGlobals, UsbDevice, Request);
1519 }
1520 
1521 //
1522 // WDF Function: WdfUsbTargetDeviceSendUrbSynchronously
1523 //
1524 typedef
1525 _Must_inspect_result_
1526 _IRQL_requires_max_(PASSIVE_LEVEL)
1527 WDFAPI
1528 NTSTATUS
1529 (STDCALL *PFN_WDFUSBTARGETDEVICESENDURBSYNCHRONOUSLY)(
1530     _In_
1531     PWDF_DRIVER_GLOBALS DriverGlobals,
1532     _In_
1533     WDFUSBDEVICE UsbDevice,
1534     _In_opt_
1535     WDFREQUEST Request,
1536     _In_opt_
1537     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
1538     _In_reads_(_Inexpressible_("union bug in SAL"))
1539     PURB Urb
1540     );
1541 
1542 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1543 _IRQL_requires_max_(PASSIVE_LEVEL)
1544 FORCEINLINE
1545 NTSTATUS
1546 WdfUsbTargetDeviceSendUrbSynchronously(
1547     _In_
1548     WDFUSBDEVICE UsbDevice,
1549     _In_opt_
1550     WDFREQUEST Request,
1551     _In_opt_
1552     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
1553     _In_reads_(_Inexpressible_("union bug in SAL"))
1554     PURB Urb
1555     )
1556 {
1557     return ((PFN_WDFUSBTARGETDEVICESENDURBSYNCHRONOUSLY) WdfFunctions[WdfUsbTargetDeviceSendUrbSynchronouslyTableIndex])(WdfDriverGlobals, UsbDevice, Request, RequestOptions, Urb);
1558 }
1559 
1560 //
1561 // WDF Function: WdfUsbTargetDeviceFormatRequestForUrb
1562 //
1563 typedef
1564 _Must_inspect_result_
1565 _IRQL_requires_max_(DISPATCH_LEVEL)
1566 WDFAPI
1567 NTSTATUS
1568 (STDCALL *PFN_WDFUSBTARGETDEVICEFORMATREQUESTFORURB)(
1569     _In_
1570     PWDF_DRIVER_GLOBALS DriverGlobals,
1571     _In_
1572     WDFUSBDEVICE UsbDevice,
1573     _In_
1574     WDFREQUEST Request,
1575     _In_
1576     WDFMEMORY UrbMemory,
1577     _In_opt_
1578     PWDFMEMORY_OFFSET UrbMemoryOffset
1579     );
1580 
1581 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)1582 _IRQL_requires_max_(DISPATCH_LEVEL)
1583 FORCEINLINE
1584 NTSTATUS
1585 WdfUsbTargetDeviceFormatRequestForUrb(
1586     _In_
1587     WDFUSBDEVICE UsbDevice,
1588     _In_
1589     WDFREQUEST Request,
1590     _In_
1591     WDFMEMORY UrbMemory,
1592     _In_opt_
1593     PWDFMEMORY_OFFSET UrbMemoryOffset
1594     )
1595 {
1596     return ((PFN_WDFUSBTARGETDEVICEFORMATREQUESTFORURB) WdfFunctions[WdfUsbTargetDeviceFormatRequestForUrbTableIndex])(WdfDriverGlobals, UsbDevice, Request, UrbMemory, UrbMemoryOffset);
1597 }
1598 
1599 //
1600 // WDF Function: WdfUsbTargetDeviceQueryUsbCapability
1601 //
1602 typedef
1603 _Must_inspect_result_
1604 _IRQL_requires_max_(PASSIVE_LEVEL)
1605 WDFAPI
1606 NTSTATUS
1607 (STDCALL *PFN_WDFUSBTARGETDEVICEQUERYUSBCAPABILITY)(
1608     _In_
1609     PWDF_DRIVER_GLOBALS DriverGlobals,
1610     _In_
1611     WDFUSBDEVICE UsbDevice,
1612     _In_
1613     CONST GUID* CapabilityType,
1614     _In_
1615     ULONG CapabilityBufferLength,
1616     _When_(CapabilityBufferLength == 0, _Out_opt_)
1617     _When_(CapabilityBufferLength != 0 && ResultLength == NULL, _Out_writes_bytes_(CapabilityBufferLength))
1618     _When_(CapabilityBufferLength != 0 && ResultLength != NULL, _Out_writes_bytes_to_opt_(CapabilityBufferLength, *ResultLength))
1619     PVOID CapabilityBuffer,
1620     _Out_opt_
1621     _When_(ResultLength != NULL,_Deref_out_range_(<=,CapabilityBufferLength))
1622     PULONG ResultLength
1623     );
1624 
1625 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1626 _IRQL_requires_max_(PASSIVE_LEVEL)
1627 FORCEINLINE
1628 NTSTATUS
1629 WdfUsbTargetDeviceQueryUsbCapability(
1630     _In_
1631     WDFUSBDEVICE UsbDevice,
1632     _In_
1633     CONST GUID* CapabilityType,
1634     _In_
1635     ULONG CapabilityBufferLength,
1636     _When_(CapabilityBufferLength == 0, _Out_opt_)
1637     _When_(CapabilityBufferLength != 0 && ResultLength == NULL, _Out_writes_bytes_(CapabilityBufferLength))
1638     _When_(CapabilityBufferLength != 0 && ResultLength != NULL, _Out_writes_bytes_to_opt_(CapabilityBufferLength, *ResultLength))
1639     PVOID CapabilityBuffer,
1640     _Out_opt_
1641     _When_(ResultLength != NULL,_Deref_out_range_(<=,CapabilityBufferLength))
1642     PULONG ResultLength
1643     )
1644 {
1645     return ((PFN_WDFUSBTARGETDEVICEQUERYUSBCAPABILITY) WdfFunctions[WdfUsbTargetDeviceQueryUsbCapabilityTableIndex])(WdfDriverGlobals, UsbDevice, CapabilityType, CapabilityBufferLength, CapabilityBuffer, ResultLength);
1646 }
1647 
1648 //
1649 // WDF Function: WdfUsbTargetDeviceCreateUrb
1650 //
1651 typedef
1652 _Must_inspect_result_
1653 _IRQL_requires_max_(DISPATCH_LEVEL)
1654 WDFAPI
1655 NTSTATUS
1656 (STDCALL *PFN_WDFUSBTARGETDEVICECREATEURB)(
1657     _In_
1658     PWDF_DRIVER_GLOBALS DriverGlobals,
1659     _In_
1660     WDFUSBDEVICE UsbDevice,
1661     _In_opt_
1662     PWDF_OBJECT_ATTRIBUTES Attributes,
1663     _Out_
1664     WDFMEMORY* UrbMemory,
1665     _Outptr_opt_result_bytebuffer_(sizeof(URB))
1666     PURB* Urb
1667     );
1668 
1669 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)1670 _IRQL_requires_max_(DISPATCH_LEVEL)
1671 FORCEINLINE
1672 NTSTATUS
1673 WdfUsbTargetDeviceCreateUrb(
1674     _In_
1675     WDFUSBDEVICE UsbDevice,
1676     _In_opt_
1677     PWDF_OBJECT_ATTRIBUTES Attributes,
1678     _Out_
1679     WDFMEMORY* UrbMemory,
1680     _Outptr_opt_result_bytebuffer_(sizeof(URB))
1681     PURB* Urb
1682     )
1683 {
1684     return ((PFN_WDFUSBTARGETDEVICECREATEURB) WdfFunctions[WdfUsbTargetDeviceCreateUrbTableIndex])(WdfDriverGlobals, UsbDevice, Attributes, UrbMemory, Urb);
1685 }
1686 
1687 //
1688 // WDF Function: WdfUsbTargetDeviceCreateIsochUrb
1689 //
1690 typedef
1691 _Must_inspect_result_
1692 _IRQL_requires_max_(DISPATCH_LEVEL)
1693 WDFAPI
1694 NTSTATUS
1695 (STDCALL *PFN_WDFUSBTARGETDEVICECREATEISOCHURB)(
1696     _In_
1697     PWDF_DRIVER_GLOBALS DriverGlobals,
1698     _In_
1699     WDFUSBDEVICE UsbDevice,
1700     _In_opt_
1701     PWDF_OBJECT_ATTRIBUTES Attributes,
1702     _In_
1703     ULONG NumberOfIsochPackets,
1704     _Out_
1705     WDFMEMORY* UrbMemory,
1706     _Outptr_opt_result_bytebuffer_(GET_ISO_URB_SIZE(NumberOfIsochPackets))
1707     PURB* Urb
1708     );
1709 
1710 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)1711 _IRQL_requires_max_(DISPATCH_LEVEL)
1712 FORCEINLINE
1713 NTSTATUS
1714 WdfUsbTargetDeviceCreateIsochUrb(
1715     _In_
1716     WDFUSBDEVICE UsbDevice,
1717     _In_opt_
1718     PWDF_OBJECT_ATTRIBUTES Attributes,
1719     _In_
1720     ULONG NumberOfIsochPackets,
1721     _Out_
1722     WDFMEMORY* UrbMemory,
1723     _Outptr_opt_result_bytebuffer_(GET_ISO_URB_SIZE(NumberOfIsochPackets))
1724     PURB* Urb
1725     )
1726 {
1727     return ((PFN_WDFUSBTARGETDEVICECREATEISOCHURB) WdfFunctions[WdfUsbTargetDeviceCreateIsochUrbTableIndex])(WdfDriverGlobals, UsbDevice, Attributes, NumberOfIsochPackets, UrbMemory, Urb);
1728 }
1729 
1730 //
1731 // WDF Function: WdfUsbTargetPipeGetInformation
1732 //
1733 typedef
1734 _IRQL_requires_max_(DISPATCH_LEVEL)
1735 WDFAPI
1736 VOID
1737 (STDCALL *PFN_WDFUSBTARGETPIPEGETINFORMATION)(
1738     _In_
1739     PWDF_DRIVER_GLOBALS DriverGlobals,
1740     _In_
1741     WDFUSBPIPE Pipe,
1742     _Out_
1743     PWDF_USB_PIPE_INFORMATION PipeInformation
1744     );
1745 
_IRQL_requires_max_(DISPATCH_LEVEL)1746 _IRQL_requires_max_(DISPATCH_LEVEL)
1747 FORCEINLINE
1748 VOID
1749 WdfUsbTargetPipeGetInformation(
1750     _In_
1751     WDFUSBPIPE Pipe,
1752     _Out_
1753     PWDF_USB_PIPE_INFORMATION PipeInformation
1754     )
1755 {
1756     ((PFN_WDFUSBTARGETPIPEGETINFORMATION) WdfFunctions[WdfUsbTargetPipeGetInformationTableIndex])(WdfDriverGlobals, Pipe, PipeInformation);
1757 }
1758 
1759 //
1760 // WDF Function: WdfUsbTargetPipeIsInEndpoint
1761 //
1762 typedef
1763 _IRQL_requires_max_(DISPATCH_LEVEL)
1764 WDFAPI
1765 BOOLEAN
1766 (STDCALL *PFN_WDFUSBTARGETPIPEISINENDPOINT)(
1767     _In_
1768     PWDF_DRIVER_GLOBALS DriverGlobals,
1769     _In_
1770     WDFUSBPIPE Pipe
1771     );
1772 
_IRQL_requires_max_(DISPATCH_LEVEL)1773 _IRQL_requires_max_(DISPATCH_LEVEL)
1774 FORCEINLINE
1775 BOOLEAN
1776 WdfUsbTargetPipeIsInEndpoint(
1777     _In_
1778     WDFUSBPIPE Pipe
1779     )
1780 {
1781     return ((PFN_WDFUSBTARGETPIPEISINENDPOINT) WdfFunctions[WdfUsbTargetPipeIsInEndpointTableIndex])(WdfDriverGlobals, Pipe);
1782 }
1783 
1784 //
1785 // WDF Function: WdfUsbTargetPipeIsOutEndpoint
1786 //
1787 typedef
1788 _IRQL_requires_max_(DISPATCH_LEVEL)
1789 WDFAPI
1790 BOOLEAN
1791 (STDCALL *PFN_WDFUSBTARGETPIPEISOUTENDPOINT)(
1792     _In_
1793     PWDF_DRIVER_GLOBALS DriverGlobals,
1794     _In_
1795     WDFUSBPIPE Pipe
1796     );
1797 
_IRQL_requires_max_(DISPATCH_LEVEL)1798 _IRQL_requires_max_(DISPATCH_LEVEL)
1799 FORCEINLINE
1800 BOOLEAN
1801 WdfUsbTargetPipeIsOutEndpoint(
1802     _In_
1803     WDFUSBPIPE Pipe
1804     )
1805 {
1806     return ((PFN_WDFUSBTARGETPIPEISOUTENDPOINT) WdfFunctions[WdfUsbTargetPipeIsOutEndpointTableIndex])(WdfDriverGlobals, Pipe);
1807 }
1808 
1809 //
1810 // WDF Function: WdfUsbTargetPipeGetType
1811 //
1812 typedef
1813 _IRQL_requires_max_(DISPATCH_LEVEL)
1814 WDFAPI
1815 WDF_USB_PIPE_TYPE
1816 (STDCALL *PFN_WDFUSBTARGETPIPEGETTYPE)(
1817     _In_
1818     PWDF_DRIVER_GLOBALS DriverGlobals,
1819     _In_
1820     WDFUSBPIPE Pipe
1821     );
1822 
_IRQL_requires_max_(DISPATCH_LEVEL)1823 _IRQL_requires_max_(DISPATCH_LEVEL)
1824 FORCEINLINE
1825 WDF_USB_PIPE_TYPE
1826 WdfUsbTargetPipeGetType(
1827     _In_
1828     WDFUSBPIPE Pipe
1829     )
1830 {
1831     return ((PFN_WDFUSBTARGETPIPEGETTYPE) WdfFunctions[WdfUsbTargetPipeGetTypeTableIndex])(WdfDriverGlobals, Pipe);
1832 }
1833 
1834 //
1835 // WDF Function: WdfUsbTargetPipeSetNoMaximumPacketSizeCheck
1836 //
1837 typedef
1838 _IRQL_requires_max_(DISPATCH_LEVEL)
1839 WDFAPI
1840 VOID
1841 (STDCALL *PFN_WDFUSBTARGETPIPESETNOMAXIMUMPACKETSIZECHECK)(
1842     _In_
1843     PWDF_DRIVER_GLOBALS DriverGlobals,
1844     _In_
1845     WDFUSBPIPE Pipe
1846     );
1847 
_IRQL_requires_max_(DISPATCH_LEVEL)1848 _IRQL_requires_max_(DISPATCH_LEVEL)
1849 FORCEINLINE
1850 VOID
1851 WdfUsbTargetPipeSetNoMaximumPacketSizeCheck(
1852     _In_
1853     WDFUSBPIPE Pipe
1854     )
1855 {
1856     ((PFN_WDFUSBTARGETPIPESETNOMAXIMUMPACKETSIZECHECK) WdfFunctions[WdfUsbTargetPipeSetNoMaximumPacketSizeCheckTableIndex])(WdfDriverGlobals, Pipe);
1857 }
1858 
1859 //
1860 // WDF Function: WdfUsbTargetPipeWriteSynchronously
1861 //
1862 typedef
1863 _Must_inspect_result_
1864 _IRQL_requires_max_(PASSIVE_LEVEL)
1865 WDFAPI
1866 NTSTATUS
1867 (STDCALL *PFN_WDFUSBTARGETPIPEWRITESYNCHRONOUSLY)(
1868     _In_
1869     PWDF_DRIVER_GLOBALS DriverGlobals,
1870     _In_
1871     WDFUSBPIPE Pipe,
1872     _In_opt_
1873     WDFREQUEST Request,
1874     _In_opt_
1875     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
1876     _In_opt_
1877     PWDF_MEMORY_DESCRIPTOR MemoryDescriptor,
1878     _Out_opt_
1879     PULONG BytesWritten
1880     );
1881 
1882 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1883 _IRQL_requires_max_(PASSIVE_LEVEL)
1884 FORCEINLINE
1885 NTSTATUS
1886 WdfUsbTargetPipeWriteSynchronously(
1887     _In_
1888     WDFUSBPIPE Pipe,
1889     _In_opt_
1890     WDFREQUEST Request,
1891     _In_opt_
1892     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
1893     _In_opt_
1894     PWDF_MEMORY_DESCRIPTOR MemoryDescriptor,
1895     _Out_opt_
1896     PULONG BytesWritten
1897     )
1898 {
1899     return ((PFN_WDFUSBTARGETPIPEWRITESYNCHRONOUSLY) WdfFunctions[WdfUsbTargetPipeWriteSynchronouslyTableIndex])(WdfDriverGlobals, Pipe, Request, RequestOptions, MemoryDescriptor, BytesWritten);
1900 }
1901 
1902 //
1903 // WDF Function: WdfUsbTargetPipeFormatRequestForWrite
1904 //
1905 typedef
1906 _Must_inspect_result_
1907 _IRQL_requires_max_(DISPATCH_LEVEL)
1908 WDFAPI
1909 NTSTATUS
1910 (STDCALL *PFN_WDFUSBTARGETPIPEFORMATREQUESTFORWRITE)(
1911     _In_
1912     PWDF_DRIVER_GLOBALS DriverGlobals,
1913     _In_
1914     WDFUSBPIPE Pipe,
1915     _In_
1916     WDFREQUEST Request,
1917     _In_opt_
1918     WDFMEMORY WriteMemory,
1919     _In_opt_
1920     PWDFMEMORY_OFFSET WriteOffset
1921     );
1922 
1923 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)1924 _IRQL_requires_max_(DISPATCH_LEVEL)
1925 FORCEINLINE
1926 NTSTATUS
1927 WdfUsbTargetPipeFormatRequestForWrite(
1928     _In_
1929     WDFUSBPIPE Pipe,
1930     _In_
1931     WDFREQUEST Request,
1932     _In_opt_
1933     WDFMEMORY WriteMemory,
1934     _In_opt_
1935     PWDFMEMORY_OFFSET WriteOffset
1936     )
1937 {
1938     return ((PFN_WDFUSBTARGETPIPEFORMATREQUESTFORWRITE) WdfFunctions[WdfUsbTargetPipeFormatRequestForWriteTableIndex])(WdfDriverGlobals, Pipe, Request, WriteMemory, WriteOffset);
1939 }
1940 
1941 //
1942 // WDF Function: WdfUsbTargetPipeReadSynchronously
1943 //
1944 typedef
1945 _Must_inspect_result_
1946 _IRQL_requires_max_(PASSIVE_LEVEL)
1947 WDFAPI
1948 NTSTATUS
1949 (STDCALL *PFN_WDFUSBTARGETPIPEREADSYNCHRONOUSLY)(
1950     _In_
1951     PWDF_DRIVER_GLOBALS DriverGlobals,
1952     _In_
1953     WDFUSBPIPE Pipe,
1954     _In_opt_
1955     WDFREQUEST Request,
1956     _In_opt_
1957     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
1958     _In_opt_
1959     PWDF_MEMORY_DESCRIPTOR MemoryDescriptor,
1960     _Out_opt_
1961     PULONG BytesRead
1962     );
1963 
1964 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)1965 _IRQL_requires_max_(PASSIVE_LEVEL)
1966 FORCEINLINE
1967 NTSTATUS
1968 WdfUsbTargetPipeReadSynchronously(
1969     _In_
1970     WDFUSBPIPE Pipe,
1971     _In_opt_
1972     WDFREQUEST Request,
1973     _In_opt_
1974     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
1975     _In_opt_
1976     PWDF_MEMORY_DESCRIPTOR MemoryDescriptor,
1977     _Out_opt_
1978     PULONG BytesRead
1979     )
1980 {
1981     return ((PFN_WDFUSBTARGETPIPEREADSYNCHRONOUSLY) WdfFunctions[WdfUsbTargetPipeReadSynchronouslyTableIndex])(WdfDriverGlobals, Pipe, Request, RequestOptions, MemoryDescriptor, BytesRead);
1982 }
1983 
1984 //
1985 // WDF Function: WdfUsbTargetPipeFormatRequestForRead
1986 //
1987 typedef
1988 _Must_inspect_result_
1989 _IRQL_requires_max_(DISPATCH_LEVEL)
1990 WDFAPI
1991 NTSTATUS
1992 (STDCALL *PFN_WDFUSBTARGETPIPEFORMATREQUESTFORREAD)(
1993     _In_
1994     PWDF_DRIVER_GLOBALS DriverGlobals,
1995     _In_
1996     WDFUSBPIPE Pipe,
1997     _In_
1998     WDFREQUEST Request,
1999     _In_opt_
2000     WDFMEMORY ReadMemory,
2001     _In_opt_
2002     PWDFMEMORY_OFFSET ReadOffset
2003     );
2004 
2005 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)2006 _IRQL_requires_max_(DISPATCH_LEVEL)
2007 FORCEINLINE
2008 NTSTATUS
2009 WdfUsbTargetPipeFormatRequestForRead(
2010     _In_
2011     WDFUSBPIPE Pipe,
2012     _In_
2013     WDFREQUEST Request,
2014     _In_opt_
2015     WDFMEMORY ReadMemory,
2016     _In_opt_
2017     PWDFMEMORY_OFFSET ReadOffset
2018     )
2019 {
2020     return ((PFN_WDFUSBTARGETPIPEFORMATREQUESTFORREAD) WdfFunctions[WdfUsbTargetPipeFormatRequestForReadTableIndex])(WdfDriverGlobals, Pipe, Request, ReadMemory, ReadOffset);
2021 }
2022 
2023 //
2024 // WDF Function: WdfUsbTargetPipeConfigContinuousReader
2025 //
2026 typedef
2027 _Must_inspect_result_
2028 _IRQL_requires_max_(DISPATCH_LEVEL)
2029 WDFAPI
2030 NTSTATUS
2031 (STDCALL *PFN_WDFUSBTARGETPIPECONFIGCONTINUOUSREADER)(
2032     _In_
2033     PWDF_DRIVER_GLOBALS DriverGlobals,
2034     _In_
2035     WDFUSBPIPE Pipe,
2036     _In_
2037     PWDF_USB_CONTINUOUS_READER_CONFIG Config
2038     );
2039 
2040 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)2041 _IRQL_requires_max_(DISPATCH_LEVEL)
2042 FORCEINLINE
2043 NTSTATUS
2044 WdfUsbTargetPipeConfigContinuousReader(
2045     _In_
2046     WDFUSBPIPE Pipe,
2047     _In_
2048     PWDF_USB_CONTINUOUS_READER_CONFIG Config
2049     )
2050 {
2051     return ((PFN_WDFUSBTARGETPIPECONFIGCONTINUOUSREADER) WdfFunctions[WdfUsbTargetPipeConfigContinuousReaderTableIndex])(WdfDriverGlobals, Pipe, Config);
2052 }
2053 
2054 //
2055 // WDF Function: WdfUsbTargetPipeAbortSynchronously
2056 //
2057 typedef
2058 _Must_inspect_result_
2059 _IRQL_requires_max_(PASSIVE_LEVEL)
2060 WDFAPI
2061 NTSTATUS
2062 (STDCALL *PFN_WDFUSBTARGETPIPEABORTSYNCHRONOUSLY)(
2063     _In_
2064     PWDF_DRIVER_GLOBALS DriverGlobals,
2065     _In_
2066     WDFUSBPIPE Pipe,
2067     _In_opt_
2068     WDFREQUEST Request,
2069     _In_opt_
2070     PWDF_REQUEST_SEND_OPTIONS RequestOptions
2071     );
2072 
2073 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)2074 _IRQL_requires_max_(PASSIVE_LEVEL)
2075 FORCEINLINE
2076 NTSTATUS
2077 WdfUsbTargetPipeAbortSynchronously(
2078     _In_
2079     WDFUSBPIPE Pipe,
2080     _In_opt_
2081     WDFREQUEST Request,
2082     _In_opt_
2083     PWDF_REQUEST_SEND_OPTIONS RequestOptions
2084     )
2085 {
2086     return ((PFN_WDFUSBTARGETPIPEABORTSYNCHRONOUSLY) WdfFunctions[WdfUsbTargetPipeAbortSynchronouslyTableIndex])(WdfDriverGlobals, Pipe, Request, RequestOptions);
2087 }
2088 
2089 //
2090 // WDF Function: WdfUsbTargetPipeFormatRequestForAbort
2091 //
2092 typedef
2093 _Must_inspect_result_
2094 _IRQL_requires_max_(DISPATCH_LEVEL)
2095 WDFAPI
2096 NTSTATUS
2097 (STDCALL *PFN_WDFUSBTARGETPIPEFORMATREQUESTFORABORT)(
2098     _In_
2099     PWDF_DRIVER_GLOBALS DriverGlobals,
2100     _In_
2101     WDFUSBPIPE Pipe,
2102     _In_
2103     WDFREQUEST Request
2104     );
2105 
2106 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)2107 _IRQL_requires_max_(DISPATCH_LEVEL)
2108 FORCEINLINE
2109 NTSTATUS
2110 WdfUsbTargetPipeFormatRequestForAbort(
2111     _In_
2112     WDFUSBPIPE Pipe,
2113     _In_
2114     WDFREQUEST Request
2115     )
2116 {
2117     return ((PFN_WDFUSBTARGETPIPEFORMATREQUESTFORABORT) WdfFunctions[WdfUsbTargetPipeFormatRequestForAbortTableIndex])(WdfDriverGlobals, Pipe, Request);
2118 }
2119 
2120 //
2121 // WDF Function: WdfUsbTargetPipeResetSynchronously
2122 //
2123 typedef
2124 _Must_inspect_result_
2125 _IRQL_requires_max_(PASSIVE_LEVEL)
2126 WDFAPI
2127 NTSTATUS
2128 (STDCALL *PFN_WDFUSBTARGETPIPERESETSYNCHRONOUSLY)(
2129     _In_
2130     PWDF_DRIVER_GLOBALS DriverGlobals,
2131     _In_
2132     WDFUSBPIPE Pipe,
2133     _In_opt_
2134     WDFREQUEST Request,
2135     _In_opt_
2136     PWDF_REQUEST_SEND_OPTIONS RequestOptions
2137     );
2138 
2139 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)2140 _IRQL_requires_max_(PASSIVE_LEVEL)
2141 FORCEINLINE
2142 NTSTATUS
2143 WdfUsbTargetPipeResetSynchronously(
2144     _In_
2145     WDFUSBPIPE Pipe,
2146     _In_opt_
2147     WDFREQUEST Request,
2148     _In_opt_
2149     PWDF_REQUEST_SEND_OPTIONS RequestOptions
2150     )
2151 {
2152     return ((PFN_WDFUSBTARGETPIPERESETSYNCHRONOUSLY) WdfFunctions[WdfUsbTargetPipeResetSynchronouslyTableIndex])(WdfDriverGlobals, Pipe, Request, RequestOptions);
2153 }
2154 
2155 //
2156 // WDF Function: WdfUsbTargetPipeFormatRequestForReset
2157 //
2158 typedef
2159 _Must_inspect_result_
2160 _IRQL_requires_max_(DISPATCH_LEVEL)
2161 WDFAPI
2162 NTSTATUS
2163 (STDCALL *PFN_WDFUSBTARGETPIPEFORMATREQUESTFORRESET)(
2164     _In_
2165     PWDF_DRIVER_GLOBALS DriverGlobals,
2166     _In_
2167     WDFUSBPIPE Pipe,
2168     _In_
2169     WDFREQUEST Request
2170     );
2171 
2172 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)2173 _IRQL_requires_max_(DISPATCH_LEVEL)
2174 FORCEINLINE
2175 NTSTATUS
2176 WdfUsbTargetPipeFormatRequestForReset(
2177     _In_
2178     WDFUSBPIPE Pipe,
2179     _In_
2180     WDFREQUEST Request
2181     )
2182 {
2183     return ((PFN_WDFUSBTARGETPIPEFORMATREQUESTFORRESET) WdfFunctions[WdfUsbTargetPipeFormatRequestForResetTableIndex])(WdfDriverGlobals, Pipe, Request);
2184 }
2185 
2186 //
2187 // WDF Function: WdfUsbTargetPipeSendUrbSynchronously
2188 //
2189 typedef
2190 _Must_inspect_result_
2191 _IRQL_requires_max_(PASSIVE_LEVEL)
2192 WDFAPI
2193 NTSTATUS
2194 (STDCALL *PFN_WDFUSBTARGETPIPESENDURBSYNCHRONOUSLY)(
2195     _In_
2196     PWDF_DRIVER_GLOBALS DriverGlobals,
2197     _In_
2198     WDFUSBPIPE Pipe,
2199     _In_opt_
2200     WDFREQUEST Request,
2201     _In_opt_
2202     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
2203     _In_reads_(_Inexpressible_("union bug in SAL"))
2204     PURB Urb
2205     );
2206 
2207 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)2208 _IRQL_requires_max_(PASSIVE_LEVEL)
2209 FORCEINLINE
2210 NTSTATUS
2211 WdfUsbTargetPipeSendUrbSynchronously(
2212     _In_
2213     WDFUSBPIPE Pipe,
2214     _In_opt_
2215     WDFREQUEST Request,
2216     _In_opt_
2217     PWDF_REQUEST_SEND_OPTIONS RequestOptions,
2218     _In_reads_(_Inexpressible_("union bug in SAL"))
2219     PURB Urb
2220     )
2221 {
2222     return ((PFN_WDFUSBTARGETPIPESENDURBSYNCHRONOUSLY) WdfFunctions[WdfUsbTargetPipeSendUrbSynchronouslyTableIndex])(WdfDriverGlobals, Pipe, Request, RequestOptions, Urb);
2223 }
2224 
2225 //
2226 // WDF Function: WdfUsbTargetPipeFormatRequestForUrb
2227 //
2228 typedef
2229 _Must_inspect_result_
2230 _IRQL_requires_max_(DISPATCH_LEVEL)
2231 WDFAPI
2232 NTSTATUS
2233 (STDCALL *PFN_WDFUSBTARGETPIPEFORMATREQUESTFORURB)(
2234     _In_
2235     PWDF_DRIVER_GLOBALS DriverGlobals,
2236     _In_
2237     WDFUSBPIPE PIPE,
2238     _In_
2239     WDFREQUEST Request,
2240     _In_
2241     WDFMEMORY UrbMemory,
2242     _In_opt_
2243     PWDFMEMORY_OFFSET UrbMemoryOffset
2244     );
2245 
2246 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)2247 _IRQL_requires_max_(DISPATCH_LEVEL)
2248 FORCEINLINE
2249 NTSTATUS
2250 WdfUsbTargetPipeFormatRequestForUrb(
2251     _In_
2252     WDFUSBPIPE PIPE,
2253     _In_
2254     WDFREQUEST Request,
2255     _In_
2256     WDFMEMORY UrbMemory,
2257     _In_opt_
2258     PWDFMEMORY_OFFSET UrbMemoryOffset
2259     )
2260 {
2261     return ((PFN_WDFUSBTARGETPIPEFORMATREQUESTFORURB) WdfFunctions[WdfUsbTargetPipeFormatRequestForUrbTableIndex])(WdfDriverGlobals, PIPE, Request, UrbMemory, UrbMemoryOffset);
2262 }
2263 
2264 //
2265 // WDF Function: WdfUsbInterfaceGetInterfaceNumber
2266 //
2267 typedef
2268 _IRQL_requires_max_(DISPATCH_LEVEL)
2269 WDFAPI
2270 BYTE
2271 (STDCALL *PFN_WDFUSBINTERFACEGETINTERFACENUMBER)(
2272     _In_
2273     PWDF_DRIVER_GLOBALS DriverGlobals,
2274     _In_
2275     WDFUSBINTERFACE UsbInterface
2276     );
2277 
_IRQL_requires_max_(DISPATCH_LEVEL)2278 _IRQL_requires_max_(DISPATCH_LEVEL)
2279 FORCEINLINE
2280 BYTE
2281 WdfUsbInterfaceGetInterfaceNumber(
2282     _In_
2283     WDFUSBINTERFACE UsbInterface
2284     )
2285 {
2286     return ((PFN_WDFUSBINTERFACEGETINTERFACENUMBER) WdfFunctions[WdfUsbInterfaceGetInterfaceNumberTableIndex])(WdfDriverGlobals, UsbInterface);
2287 }
2288 
2289 //
2290 // WDF Function: WdfUsbInterfaceGetNumEndpoints
2291 //
2292 typedef
2293 _IRQL_requires_max_(DISPATCH_LEVEL)
2294 WDFAPI
2295 BYTE
2296 (STDCALL *PFN_WDFUSBINTERFACEGETNUMENDPOINTS)(
2297     _In_
2298     PWDF_DRIVER_GLOBALS DriverGlobals,
2299     _In_
2300     WDFUSBINTERFACE UsbInterface,
2301     _In_
2302     UCHAR SettingIndex
2303     );
2304 
_IRQL_requires_max_(DISPATCH_LEVEL)2305 _IRQL_requires_max_(DISPATCH_LEVEL)
2306 FORCEINLINE
2307 BYTE
2308 WdfUsbInterfaceGetNumEndpoints(
2309     _In_
2310     WDFUSBINTERFACE UsbInterface,
2311     _In_
2312     UCHAR SettingIndex
2313     )
2314 {
2315     return ((PFN_WDFUSBINTERFACEGETNUMENDPOINTS) WdfFunctions[WdfUsbInterfaceGetNumEndpointsTableIndex])(WdfDriverGlobals, UsbInterface, SettingIndex);
2316 }
2317 
2318 //
2319 // WDF Function: WdfUsbInterfaceGetDescriptor
2320 //
2321 typedef
2322 _IRQL_requires_max_(DISPATCH_LEVEL)
2323 WDFAPI
2324 VOID
2325 (STDCALL *PFN_WDFUSBINTERFACEGETDESCRIPTOR)(
2326     _In_
2327     PWDF_DRIVER_GLOBALS DriverGlobals,
2328     _In_
2329     WDFUSBINTERFACE UsbInterface,
2330     _In_
2331     UCHAR SettingIndex,
2332     _Out_
2333     PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
2334     );
2335 
_IRQL_requires_max_(DISPATCH_LEVEL)2336 _IRQL_requires_max_(DISPATCH_LEVEL)
2337 FORCEINLINE
2338 VOID
2339 WdfUsbInterfaceGetDescriptor(
2340     _In_
2341     WDFUSBINTERFACE UsbInterface,
2342     _In_
2343     UCHAR SettingIndex,
2344     _Out_
2345     PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
2346     )
2347 {
2348     ((PFN_WDFUSBINTERFACEGETDESCRIPTOR) WdfFunctions[WdfUsbInterfaceGetDescriptorTableIndex])(WdfDriverGlobals, UsbInterface, SettingIndex, InterfaceDescriptor);
2349 }
2350 
2351 //
2352 // WDF Function: WdfUsbInterfaceGetNumSettings
2353 //
2354 typedef
2355 _IRQL_requires_max_(DISPATCH_LEVEL)
2356 WDFAPI
2357 BYTE
2358 (STDCALL *PFN_WDFUSBINTERFACEGETNUMSETTINGS)(
2359     _In_
2360     PWDF_DRIVER_GLOBALS DriverGlobals,
2361     _In_
2362     WDFUSBINTERFACE UsbInterface
2363     );
2364 
_IRQL_requires_max_(DISPATCH_LEVEL)2365 _IRQL_requires_max_(DISPATCH_LEVEL)
2366 FORCEINLINE
2367 BYTE
2368 WdfUsbInterfaceGetNumSettings(
2369     _In_
2370     WDFUSBINTERFACE UsbInterface
2371     )
2372 {
2373     return ((PFN_WDFUSBINTERFACEGETNUMSETTINGS) WdfFunctions[WdfUsbInterfaceGetNumSettingsTableIndex])(WdfDriverGlobals, UsbInterface);
2374 }
2375 
2376 //
2377 // WDF Function: WdfUsbInterfaceSelectSetting
2378 //
2379 typedef
2380 _Must_inspect_result_
2381 _IRQL_requires_max_(PASSIVE_LEVEL)
2382 WDFAPI
2383 NTSTATUS
2384 (STDCALL *PFN_WDFUSBINTERFACESELECTSETTING)(
2385     _In_
2386     PWDF_DRIVER_GLOBALS DriverGlobals,
2387     _In_
2388     WDFUSBINTERFACE UsbInterface,
2389     _In_opt_
2390     PWDF_OBJECT_ATTRIBUTES PipesAttributes,
2391     _In_
2392     PWDF_USB_INTERFACE_SELECT_SETTING_PARAMS Params
2393     );
2394 
2395 _Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)2396 _IRQL_requires_max_(PASSIVE_LEVEL)
2397 FORCEINLINE
2398 NTSTATUS
2399 WdfUsbInterfaceSelectSetting(
2400     _In_
2401     WDFUSBINTERFACE UsbInterface,
2402     _In_opt_
2403     PWDF_OBJECT_ATTRIBUTES PipesAttributes,
2404     _In_
2405     PWDF_USB_INTERFACE_SELECT_SETTING_PARAMS Params
2406     )
2407 {
2408     return ((PFN_WDFUSBINTERFACESELECTSETTING) WdfFunctions[WdfUsbInterfaceSelectSettingTableIndex])(WdfDriverGlobals, UsbInterface, PipesAttributes, Params);
2409 }
2410 
2411 //
2412 // WDF Function: WdfUsbInterfaceGetEndpointInformation
2413 //
2414 typedef
2415 _IRQL_requires_max_(DISPATCH_LEVEL)
2416 WDFAPI
2417 VOID
2418 (STDCALL *PFN_WDFUSBINTERFACEGETENDPOINTINFORMATION)(
2419     _In_
2420     PWDF_DRIVER_GLOBALS DriverGlobals,
2421     _In_
2422     WDFUSBINTERFACE UsbInterface,
2423     _In_
2424     UCHAR SettingIndex,
2425     _In_
2426     UCHAR EndpointIndex,
2427     _Out_
2428     PWDF_USB_PIPE_INFORMATION EndpointInfo
2429     );
2430 
_IRQL_requires_max_(DISPATCH_LEVEL)2431 _IRQL_requires_max_(DISPATCH_LEVEL)
2432 FORCEINLINE
2433 VOID
2434 WdfUsbInterfaceGetEndpointInformation(
2435     _In_
2436     WDFUSBINTERFACE UsbInterface,
2437     _In_
2438     UCHAR SettingIndex,
2439     _In_
2440     UCHAR EndpointIndex,
2441     _Out_
2442     PWDF_USB_PIPE_INFORMATION EndpointInfo
2443     )
2444 {
2445     ((PFN_WDFUSBINTERFACEGETENDPOINTINFORMATION) WdfFunctions[WdfUsbInterfaceGetEndpointInformationTableIndex])(WdfDriverGlobals, UsbInterface, SettingIndex, EndpointIndex, EndpointInfo);
2446 }
2447 
2448 //
2449 // WDF Function: WdfUsbTargetDeviceGetInterface
2450 //
2451 typedef
2452 _IRQL_requires_max_(DISPATCH_LEVEL)
2453 WDFAPI
2454 WDFUSBINTERFACE
2455 (STDCALL *PFN_WDFUSBTARGETDEVICEGETINTERFACE)(
2456     _In_
2457     PWDF_DRIVER_GLOBALS DriverGlobals,
2458     _In_
2459     WDFUSBDEVICE UsbDevice,
2460     _In_
2461     UCHAR InterfaceIndex
2462     );
2463 
_IRQL_requires_max_(DISPATCH_LEVEL)2464 _IRQL_requires_max_(DISPATCH_LEVEL)
2465 FORCEINLINE
2466 WDFUSBINTERFACE
2467 WdfUsbTargetDeviceGetInterface(
2468     _In_
2469     WDFUSBDEVICE UsbDevice,
2470     _In_
2471     UCHAR InterfaceIndex
2472     )
2473 {
2474     return ((PFN_WDFUSBTARGETDEVICEGETINTERFACE) WdfFunctions[WdfUsbTargetDeviceGetInterfaceTableIndex])(WdfDriverGlobals, UsbDevice, InterfaceIndex);
2475 }
2476 
2477 //
2478 // WDF Function: WdfUsbInterfaceGetConfiguredSettingIndex
2479 //
2480 typedef
2481 _IRQL_requires_max_(DISPATCH_LEVEL)
2482 WDFAPI
2483 BYTE
2484 (STDCALL *PFN_WDFUSBINTERFACEGETCONFIGUREDSETTINGINDEX)(
2485     _In_
2486     PWDF_DRIVER_GLOBALS DriverGlobals,
2487     _In_
2488     WDFUSBINTERFACE Interface
2489     );
2490 
_IRQL_requires_max_(DISPATCH_LEVEL)2491 _IRQL_requires_max_(DISPATCH_LEVEL)
2492 FORCEINLINE
2493 BYTE
2494 WdfUsbInterfaceGetConfiguredSettingIndex(
2495     _In_
2496     WDFUSBINTERFACE Interface
2497     )
2498 {
2499     return ((PFN_WDFUSBINTERFACEGETCONFIGUREDSETTINGINDEX) WdfFunctions[WdfUsbInterfaceGetConfiguredSettingIndexTableIndex])(WdfDriverGlobals, Interface);
2500 }
2501 
2502 //
2503 // WDF Function: WdfUsbInterfaceGetNumConfiguredPipes
2504 //
2505 typedef
2506 _IRQL_requires_max_(DISPATCH_LEVEL)
2507 WDFAPI
2508 BYTE
2509 (STDCALL *PFN_WDFUSBINTERFACEGETNUMCONFIGUREDPIPES)(
2510     _In_
2511     PWDF_DRIVER_GLOBALS DriverGlobals,
2512     _In_
2513     WDFUSBINTERFACE UsbInterface
2514     );
2515 
_IRQL_requires_max_(DISPATCH_LEVEL)2516 _IRQL_requires_max_(DISPATCH_LEVEL)
2517 FORCEINLINE
2518 BYTE
2519 WdfUsbInterfaceGetNumConfiguredPipes(
2520     _In_
2521     WDFUSBINTERFACE UsbInterface
2522     )
2523 {
2524     return ((PFN_WDFUSBINTERFACEGETNUMCONFIGUREDPIPES) WdfFunctions[WdfUsbInterfaceGetNumConfiguredPipesTableIndex])(WdfDriverGlobals, UsbInterface);
2525 }
2526 
2527 //
2528 // WDF Function: WdfUsbInterfaceGetConfiguredPipe
2529 //
2530 typedef
2531 _IRQL_requires_max_(DISPATCH_LEVEL)
2532 WDFAPI
2533 WDFUSBPIPE
2534 (STDCALL *PFN_WDFUSBINTERFACEGETCONFIGUREDPIPE)(
2535     _In_
2536     PWDF_DRIVER_GLOBALS DriverGlobals,
2537     _In_
2538     WDFUSBINTERFACE UsbInterface,
2539     _In_
2540     UCHAR PipeIndex,
2541     _Out_opt_
2542     PWDF_USB_PIPE_INFORMATION PipeInfo
2543     );
2544 
_IRQL_requires_max_(DISPATCH_LEVEL)2545 _IRQL_requires_max_(DISPATCH_LEVEL)
2546 FORCEINLINE
2547 WDFUSBPIPE
2548 WdfUsbInterfaceGetConfiguredPipe(
2549     _In_
2550     WDFUSBINTERFACE UsbInterface,
2551     _In_
2552     UCHAR PipeIndex,
2553     _Out_opt_
2554     PWDF_USB_PIPE_INFORMATION PipeInfo
2555     )
2556 {
2557     return ((PFN_WDFUSBINTERFACEGETCONFIGUREDPIPE) WdfFunctions[WdfUsbInterfaceGetConfiguredPipeTableIndex])(WdfDriverGlobals, UsbInterface, PipeIndex, PipeInfo);
2558 }
2559 
2560 //
2561 // WDF Function: WdfUsbTargetPipeWdmGetPipeHandle
2562 //
2563 typedef
2564 _IRQL_requires_max_(DISPATCH_LEVEL)
2565 WDFAPI
2566 USBD_PIPE_HANDLE
2567 (STDCALL *PFN_WDFUSBTARGETPIPEWDMGETPIPEHANDLE)(
2568     _In_
2569     PWDF_DRIVER_GLOBALS DriverGlobals,
2570     _In_
2571     WDFUSBPIPE UsbPipe
2572     );
2573 
_IRQL_requires_max_(DISPATCH_LEVEL)2574 _IRQL_requires_max_(DISPATCH_LEVEL)
2575 FORCEINLINE
2576 USBD_PIPE_HANDLE
2577 WdfUsbTargetPipeWdmGetPipeHandle(
2578     _In_
2579     WDFUSBPIPE UsbPipe
2580     )
2581 {
2582     return ((PFN_WDFUSBTARGETPIPEWDMGETPIPEHANDLE) WdfFunctions[WdfUsbTargetPipeWdmGetPipeHandleTableIndex])(WdfDriverGlobals, UsbPipe);
2583 }
2584 
2585 
2586 
2587 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
2588 
2589 
2590 WDF_EXTERN_C_END
2591 
2592 #endif // _WDFUSB_H_
2593 
2594