ReactOS 0.4.17-dev-1281-g065abb3
devreq.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS SuperSpeed USB Hub Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Control transfers the device machine sends to a child device
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#include "usbhub3.h"
9#include "devreq.h"
10
11#define NDEBUG
12#include <debug.h>
13
14/* bmRequestType bytes used on the default pipe */
15#define XFER_STD_TO_DEVICE 0x00
16#define XFER_STD_TO_INTERFACE 0x01
17#define XFER_STD_TO_ENDPOINT 0x02
18#define XFER_STD_FROM_DEVICE 0x80
19#define XFER_VENDOR_TO_DEVICE 0x40
20#define XFER_VENDOR_FROM_DEVICE 0xC0
21#define XFER_VENDOR_FROM_INTERFACE 0xC1
22#define XFER_CLASS_FROM_PORT 0xA3
23
24/* bmRequestType bits 6:5 */
25#define XFER_TYPE(RequestType) (((RequestType) >> 5) & 3)
26#define XFER_TYPE_STANDARD 0
27#define XFER_TYPE_VENDOR 2
28
29/* Default size of a descriptor header read; the length is read back from it */
30#define XFER_HEADER_READ 255
31
32/* MS OS 1.0 extended properties header */
33#define XFER_EXT_PROPERTIES_HEADER 10
34
35/* The serial number is always asked in this language */
36#define XFER_SERIAL_LANGUAGE 0x0409
37
38/* Function suspend options in the high byte of wIndex */
39#define XFER_FUNCTION_SUSPEND_WAKE 0x0300
40
41/* Hub max port power that selects the low power charging policy */
42#define XFER_LOW_POWER_PORT 100
43
44C_ASSERT(sizeof(((HubChild*)0)->m_Sel) == 6);
45C_ASSERT(sizeof(((HubChild*)0)->m_Qualifier) == 10);
46
47static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubDeviceControlComplete;
48static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubFdoDescriptorComplete;
49static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubBootStatusComplete;
50
51/* Failure classification */
52
53/* QUIRK: billboard string failures reuse the product string reason */
54static
55VOID
60{
61 const USB_DEVICE_DESCRIPTOR* Device = &Child->m_DeviceDescriptor;
62 HubBillboardInfo* Billboard = Child->m_Billboard;
64
65 if (Device->iSerialNumber != 0 && Index == Device->iSerialNumber)
66 {
67 Child->m_EnumMessageId = HUB_ENUM_SERIAL_NUMBER_FAILED;
68 return;
69 }
70
71 if (Index == 0)
72 {
73 Child->m_EnumMessageId = HUB_ENUM_LANGUAGE_IDS_FAILED;
74 return;
75 }
76
77 if (Device->iProduct != 0 && Index == Device->iProduct)
78 {
79 Child->m_EnumMessageId = HUB_ENUM_PRODUCT_STRING_FAILED;
80 return;
81 }
82
83 if (Billboard == NULL)
84 return;
85
86 Caps = Billboard->Descriptor;
87 if (Caps->iAddtionalInfoURL != 0 && Index == Caps->iAddtionalInfoURL)
88 {
89 Child->m_EnumMessageId = HUB_ENUM_PRODUCT_STRING_FAILED;
90 return;
91 }
92
93 if (Billboard->CurrentMode != HUB_BILLBOARD_NO_MODE &&
94 Caps->AlternateMode[Billboard->CurrentMode].iAlternateModeSetting != 0 &&
95 Index == Caps->AlternateMode[Billboard->CurrentMode].iAlternateModeSetting)
96 {
97 Child->m_EnumMessageId = HUB_ENUM_PRODUCT_STRING_FAILED;
98 }
99}
100
102static
104NTAPI
110{
112 return FALSE;
113
115 return TRUE;
116
118 return TRUE;
119
121 return FALSE;
122
125}
126
128static
130NTAPI
134{
135 const UCHAR* Setup = Child->m_Control.Urb.SetupPacket;
136 USBD_STATUS UrbStatus = Child->m_Control.Urb.Hdr.Status;
138 UCHAR Request = Setup[1];
139 USHORT Value = Setup[2] | (Setup[3] << 8);
140 USHORT Index = Setup[4] | (Setup[5] << 8);
141
143 {
144 DPRINT("Device %p port %u request 0x%02x/0x%02x value 0x%04x failed 0x%lx usbd 0x%lx\n",
145 Child, Child->m_Port->Number(), Setup[0], Request, Value, Status, UrbStatus);
146 }
147 else
148 {
149 DPRINT1("Device %p port %u request 0x%02x/0x%02x value 0x%04x index 0x%04x failed 0x%lx usbd 0x%lx\n",
150 Child, Child->m_Port->Number(), Setup[0], Request, Value, Index, Status, UrbStatus);
151 }
152
153 /* Every failed nonzero SET_CONFIGURATION reports the same codes */
155 {
156 Child->m_LastNtStatus = STATUS_UNSUCCESSFUL;
157 Child->m_LastUsbdStatus = USBD_STATUS_SET_CONFIG_FAILED;
158 }
159 else
160 {
161 Child->m_LastNtStatus = Status;
162 Child->m_LastUsbdStatus = UrbStatus;
163 }
164
166 {
167 Child->m_EnumMessageId = HUB_ENUM_SET_SEL_FAILED;
169 }
170
173
175 {
176 switch (Setup[3])
177 {
179 Child->m_EnumMessageId = HUB_ENUM_DEVICE_DESCRIPTOR_FAILED;
180 break;
181
183 Child->m_EnumMessageId = HUB_ENUM_CONFIG_DESCRIPTOR_FAILED;
184 break;
185
187 Child->m_EnumMessageId = HUB_ENUM_BOS_FAILED;
188 break;
189
191 Child->m_EnumMessageId = HUB_ENUM_QUALIFIER_FAILED;
192 break;
193
196 break;
197
198 default:
199 break;
200 }
202 }
203
204 if (Type == XFER_TYPE_VENDOR && Request == Child->m_MsOsVendorCode)
205 {
206 switch (Index)
207 {
209 Child->m_EnumMessageId = HUB_ENUM_MSOS_EXT_CONFIG_FAILED;
210 break;
211
213 Child->m_EnumMessageId = HUB_ENUM_MSOS_CONTAINER_ID_FAILED;
214 break;
215
217 Child->m_EnumMessageId = HUB_ENUM_MSOS20_SET_FAILED;
218 break;
219
221 Child->m_EnumMessageId = HUB_ENUM_ALT_ENUM_FAILED;
222 break;
223
224 default:
225 break;
226 }
228 }
229
231}
232
233static
234VOID
235NTAPI
237 _In_ WDFREQUEST Request,
238 _In_ WDFIOTARGET Target,
241{
243 NTSTATUS Status = Params->IoStatus.Status;
245
248
249 Child->m_Control.UsbdFlags = 0;
250
251 if (!NT_SUCCESS(Status))
253
254 Child->m_Control.Reuse();
255 Child->Post(Event);
256}
257
258/* Sending */
259
261NTAPI
266 _In_ BOOLEAN ShortTransferOk)
267{
269
270 Status = Child->m_Control.Send(Child->m_Hub->m_RootHubTarget,
271 Child->m_UsbDevice,
273 Child,
274 Buffer,
275 Length,
276 ShortTransferOk,
277 Child->m_NeedsForwardProgress);
278 if (NT_SUCCESS(Status))
279 return TRUE;
280
281 Child->m_Control.UsbdFlags = 0;
282 DPRINT1("Device %p transfer refused 0x%lx\n", Child, Status);
283 return FALSE;
284}
285
286/* wLength is truncated to 16 bits while the buffer keeps the full length */
287static
289NTAPI
298 _In_ BOOLEAN ShortTransferOk)
299{
300 Child->m_Control.SetSetup(RequestType, Request, Value, Index, (USHORT)Length);
301 return HubDeviceSend(Child, Buffer, Length, ShortTransferOk);
302}
303
304static
306NTAPI
315 _In_ BOOLEAN ShortTransferOk)
316{
317 if (HubDeviceTrySend(Child, RequestType, Request, Value, Index, Buffer, Length, ShortTransferOk))
318 return TRUE;
319
321 return FALSE;
322}
323
324static
325VOID
326NTAPI
331 _In_ USHORT LanguageId,
334{
338 (USHORT)((Type << 8) | Index),
339 LanguageId,
340 Buffer,
341 Length,
342 TRUE);
343}
344
345static
346VOID
347NTAPI
351 _In_ USHORT LanguageId)
352{
355 Index,
356 LanguageId,
357 Child->m_ScratchBuffer,
359}
360
361static
362VOID
363NTAPI
370{
371 HubDeviceRequest(Child, RequestType, Child->m_MsOsVendorCode, 0, Index, Buffer, Length, TRUE);
372}
373
374static
375VOID
376NTAPI
381{
385 Feature,
386 0,
387 NULL,
388 0,
389 TRUE);
390}
391
392static
393VOID
394NTAPI
397{
398 if (*Buffer == NULL)
399 return;
400
402 *Buffer = NULL;
403}
404
405/* Device and configuration descriptors */
406
407/* Some devices misbehave unless the first read asks for 64 bytes */
408VOID
410{
412}
413
414VOID
416{
419 0,
420 0,
422 sizeof(USB_DEVICE_DESCRIPTOR));
423}
424
425VOID
427{
428 if (!WdfRequestCancelSentRequest(m_Device->m_Control.Request))
429 DPRINT1("Device %p transfer not canceled, already completed\n", m_Device);
430}
431
432VOID
434{
436
437 HubFreeDevicePool((PVOID*)&Child->m_ConfigDescriptor);
438 Child->m_CompatIdInterface = NULL;
439
442 0,
443 0,
444 Child->m_ScratchBuffer,
446}
447
448/* The header stays in the scratch buffer for the check */
449VOID
451{
453 USHORT Total = ((PUSB_CONFIGURATION_DESCRIPTOR)Child->m_ScratchBuffer)->wTotalLength;
454
456 Total,
458 if (Child->m_ConfigDescriptor == NULL)
459 {
460 DPRINT1("Device %p no memory for a %u byte configuration\n", Child, Total);
461 Child->Post(DsmEvent::TransferFailed);
462 return;
463 }
464
466}
467
468/* BOS */
469
470VOID
472{
474
475 HubFreeDevicePool((PVOID*)&Child->m_Bos);
477
479}
480
481VOID
483{
485 USHORT Total = ((PUSB_BOS_DESCRIPTOR)Child->m_ScratchBuffer)->wTotalLength;
486
488 if (Child->m_Bos == NULL)
489 {
490 DPRINT1("Device %p no memory for a %u byte BOS\n", Child, Total);
491 Child->Post(DsmEvent::TransferFailed);
492 return;
493 }
494
496}
497
498/* The vendor command and the features come from the BOS walk */
499VOID
501{
503 ULONG Features = Child->m_DualRoleLocalFeatures;
504
507 Child->m_DualRoleRequestCode,
508 (USHORT)(Features & 0xFFFF),
509 (USHORT)(Features >> 16),
510 NULL,
511 0,
512 TRUE))
513 {
514 Child->SetState(ChildState::DualRoleCommandSent);
515 }
516}
517
518/* Billboard strings */
519
520VOID
522{
524
525 if (Child->m_Billboard == NULL)
526 {
527 DPRINT1("Device %p has no billboard to read the URL string of\n", Child);
528 Child->Post(DsmEvent::TransferFailed);
529 return;
530 }
531
532 HubDeviceGetString(Child, Child->m_Billboard->Descriptor->iAddtionalInfoURL, 0);
533}
534
535VOID
537{
539 HubBillboardInfo* Billboard = Child->m_Billboard;
540 UCHAR Index;
541
542 if (Billboard == NULL || Billboard->CurrentMode == HUB_BILLBOARD_NO_MODE)
543 {
544 DPRINT1("Device %p has no alternate mode string to read\n", Child);
545 Child->Post(DsmEvent::TransferFailed);
546 return;
547 }
548
549 Index = Billboard->Descriptor->AlternateMode[Billboard->CurrentMode].iAlternateModeSetting;
550
551 Child->m_Control.SetSetup(XFER_STD_FROM_DEVICE,
554 0,
556
557 if (!HubDeviceSend(Child, Child->m_ScratchBuffer, MAXIMUM_USB_STRING_LENGTH, TRUE))
558 {
560 Child->Post(DsmEvent::TransferFailed);
561 }
562}
563
564/* Strings */
565
566VOID
568{
571}
572
573/* QUIRK: without the errata a zero iProduct reads the language table as the name */
574VOID
576{
578
579 if (Child->m_DeviceDescriptor.iProduct == 0 && Child->HasHack(ChildHack::DisableSerialNumber))
580 {
581 DPRINT("Device %p has no product string\n", Child);
582 Child->Post(DsmEvent::TransferFailed);
583 return;
584 }
585
586 HubFreeDevicePool((PVOID*)&Child->m_ProductString);
587 HubDeviceGetString(Child, Child->m_DeviceDescriptor.iProduct, Child->m_LanguageId);
588}
589
590/* Always in US English, whatever the device lists */
591VOID
593{
595
596 if (Child->m_DeviceDescriptor.iSerialNumber == 0)
597 {
598 DPRINT("Device %p has no serial number string\n", Child);
599 Child->Post(DsmEvent::TransferFailed);
600 return;
601 }
602
603 HubDeviceGetString(Child, Child->m_DeviceDescriptor.iSerialNumber, XFER_SERIAL_LANGUAGE);
604}
605
606VOID
608{
611 0,
612 0,
614 sizeof(m_Device->m_Qualifier));
615}
616
617/* MS OS 1.0 */
618
619VOID
621{
625 0,
627 sizeof(m_Device->m_MsOsString));
628}
629
630VOID
632{
637 sizeof(HubMsOsHeader));
638}
639
640VOID
642{
647 sizeof(HubMsOsContainerId));
648}
649
650VOID
652{
654
659 sizeof(HubMsOsExtConfigHeader));
660}
661
662/* UCX refuses a buffer over 64 KB, so a huge dwLength just fails the transfer */
663VOID
665{
667 ULONG Length = ((HubMsOsExtConfigHeader*)Child->m_ScratchBuffer)->dwLength;
668
670 if (Child->m_MsOsExtConfig == NULL)
671 {
672 DPRINT1("Device %p no memory for a %lu byte extended configuration\n", Child, Length);
673 Child->Post(DsmEvent::TransferFailed);
674 return;
675 }
676
678}
679
680VOID
682{
688}
689
690/* The buffer was sized from the header by AllocateExtPropertiesBuffer */
691VOID
693{
696
697 if (Child->m_ExtProperties == NULL)
698 {
699 DPRINT1("Device %p has no extended properties buffer\n", Child);
700 Child->Post(DsmEvent::TransferFailed);
701 return;
702 }
703
705}
706
707/* MS OS 2.0 */
708
709/* Large transfers must be allowed or UCX caps the read at the default pipe maximum */
710VOID
712{
715
716 HubFreeDevicePool(&Child->m_MsOs20Set);
717 Child->m_MsOs20SetLength = 0;
718
720 if (Child->m_MsOs20Set == NULL)
721 {
722 DPRINT1("Device %p no memory for a %u byte MS OS 2.0 set\n", Child, Length);
723 Child->Post(DsmEvent::TransferFailed);
724 return;
725 }
726
727 Child->m_MsOsVendorCode = Child->m_MsOs20SetInfo.bVendorCode;
728 Child->m_Control.UsbdFlags = UCXHUB_URB_FLAG_ALLOW_LARGE_TRANSFER;
729
731}
732
733/* QUIRK: the command counts as sent once the send is accepted, even if the device fails it */
734VOID
736{
738
741 Child->m_MsOsVendorCode,
742 (USHORT)(Child->m_MsOs20SetInfo.bAltEnumCode << 8),
744 NULL,
745 0,
746 TRUE))
747 {
748 Child->SetState(ChildState::AltEnumCommandSent);
749 }
750}
751
752/* Configuration and pipes */
753
754VOID
756{
758
759 if (Child->m_CurrentConfig == NULL)
760 {
761 DPRINT1("Device %p has no configuration to select\n", Child);
762 Child->Post(DsmEvent::TransferFailed);
763 return;
764 }
765
769 Child->m_CurrentConfig->Descriptor.bConfigurationValue,
770 0,
771 NULL,
772 0,
773 FALSE);
774}
775
776VOID
778{
780}
781
784{
788
789 if (Config == NULL)
790 return FALSE;
791
792 for (Entry = Config->Interfaces.Flink; Entry != &Config->Interfaces; Entry = Entry->Flink)
793 {
795 if (Interface->NeedsSetInterface)
796 {
798 return TRUE;
799 }
800 }
801
802 return FALSE;
803}
804
805VOID
807{
809 HubInterface* Interface = Child->m_NextInterface;
810
811 if (Interface == NULL)
812 {
813 DPRINT("Device %p has no alternate setting left to select\n", Child);
814 Child->Post(DsmEvent::TransferDone);
815 return;
816 }
817
818 Child->m_Control.SetSetup(XFER_STD_TO_INTERFACE,
820 Interface->Descriptor->bAlternateSetting,
821 Interface->Descriptor->bInterfaceNumber,
822 0);
823
824 Interface->NeedsSetInterface = FALSE;
825 Child->m_NextInterface = NULL;
826
827 if (!HubDeviceSend(Child, NULL, 0, FALSE))
828 Child->Post(DsmEvent::TransferFailed);
829}
830
831VOID
833{
835 HubPipe* Pipe = Child->m_TargetPipe;
836
837 if (Pipe == NULL)
838 {
839 DPRINT1("Device %p clear halt on an unknown pipe\n", Child);
840 Child->m_LastUsbdStatus = USBD_STATUS_INVALID_PIPE_HANDLE;
841 Child->m_LastNtStatus = STATUS_INVALID_PARAMETER;
842 Child->Post(DsmEvent::TransferFailed);
843 return;
844 }
845
850 Pipe->Descriptor->bEndpointAddress,
851 NULL,
852 0,
853 FALSE);
854}
855
856HubPipe*
857NTAPI
861{
864 ULONG Index;
865
866 if (Config == NULL)
867 return NULL;
868
869 for (Entry = Config->Interfaces.Flink; Entry != &Config->Interfaces; Entry = Entry->Flink)
870 {
872
873 for (Index = 0; Index < Interface->PipeCount; Index++)
874 {
875 if (Interface->Pipes[Index].PipeHandle == Handle)
876 return &Interface->Pipes[Index];
877 }
878 }
879
880 return NULL;
881}
882
883/* Remote wake */
884
885/* QUIRK: the PDO is marked armed before the request and stays so on failure */
886VOID
888{
890
891 if (Child->m_Pdo != NULL)
892 InterlockedOr(&Child->m_Pdo->m_Flags, (LONG)PdoFlag::ArmedForWake);
893
894 if (Child->m_Kind & DSM_KIND_SUPER_SPEED)
895 {
901 NULL,
902 0,
903 TRUE);
904 }
905 else
906 {
908 }
909}
910
911VOID
913{
915
916 if (Child->m_Pdo != NULL)
917 InterlockedAnd(&Child->m_Pdo->m_Flags, ~(LONG)PdoFlag::ArmedForWake);
918
919 if (Child->m_Kind & DSM_KIND_SUPER_SPEED)
920 {
925 0,
926 NULL,
927 0,
928 TRUE);
929 }
930 else
931 {
933 }
934}
935
936/* Link power */
937
938VOID
940{
942}
943
944VOID
946{
948}
949
950VOID
952{
954}
955
956VOID
958{
960}
961
962VOID
964{
966}
967
968VOID
970{
973
978 Policy,
979 NULL,
980 0,
981 TRUE);
982}
983
985static
986USHORT
987NTAPI
989 _In_ USHORT DeviceLatency,
990 _In_ USHORT UpstreamLatency,
991 _In_ USHORT SlowestLatency,
992 _In_ UCHAR SlowestDepth,
995 _Inout_ PBOOLEAN Slowest)
996{
997 USHORT Path;
998
999 *Link = max(DeviceLatency, UpstreamLatency);
1000 Path = (USHORT)(SlowestLatency + ((Depth - SlowestDepth) * 1000 + 500) / 1000);
1001
1002 if (*Link <= Path)
1003 return Path;
1004
1005 *Slowest = TRUE;
1006 return *Link;
1007}
1008
1009/* U1 PEL wraps at 8 bits and the depth 0 delay is not converted to us */
1010VOID
1012{
1014 HubFdo* Hub = Child->m_Hub;
1017 ULONG DecodeLatency = (Hub->m_HubDescriptor.Usb30.bHubHdrDecLat + 5) / 10;
1018 ULONG LinkDelay = Child->m_RxTpDelay + Child->m_TxTpDelay;
1019 USHORT LinkU1;
1020 USHORT LinkU2;
1021 UCHAR PelU1;
1022 USHORT PelU2;
1023 ULONG Erdy;
1024
1025 PelU1 = (UCHAR)HubSelPathLatency(Child->m_U1ExitLatency,
1026 Parent->U1ExitLatency,
1027 Parent->SlowestLinkU1ExitLatency,
1028 Parent->SlowestLinkU1Depth,
1029 Depth,
1030 &LinkU1,
1031 &Child->m_SlowestLinkU1);
1032
1033 PelU2 = HubSelPathLatency(Child->m_U2ExitLatency,
1034 Parent->U2ExitLatency,
1035 Parent->SlowestLinkU2ExitLatency,
1036 Parent->SlowestLinkU2Depth,
1037 Depth,
1038 &LinkU2,
1039 &Child->m_SlowestLinkU2);
1040
1041 Child->m_HostU1ExitLatency = (USHORT)(Parent->HostInitiatedU1ExitLatency + LinkU1 + DecodeLatency);
1042 Child->m_HostU2ExitLatency = (USHORT)(Parent->HostInitiatedU2ExitLatency + LinkU2 + DecodeLatency);
1043
1044 /* 2100 ns forwarding, 400 ns per hub each way, plus the link delays, rounded to us */
1045 if (Depth == 0)
1046 Erdy = LinkDelay;
1047 else
1048 Erdy = ((Depth + 1) * LinkDelay + 800 * Depth + 2200) / 1000;
1049
1050 /* 5 us host response time */
1051 Child->m_Sel.U1Pel = PelU1;
1052 Child->m_Sel.U1Sel = (UCHAR)(PelU1 + Erdy + 5);
1053 Child->m_Sel.U2Pel = PelU2;
1054 Child->m_Sel.U2Sel = (USHORT)(PelU2 + Erdy + 5);
1055
1059 0,
1060 0,
1061 &Child->m_Sel,
1062 sizeof(Child->m_Sel),
1063 TRUE);
1064}
1065
1066/* All in ns: propagation to this hub, the hub's own delay and the device link */
1067VOID
1069{
1071 HubFdo* Hub = Child->m_Hub;
1072 USHORT Delay;
1073
1076 Child->m_TxTpDelay);
1077
1079}
1080
1081/* User mode descriptor request on behalf of the hub FDO */
1082
1083/* The event goes out before the user request is completed */
1084static
1085VOID
1086NTAPI
1088 _In_ WDFREQUEST Request,
1089 _In_ WDFIOTARGET Target,
1092{
1094 HubQueueContext* Queue = HubGetQueueContext(WdfRequestGetIoQueue(Request));
1095 ULONG Size = Queue->Urb.TransferBufferLength;
1096
1098
1099 if (!NT_SUCCESS(Params->IoStatus.Status))
1100 DPRINT1("Device %p descriptor read for the hub failed 0x%lx\n", Child, Params->IoStatus.Status);
1101
1103 HubCompleteFdoDescriptorRequest(Child, Request, WdfRequestGetStatus(Request), Size);
1104}
1105
1106/* The URB in the queue context was filled by the IOCTL handler */
1107VOID
1109{
1111 WDFREQUEST Request = Child->m_FdoRequest;
1112 HubQueueContext* Queue = HubGetQueueContext(WdfRequestGetIoQueue(Request));
1114
1115 RtlZeroMemory(&Stack, sizeof(Stack));
1116 Stack.MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
1117 Stack.Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
1118 Stack.Parameters.Others.Argument1 = &Queue->Urb;
1119 WdfRequestWdmFormatUsingStackLocation(Request, &Stack);
1120
1121 WdfRequestSetCompletionRoutine(Request, HubFdoDescriptorComplete, Child);
1122
1123 if (WdfRequestSend(Request, Child->m_Hub->m_RootHubTarget, WDF_NO_SEND_OPTIONS))
1124 return;
1125
1126 DPRINT1("Device %p descriptor read for the hub not sent 0x%lx\n", Child, WdfRequestGetStatus(Request));
1127 Child->Post(DsmEvent::TransferFailed);
1129}
1130
1131/* Boot device presence */
1132
1133static
1134VOID
1135NTAPI
1137 _In_ WDFREQUEST Request,
1138 _In_ WDFIOTARGET Target,
1141{
1145
1147}
1148
1149/*
1150 * Always the 4 byte status, even on an enhanced SuperSpeed port. The request
1151 * is made the first time it is needed and reused on the next call.
1152 */
1155NTAPI
1156HubReadPortStatusForBootDevice(
1159{
1160 HubFdo* Hub = Child->m_Hub;
1161 HubControlRequest* Control = &Child->m_BootControl;
1164
1166
1167 *PortStatus = 0;
1168
1169 if (Control->Request == NULL)
1170 {
1171 Status = Control->Create(Child->m_Object, WdfDeviceGetIoTarget(Hub->m_Device));
1172 if (!NT_SUCCESS(Status))
1173 {
1174 DPRINT1("Device %p boot status request not created 0x%lx\n", Child, Status);
1175 return Status;
1176 }
1177 }
1178 else
1179 {
1180 Control->Reuse();
1181 }
1182
1184
1187 0,
1188 Child->m_Port->Number(),
1189 sizeof(*PortStatus));
1190
1192 Hub->UsbDevice(),
1194 &Done,
1195 PortStatus,
1196 sizeof(*PortStatus),
1197 FALSE,
1198 TRUE);
1200 {
1201 DPRINT1("Port %u boot status read not sent 0x%lx\n", Child->m_Port->Number(), Status);
1202 return Status;
1203 }
1204
1205 HubWaitForPnpEvent(&Done, "boot device port status", Child->m_Object);
1206
1207 Status = WdfRequestGetStatus(Control->Request);
1208 if (!NT_SUCCESS(Status))
1209 DPRINT1("Port %u boot status read failed 0x%lx\n", Child->m_Port->Number(), Status);
1210
1211 return Status;
1212}
Type
Definition: Type.h:7
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE ACPI_HANDLE ACPI_HANDLE *OutHandle ACPI_HANDLE *OutHandle void *Context void *Context ACPI_EVENT_HANDLER Handler UINT32 UINT32 ACPI_GPE_HANDLER void *Context UINT32 ACPI_NOTIFY_HANDLER void *Context ACPI_ADR_SPACE_TYPE ACPI_ADR_SPACE_HANDLER ACPI_ADR_SPACE_SETUP Setup
Definition: acpixf.h:834
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
HubFdo * Hub
Definition: bootdev.cpp:261
_In_ ULONG const _In_ FEATURE_NUMBER const Feature
Definition: cdrom.h:1077
Definition: bufpool.h:45
VOID SetConfiguration()
Definition: devreq.cpp:755
HubChild * m_Device
Definition: devsm.h:1832
VOID ReadFullConfigDescriptor()
Definition: devreq.cpp:450
VOID ReadBillboardString()
Definition: devreq.cpp:521
VOID SendAltEnumCommand()
Definition: devreq.cpp:735
VOID ReadQualifier()
Definition: devreq.cpp:607
VOID ReadMsOs20Set()
Definition: devreq.cpp:711
VOID CancelTransfer()
Definition: devreq.cpp:426
VOID ReadContainerId()
Definition: devreq.cpp:641
VOID ReadMsOsDescriptor()
Definition: devreq.cpp:620
VOID ReadExtendedConfig()
Definition: devreq.cpp:664
VOID ClearEndpointHalt()
Definition: devreq.cpp:832
VOID DisableU1()
Definition: devreq.cpp:945
VOID ReadFirstDescriptor()
Definition: devreq.cpp:409
VOID EnableU1()
Definition: devreq.cpp:939
VOID ArmForWake()
Definition: devreq.cpp:887
VOID DisarmWake()
Definition: devreq.cpp:912
VOID SetNullConfiguration()
Definition: devreq.cpp:777
VOID ReadConfigDescriptorHeader()
Definition: devreq.cpp:433
VOID DisableU2()
Definition: devreq.cpp:957
VOID SetPdChargingPolicy()
Definition: devreq.cpp:969
VOID SetIsochDelay()
Definition: devreq.cpp:1068
VOID SendUsbFeatures()
Definition: devreq.cpp:500
VOID GetDescriptorForHub()
Definition: devreq.cpp:1108
VOID SetSel()
Definition: devreq.cpp:1011
VOID ReadExtPropertiesHeader()
Definition: devreq.cpp:681
VOID ReadAltModeString()
Definition: devreq.cpp:536
VOID ReadSerialNumber()
Definition: devreq.cpp:592
VOID ReadDeviceDescriptor()
Definition: devreq.cpp:415
VOID ReadExtendedConfigHeader()
Definition: devreq.cpp:651
VOID SetInterface()
Definition: devreq.cpp:806
VOID ReadBosHeader()
Definition: devreq.cpp:471
SM_RESULT Delay(_In_ DSM_DELAY Kind, _In_ DSM_NEXT Next)
Definition: devsm.cpp:291
VOID ReadContainerIdHeader()
Definition: devreq.cpp:631
VOID ReadProductName()
Definition: devreq.cpp:575
VOID EnableLtm()
Definition: devreq.cpp:963
VOID EnableU2()
Definition: devreq.cpp:951
BOOLEAN AlternateSettingLeft()
Definition: devreq.cpp:783
VOID ReadExtProperties()
Definition: devreq.cpp:692
VOID ReadBos()
Definition: devreq.cpp:482
VOID ReadLanguageIds()
Definition: devreq.cpp:567
HubMsOsExtConfig * m_MsOsExtConfig
Definition: hubchild.h:418
PUSB_STRING_DESCRIPTOR m_LanguageIds
Definition: hubchild.h:390
HubFdo * m_Hub
Definition: hubchild.h:316
UCHAR m_ScratchBuffer[256]
Definition: hubchild.h:393
WDFREQUEST m_FdoRequest
Definition: hubchild.h:366
HubInterface * m_NextInterface
Definition: hubchild.h:374
HubMsOs20SetInfo m_MsOs20SetInfo
Definition: hubchild.h:493
HubControlRequest m_Control
Definition: hubchild.h:359
HubMsOsString m_MsOsString
Definition: hubchild.h:489
USB_DEVICE_QUALIFIER_DESCRIPTOR m_Qualifier
Definition: hubchild.h:387
HubConfiguration * m_CurrentConfig
Definition: hubchild.h:370
VOID SetState(_In_ ChildState Flag)
Definition: hubchild.h:267
Definition: fdo.h:132
WDFDEVICE m_Device
Definition: fdo.h:349
WDFIOTARGET m_RootHubTarget
Definition: fdo.h:368
UCXUSBDEVICE UsbDevice() const
Definition: fdo.h:180
HubParentInfo m_ParentInfo
Definition: fdo.h:360
USB_30_HUB_DESCRIPTOR Usb30
Definition: fdo.h:420
ULONG m_MaxPortPower
Definition: fdo.h:384
UCXHUB_PARENT_INTERFACE m_Parent
Definition: fdo.h:355
union HubFdo::@1628 m_HubDescriptor
UINT Depth
Definition: d3d12.idl:4644
VOID NTAPI HubFreeBillboardInfo(_In_ HubChild *Child)
Definition: devdesc.cpp:348
_In_ BOOLEAN _In_ ULONG Features
Definition: devdesc.cpp:445
PLIST_ENTRY Entry
Definition: devhcd.cpp:1262
#define XFER_LOW_POWER_PORT
Definition: devreq.cpp:42
#define XFER_STD_TO_ENDPOINT
Definition: devreq.cpp:17
static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubDeviceControlComplete
Definition: devreq.cpp:47
static VOID NTAPI HubDeviceGetString(_In_ HubChild *Child, _In_ UCHAR Index, _In_ USHORT LanguageId)
Definition: devreq.cpp:348
#define XFER_TYPE_STANDARD
Definition: devreq.cpp:26
#define XFER_STD_TO_DEVICE
Definition: devreq.cpp:15
static VOID NTAPI HubDeviceFeature(_In_ HubChild *Child, _In_ BOOLEAN Set, _In_ USHORT Feature)
Definition: devreq.cpp:377
static BOOLEAN NTAPI HubDeviceRequest(_In_ HubChild *Child, _In_ UCHAR RequestType, _In_ UCHAR Request, _In_ USHORT Value, _In_ USHORT Index, _In_reads_bytes_opt_(Length) PVOID Buffer, _In_ ULONG Length, _In_ BOOLEAN ShortTransferOk)
Definition: devreq.cpp:307
#define XFER_STD_TO_INTERFACE
Definition: devreq.cpp:16
PAGED_CODE()
static VOID NTAPI HubDeviceStringFailed(_In_ HubChild *Child, _In_ UCHAR Index)
Definition: devreq.cpp:57
#define XFER_EXT_PROPERTIES_HEADER
Definition: devreq.cpp:33
#define XFER_HEADER_READ
Definition: devreq.cpp:30
#define XFER_VENDOR_FROM_DEVICE
Definition: devreq.cpp:20
static VOID NTAPI HubDeviceMsOsRead(_In_ HubChild *Child, _In_ UCHAR RequestType, _In_ USHORT Index, _Out_writes_bytes_(Length) PVOID Buffer, _In_ ULONG Length)
Definition: devreq.cpp:364
#define XFER_SERIAL_LANGUAGE
Definition: devreq.cpp:36
static VOID NTAPI HubDeviceGetDescriptor(_In_ HubChild *Child, _In_ UCHAR Type, _In_ UCHAR Index, _In_ USHORT LanguageId, _Out_writes_bytes_(Length) PVOID Buffer, _In_ ULONG Length)
Definition: devreq.cpp:327
#define XFER_VENDOR_TO_DEVICE
Definition: devreq.cpp:19
KEVENT Done
Definition: devreq.cpp:1162
#define XFER_TYPE_VENDOR
Definition: devreq.cpp:27
BOOLEAN NTAPI HubDeviceSend(_In_ HubChild *Child, _In_reads_bytes_opt_(Length) PVOID Buffer, _In_ ULONG Length, _In_ BOOLEAN ShortTransferOk)
Definition: devreq.cpp:262
static USHORT NTAPI HubSelPathLatency(_In_ USHORT DeviceLatency, _In_ USHORT UpstreamLatency, _In_ USHORT SlowestLatency, _In_ UCHAR SlowestDepth, _In_ LONG Depth, _Out_ PUSHORT Link, _Inout_ PBOOLEAN Slowest)
Definition: devreq.cpp:988
#define XFER_STD_FROM_DEVICE
Definition: devreq.cpp:18
HubPipe *NTAPI HubFindPipeByHandle(_In_opt_ HubConfiguration *Config, _In_ USBD_PIPE_HANDLE Handle)
Definition: devreq.cpp:858
#define XFER_CLASS_FROM_PORT
Definition: devreq.cpp:22
static VOID NTAPI HubFreeDevicePool(_Inout_ PVOID *Buffer)
Definition: devreq.cpp:395
#define XFER_VENDOR_FROM_INTERFACE
Definition: devreq.cpp:21
static BOOLEAN NTAPI HubDeviceFailureExpected(_In_ UCHAR Type, _In_ UCHAR Request, _In_ USHORT Value, _In_ USHORT Index)
Definition: devreq.cpp:105
#define XFER_TYPE(RequestType)
Definition: devreq.cpp:25
#define XFER_FUNCTION_SUSPEND_WAKE
Definition: devreq.cpp:39
static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubBootStatusComplete
Definition: devreq.cpp:49
static BOOLEAN NTAPI HubDeviceTrySend(_In_ HubChild *Child, _In_ UCHAR RequestType, _In_ UCHAR Request, _In_ USHORT Value, _In_ USHORT Index, _In_reads_bytes_opt_(Length) PVOID Buffer, _In_ ULONG Length, _In_ BOOLEAN ShortTransferOk)
Definition: devreq.cpp:290
static DsmEvent NTAPI HubDeviceTransferFailed(_In_ HubChild *Child, _In_ NTSTATUS Status)
Definition: devreq.cpp:131
static EVT_WDF_REQUEST_COMPLETION_ROUTINE HubFdoDescriptorComplete
Definition: devreq.cpp:48
NTSTATUS Status
Definition: devreq.cpp:1163
_Out_ PULONG PortStatus
Definition: devreq.cpp:1159
#define HUB_MSOS_INDEX_EXT_CONFIG
Definition: devreq.h:13
#define HUB_MSOS20_INDEX_ALT_ENUM
Definition: devreq.h:17
#define HUB_MSOS_STRING_INDEX
Definition: devreq.h:20
VOID NTAPI HubCompleteFdoDescriptorRequest(_In_ HubChild *Child, _In_ WDFREQUEST Request, _In_ NTSTATUS Status, _In_ ULONG Size)
Definition: hubioctl.cpp:372
#define HUB_MSOS20_INDEX_SET
Definition: devreq.h:16
#define HUB_MSOS_INDEX_EXT_PROPERTIES
Definition: devreq.h:14
#define HUB_MSOS_INDEX_CONTAINER_ID
Definition: devreq.h:15
#define DSM_KIND_SUPER_SPEED
Definition: devsm.h:150
DsmEvent
Definition: devsm.h:15
@ TransferStalled
@ TransferFailed
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define _IRQL_requires_(irql)
Definition: driverspecs.h:229
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define NonPagedPool
Definition: env_spec_w32.h:307
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h:24
#define HUB_BILLBOARD_NO_MODE
Definition: hubchild.h:227
#define HUB_ENUM_QUALIFIER_FAILED
Definition: hubid.h:19
#define HUB_ENUM_MSOS_CONTAINER_ID_FAILED
Definition: hubid.h:24
#define HUB_ENUM_MSOS20_SET_FAILED
Definition: hubid.h:35
#define HUB_ENUM_DEVICE_DESCRIPTOR_FAILED
Definition: hubid.h:11
#define HUB_ENUM_MSOS_EXT_CONFIG_FAILED
Definition: hubid.h:23
#define HUB_ENUM_ALT_ENUM_FAILED
Definition: hubid.h:37
#define HUB_ENUM_PRODUCT_STRING_FAILED
Definition: hubid.h:22
#define HUB_ENUM_SET_SEL_FAILED
Definition: hubid.h:17
#define HUB_ENUM_LANGUAGE_IDS_FAILED
Definition: hubid.h:21
#define HUB_ENUM_BOS_FAILED
Definition: hubid.h:18
#define HUB_ENUM_CONFIG_DESCRIPTOR_FAILED
Definition: hubid.h:16
#define HUB_ENUM_SERIAL_NUMBER_FAILED
Definition: hubid.h:20
UNICODE_STRING Path
#define HUB_REQUEST_GET_STATUS
Definition: hubreq.h:85
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
#define UCXHUB_URB_FLAG_ALLOW_LARGE_TRANSFER
Definition: hubucx.h:101
#define HUB_TAG_DEVICE
Definition: hubutil.h:13
ULONG Total
Definition: hubwmi.cpp:548
#define InterlockedOr
Definition: interlocked.h:239
#define InterlockedAnd
Definition: interlocked.h:77
#define C_ASSERT(e)
Definition: intsafe.h:73
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
if(dx< 0)
Definition: linetemp.h:194
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define _Out_writes_bytes_(s)
Definition: no_sal2.h:178
#define _In_reads_bytes_opt_(s)
Definition: no_sal2.h:224
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
@ NotificationEvent
static BOOL Set
Definition: pageheap.c:10
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
#define DPRINT
Definition: sndvol32.h:73
PUSB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR Descriptor
Definition: hubchild.h:232
UCHAR CurrentMode
Definition: hubchild.h:233
WDFREQUEST Request
Definition: hubreq.h:19
USHORT TotalTpPropagationDelay
Definition: fdo.h:99
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
struct _USB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR::@4127 AlternateMode[1]
#define max(a, b)
Definition: svc.c:63
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char UCHAR
Definition: typedefs.h:53
unsigned char * PBOOLEAN
Definition: typedefs.h:53
#define NTAPI
Definition: typedefs.h:36
uint16_t * PUSHORT
Definition: typedefs.h:56
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_In_ UCXUSBDEVICE _In_ ULONG Interface
Definition: ucxusbdevice.h:428
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define USB_FEATURE_REMOTE_WAKEUP
Definition: usb100.h:103
struct _USB_CONFIGURATION_DESCRIPTOR * PUSB_CONFIGURATION_DESCRIPTOR
#define USB_REQUEST_GET_DESCRIPTOR
Definition: usb100.h:82
#define USB_FEATURE_ENDPOINT_STALL
Definition: usb100.h:102
#define USB_CONFIGURATION_DESCRIPTOR_TYPE
Definition: usb100.h:50
#define MAXIMUM_USB_STRING_LENGTH
Definition: usb100.h:43
#define USB_DEVICE_DESCRIPTOR_TYPE
Definition: usb100.h:49
#define USB_REQUEST_SET_FEATURE
Definition: usb100.h:80
#define USB_REQUEST_SET_CONFIGURATION
Definition: usb100.h:85
#define USB_STRING_DESCRIPTOR_TYPE
Definition: usb100.h:51
#define USB_REQUEST_CLEAR_FEATURE
Definition: usb100.h:79
#define USB_REQUEST_SET_INTERFACE
Definition: usb100.h:87
#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE
Definition: usb200.h:94
#define USB_FEATURE_LTM_ENABLE
Definition: usb300.h:339
#define USB_REQUEST_SET_SEL
Definition: usb300.h:329
#define USB_CHARGING_POLICY_ICCLPF
Definition: usb300.h:345
#define USB_BOS_DESCRIPTOR_TYPE
Definition: usb300.h:17
#define USB_FEATURE_CHARGING_POLICY
Definition: usb300.h:341
#define USB_FEATURE_U1_ENABLE
Definition: usb300.h:337
#define USB_REQUEST_ISOCH_DELAY
Definition: usb300.h:330
#define USB_CHARGING_POLICY_ICCHPF
Definition: usb300.h:344
#define USB_FEATURE_FUNCTION_SUSPEND
Definition: usb300.h:333
#define USB_FEATURE_U2_ENABLE
Definition: usb300.h:338
struct _USB_BOS_DESCRIPTOR * PUSB_BOS_DESCRIPTOR
#define USBD_STATUS_INVALID_PIPE_HANDLE
Definition: usb.h:205
#define USBD_STATUS_SET_CONFIG_FAILED
Definition: usb.h:216
#define USBD_STATUS_STALL_PID
Definition: usb.h:183
LONG USBD_STATUS
Definition: usb.h:172
#define IOCTL_INTERNAL_USB_SUBMIT_URB
Definition: usbioctl.h:32
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
Definition: wdfdevice.h:2231
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFQUEUE _In_ _Strict_type_match_ WDF_REQUEST_TYPE RequestType
Definition: wdfdevice.h:4239
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:536
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY Policy
Definition: wdfinterrupt.h:653
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_Must_inspect_result_ FORCEINLINE BOOLEAN WdfRequestSend(_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_opt_ PWDF_REQUEST_SEND_OPTIONS Options)
Definition: wdfrequest.h:677
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
Definition: wdfrequest.h:308
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
#define WDF_NO_SEND_OPTIONS
Definition: wdftypes.h:109
_In_ WDFUSBPIPE Pipe
Definition: wdfusb.h:1741
_In_ WDF_WMI_PROVIDER_CONTROL Control
Definition: wdfwmi.h:166
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MJ_INTERNAL_DEVICE_CONTROL