ReactOS 0.4.17-dev-1281-g065abb3
hostqueues.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS USB Host Controller Extension
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Queues ucx01000 creates on the controller driver's FDO
5 * COPYRIGHT: Copyright 2026 Justin Miller <justin.miller@reactos.org>
6 */
7
8#include "ucx01000.h"
9
10#define NDEBUG
11#include <debug.h>
12
14static
20 _In_ ULONG PresentedRequests,
24 _Out_ WDFQUEUE* Queue)
25{
29
31 Config.PowerManaged = WdfFalse;
32 Config.EvtIoInternalDeviceControl = Handler;
34 Config.Settings.Parallel.NumberOfPresentedRequests = PresentedRequests;
35
37 Attributes.ParentObject = Controller->m_Handle;
38 Attributes.ContextTypeInfo = ContextType;
39
40 Status = WdfIoQueueCreate(Controller->m_Fdo, &Config, &Attributes, Queue);
41 if (!NT_SUCCESS(Status))
42 {
43 DPRINT1("Controller %p queue create failed 0x%lx\n", Controller, Status);
44 return Status;
45 }
46
47 if (Policy != NULL)
48 {
49 Status = WdfIoQueueAssignForwardProgressPolicy(*Queue, Policy);
50 if (!NT_SUCCESS(Status))
51 DPRINT1("Controller %p queue %p forward progress policy failed 0x%lx\n", Controller, *Queue, Status);
52 }
53
54 return Status;
55}
56
59{
63
64 /* One reserved request, always used when allocation fails */
67
70 1,
73 &Reserved,
75 if (!NT_SUCCESS(Status))
76 return Status;
77
78 UcxGetAddress0QueueContext(m_Address0Queue)->Controller = this;
79
84 NULL,
85 &Reserved,
87 if (!NT_SUCCESS(Status))
88 return Status;
89
92 1,
94 NULL,
95 &Reserved,
97 if (!NT_SUCCESS(Status))
98 return Status;
99
102 MAXULONG,
104 NULL,
105 NULL,
107 if (!NT_SUCCESS(Status))
108 return Status;
109
110 return UcxCreateControllerQueue(this,
112 MAXULONG,
114 NULL,
115 &Examine,
117}
118
119/* Address 0 ownership: the sequential queue stays stopped while a hub holds address 0 */
120VOID
121NTAPI
123 _In_ WDFQUEUE Queue,
124 _In_ WDFREQUEST Request,
126 _In_ size_t InputBufferLength,
128{
129 UcxAddress0QueueContext* Context = UcxGetAddress0QueueContext(Queue);
131
134
136 {
137 DPRINT1("Address 0 queue got unexpected IOCTL 0x%lx\n", IoControlCode);
138 WdfRequestComplete(Request, STATUS_INVALID_DEVICE_REQUEST);
139 return;
140 }
141
142 WdfIoQueueStop(Queue, NULL, NULL);
143
145 Context->OwnerHub = Acquire->Header.Hub;
146 Context->OwnerDevice = Acquire->Header.UsbDevice;
147 DPRINT("Address 0 owned by hub %p device %p\n", Context->OwnerHub, Context->OwnerDevice);
148
149 WdfRequestComplete(Request, STATUS_SUCCESS);
150}
151
152/* QUERY_USB_CAPABILITY */
153
154static
155VOID
156NTAPI
159 _Inout_ PUSHORT StreamCount)
160{
161 ULONG Override = Handle->m_VerifierStaticStreamCountOverride;
162 ULONG Count = *StreamCount;
163
164 if (Override == 0)
165 return;
166
167 if (Handle->m_GrantedStreams != 0)
168 Count = min(Handle->m_GrantedStreams, (ULONG)*StreamCount);
169 else if (Override == MAXULONG)
170 Count = UcxRandomInRange(*StreamCount);
171 else if (Override < *StreamCount)
172 Count = Override;
173
174 *StreamCount = (USHORT)Count;
175}
176
177static
179NTAPI
183 _Out_writes_bytes_opt_(Query->OutputBufferLength) PVOID OutputBuffer)
184{
186 BOOLEAN IsChainedMdl;
187 BOOLEAN IsStreams;
189
190 if (Query->Size != sizeof(*Query) ||
192 Query->UsbdHandle == NULL)
193 {
194 DPRINT1("Capability query %p malformed, size %u version %u\n", Query, Query->Size, Query->Version);
196 }
197
198 Handle = (UcxUsbdHandle*)Query->UsbdHandle;
199 Query->ResultLength = 0;
200
201 if ((Query->OutputBufferLength != 0) != (OutputBuffer != NULL))
202 {
203 DPRINT1("Capability query %p length %lu does not match buffer %p\n",
204 Query, Query->OutputBufferLength, OutputBuffer);
206 }
207
208 IsChainedMdl = IsEqualGUID(Query->CapabilityType, GUID_USB_CAPABILITY_CHAINED_MDLS);
209 IsStreams = IsEqualGUID(Query->CapabilityType, GUID_USB_CAPABILITY_STATIC_STREAMS);
210
211 if (IsChainedMdl)
212 {
213 if (OutputBuffer != NULL)
214 {
215 DPRINT1("Chained MDL query %p must not have a buffer\n", Query);
217 }
218
219 if (!Handle->m_ChainedMdlGranted &&
220 UcxVerifierWantsFailure(Handle->m_VerifierFailChainedMdl))
221 {
223 DPRINT1("Verifier fails chained MDL query %p with 0x%lx\n", Query, Status);
224 return Status;
225 }
226 }
227 else if (IsEqualGUID(Query->CapabilityType, GUID_USB_CAPABILITY_SELECTIVE_SUSPEND))
228 {
229 if (OutputBuffer != NULL)
230 {
231 DPRINT1("Selective suspend query %p must not have a buffer\n", Query);
233 }
234 }
235 else if (IsEqualGUID(Query->CapabilityType, GUID_USB_CAPABILITY_HIGH_BANDWIDTH_ISOCH))
236 {
237 if (Query->OutputBufferLength != sizeof(ULONG))
238 {
239 DPRINT1("High bandwidth isoch query %p bad length %lu\n", Query, Query->OutputBufferLength);
241 }
242 }
243 else if (IsStreams)
244 {
245 if (Query->OutputBufferLength != sizeof(USHORT))
246 {
247 DPRINT1("Static streams query %p bad length %lu\n", Query, Query->OutputBufferLength);
249 }
250
251 if (UcxVerifierWantsFailure(Handle->m_VerifierFailStaticStreamSupport))
252 {
254 DPRINT1("Verifier fails static streams query %p with 0x%lx\n", Query, Status);
255 return Status;
256 }
257 }
258 else
259 {
260 DPRINT("Capability query %p has unknown type %08lx\n", Query, Query->CapabilityType.Data1);
261 }
262
263 /* Unknown capabilities still go to the HCD, which decides */
264 if (Controller->m_Config.EvtControllerQueryUsbCapability == NULL)
265 {
266 DPRINT1("Controller %p has no capability query callback\n", Controller);
268 }
269
270 Status = Controller->m_Config.EvtControllerQueryUsbCapability(Controller->m_Handle,
271 &Query->CapabilityType,
272 Query->OutputBufferLength,
274 &Query->ResultLength);
275 if (!NT_SUCCESS(Status))
276 {
277 /* An unsupported capability is a normal answer, not a failure */
279 DPRINT("Controller %p capability %p not supported\n", Controller, Query);
280 else
281 DPRINT1("Controller %p capability query %p failed 0x%lx\n", Controller, Query, Status);
282 return Status;
283 }
284
285 if (IsStreams)
286 {
288 Handle->m_StreamsGranted = TRUE;
289 Handle->m_GrantedStreams = *(PUSHORT)OutputBuffer;
290 DPRINT("Granted %u static streams to handle %p\n", *(PUSHORT)OutputBuffer, Handle);
291 }
292 else if (IsChainedMdl)
293 {
294 Handle->m_ChainedMdlGranted = TRUE;
295 }
296
297 return Status;
298}
299
300/* Dump support for crash dump and hibernation on USB storage */
301
302static
303VOID
304NTAPI
307 _In_ WDFREQUEST Request)
308{
309 PFN_UCX_HCD_GET_DUMP_DATA GetDumpData = Controller->HcdGetDumpData();
311 PIRP Irp = WdfRequestWdmGetIrp(Request);
313
314 if (GetDumpData == NULL)
315 {
316 DPRINT1("Controller %p has no dump data callback\n", Controller);
317 WdfRequestComplete(Request, STATUS_NOT_SUPPORTED);
318 return;
319 }
320
321 DeviceInfo = (PUCXHUB_DUMP_DEVICE_INFO)Irp->AssociatedIrp.SystemBuffer;
322 Status = GetDumpData(Controller->m_Handle, DeviceInfo->Device, DeviceInfo, Irp->UserBuffer);
323 if (!NT_SUCCESS(Status))
324 DPRINT1("Controller %p get dump data failed 0x%lx\n", Controller, Status);
325
327}
328
329static
330VOID
331NTAPI
334 _In_ WDFREQUEST Request)
335{
336 PFN_UCX_HCD_FREE_DUMP_DATA FreeDumpData = Controller->HcdFreeDumpData();
337 PIRP Irp = WdfRequestWdmGetIrp(Request);
338
339 if (FreeDumpData == NULL)
340 {
341 DPRINT1("Controller %p has no free dump data callback\n", Controller);
342 WdfRequestComplete(Request, STATUS_NOT_SUPPORTED);
343 return;
344 }
345
346 FreeDumpData(Controller->m_Handle, Irp->AssociatedIrp.SystemBuffer);
347 WdfRequestComplete(Request, STATUS_SUCCESS);
348}
349
351static
352VOID
353NTAPI
356 _In_ WDFREQUEST Request,
358{
359 UcxRootHub* RootHub = Controller->m_RootHub;
360
361 if (!Controller->BlockReset())
362 {
363 DPRINT1("Controller %p unavailable, failing root hub IOCTL 0x%lx\n", Controller, IoControlCode);
364 WdfRequestComplete(Request, STATUS_NO_SUCH_DEVICE);
365 return;
366 }
367
368 switch (IoControlCode)
369 {
372 break;
373
375 RootHub->m_Config.EvtRootHubGet20PortInfo(RootHub->m_Handle, Request);
376 break;
377
378 default:
379 RootHub->m_Config.EvtRootHubGet30PortInfo(RootHub->m_Handle, Request);
380 break;
381 }
382
383 /* The HCD may still own the request; that does not need the reference */
384 Controller->UnblockReset();
385}
386
387VOID
388NTAPI
390 _In_ WDFQUEUE Queue,
391 _In_ WDFREQUEST Request,
393 _In_ size_t InputBufferLength,
395{
396 UcxController* Controller = UcxController::FromFdo(WdfIoQueueGetDevice(Queue));
401
404
405 DPRINT("Controller %p request %p IOCTL 0x%lx\n", Controller, Request, IoControlCode);
406
407 switch (IoControlCode)
408 {
413 break;
414
416 Device = UcxUsbDevice::FromHandle((UCXUSBDEVICE)Args.Arg2);
417 Device->RegisterComposite(Request);
418 break;
419
421 Device = UcxUsbDevice::FromHandle((UCXUSBDEVICE)Args.Arg2);
422 Device->UnregisterComposite(Request);
423 break;
424
426 Device = UcxUsbDevice::FromHandle((UCXUSBDEVICE)Args.Arg2);
427 Device->SetFunctionData(Request);
428 break;
429
431 Device = UcxUsbDevice::FromHandle((UCXUSBDEVICE)Args.Arg2);
432 Device->RequestRemoteWakeNotification(Request);
433 break;
434
438 Query,
439 WdfRequestWdmGetIrp(Request)->AssociatedIrp.SystemBuffer);
440 WdfRequestComplete(Request, Status);
441 break;
442
445 break;
446
449 break;
450
452 Status = Controller->EnableForwardProgress((PUCXHUB_FORWARD_PROGRESS_INFO)Args.Arg1);
453 WdfRequestComplete(Request, Status);
454 break;
455
456 default:
457 DPRINT1("Controller %p default queue got unexpected IOCTL 0x%lx\n", Controller, IoControlCode);
459 WdfRequestComplete(Request, STATUS_INVALID_DEVICE_REQUEST);
460 break;
461 }
462}
463
464/* A remote wake request can pend forever, so it must never take the reserved request */
466NTAPI
468 _In_ WDFQUEUE Queue,
469 _In_ PIRP Irp)
470{
472
475 {
476 DPRINT1("No reserved request for remote wake IRP %p\n", Irp);
478 }
479
481}
482
483/* Only synchronizes cancellation of the one parked abort IRP per endpoint */
484
485VOID
486NTAPI
489 _In_ PIRP Irp)
490{
493}
494
495VOID
496NTAPI
499 _In_ PIRP Irp)
500{
503}
504
505PIRP
506NTAPI
511{
515
517 return NULL;
518}
519
521VOID
522NTAPI
526{
528
529 KeAcquireSpinLock(&Controller->m_AbortPipeCsqLock, Irql);
530}
531
532VOID
533NTAPI
537{
539
540 KeReleaseSpinLock(&Controller->m_AbortPipeCsqLock, Irql);
541}
542
543VOID
544NTAPI
547 _In_ PIRP Irp)
548{
550
552
553 DPRINT("Abort pipe IRP %p canceled\n", Irp);
554
555 /* The mixed status pair is what USBPORT reported */
557}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
char ** Args
Definition: acdebug.h:353
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 Handler
Definition: acpixf.h:672
unsigned char BOOLEAN
Definition: actypes.h:127
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
static UcxController * FromFdo(_In_ WDFDEVICE Fdo)
Definition: hostctl.cpp:21
WDFQUEUE m_DeviceMgmtQueue
Definition: hostctl.h:294
WDFQUEUE m_TreePurgeQueue
Definition: hostctl.h:295
UCX_CONTROLLER_CONFIG m_Config
Definition: hostctl.h:289
WDFQUEUE m_Address0Queue
Definition: hostctl.h:293
WDFQUEUE m_DefaultQueue
Definition: hostctl.h:297
WDFQUEUE m_PendDuringResetQueue
Definition: hostctl.h:296
NTSTATUS CreateQueues()
Definition: hostqueues.cpp:58
VOID NTAPI UcxCompleteUrbAtDispatch(_In_ PIRP Irp, _In_ PURB Urb, _In_ NTSTATUS Status, _In_ USBD_STATUS UsbdStatus)
Definition: clientxrb.cpp:42
_In_opt_ PIRP _In_opt_ PVOID PeekContext
Definition: csq.h:160
_Out_ PKIRQL Irql
Definition: csq.h:179
IO_CSQ Csq
Definition: csqrtns.c:46
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtTreePurgeIoInternalDeviceControl
Definition: devobj.h:362
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtDeviceMgmtIoInternalDeviceControl
Definition: devobj.h:361
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtPendDuringResetIoInternalDeviceControl
Definition: devobj.h:363
_In_ ULONG Attributes
Definition: dispmprt.h:1077
_In_ HANDLE _In_ CONST PDXGKMDT_OPM_GET_INFO_PARAMETERS Parameters
Definition: dispmprt.h:321
#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_raises_(irql)
Definition: driverspecs.h:228
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
KIRQL * PKIRQL
Definition: env_spec_w32.h:592
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
_Must_inspect_result_ _In_ FLT_CONTEXT_TYPE ContextType
Definition: fltkernel.h:1443
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h:24
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtDefaultIoInternalDeviceControl
Definition: hostctl.h:398
IO_CSQ_REMOVE_IRP UcxCsqRemoveAbortIrp
Definition: hostctl.h:403
IO_CSQ_COMPLETE_CANCELED_IRP UcxCsqCompleteCanceledAbortIrp
Definition: hostctl.h:407
IO_CSQ_INSERT_IRP UcxCsqInsertAbortIrp
Definition: hostctl.h:402
IO_CSQ_RELEASE_LOCK UcxCsqReleaseAbortLock
Definition: hostctl.h:406
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL UcxEvtAddress0IoInternalDeviceControl
Definition: hostctl.h:397
IO_CSQ_PEEK_NEXT_IRP UcxCsqPeekAbortIrp
Definition: hostctl.h:404
EVT_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS UcxEvtDefaultQueueExamineIrp
Definition: hostctl.h:399
IO_CSQ_ACQUIRE_LOCK UcxCsqAcquireAbortLock
Definition: hostctl.h:405
static VOID NTAPI UcxDispatchGetDumpData(_In_ UcxController *Controller, _In_ WDFREQUEST Request)
Definition: hostqueues.cpp:305
static VOID NTAPI UcxDispatchRootHubQuery(_In_ UcxController *Controller, _In_ WDFREQUEST Request, _In_ ULONG IoControlCode)
Definition: hostqueues.cpp:354
static NTSTATUS NTAPI UcxCreateControllerQueue(_In_ UcxController *Controller, _In_ WDF_IO_QUEUE_DISPATCH_TYPE Dispatch, _In_ ULONG PresentedRequests, _In_opt_ PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL Handler, _In_opt_ PCWDF_OBJECT_CONTEXT_TYPE_INFO ContextType, _In_opt_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy, _Out_ WDFQUEUE *Queue)
Definition: hostqueues.cpp:17
static VOID NTAPI UcxApplyStreamCountOverride(_In_ UcxUsbdHandle *Handle, _Inout_ PUSHORT StreamCount)
Definition: hostqueues.cpp:157
static NTSTATUS NTAPI UcxQueryUsbCapability(_In_ UcxController *Controller, _Inout_ PUCXHUB_QUERY_CAPABILITY Query, _Out_writes_bytes_opt_(Query->OutputBufferLength) PVOID OutputBuffer)
Definition: hostqueues.cpp:180
static VOID NTAPI UcxDispatchFreeDumpData(_In_ UcxController *Controller, _In_ WDFREQUEST Request)
Definition: hostqueues.cpp:332
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
#define IOCTL_UCXHUB_ROOTHUB_GET_20PORT_INFO
Definition: hubucx.h:51
#define IOCTL_UCXHUB_ROOTHUB_GET_30PORT_INFO
Definition: hubucx.h:52
#define IOCTL_UCXHUB_ADDRESS0_OWNERSHIP_ACQUIRE
Definition: hubucx.h:49
#define IOCTL_UCXHUB_FREE_DUMP_DATA
Definition: hubucx.h:74
#define UCXHUB_QUERY_CAPABILITY_VERSION
Definition: hubucx.h:156
#define IOCTL_UCXHUB_ROOTHUB_GET_INFO
Definition: hubucx.h:50
struct _UCXHUB_DUMP_DEVICE_INFO * PUCXHUB_DUMP_DEVICE_INFO
struct _UCXHUB_QUERY_CAPABILITY * PUCXHUB_QUERY_CAPABILITY
#define IOCTL_UCXHUB_QUERY_USB_CAPABILITY
Definition: hubucx.h:65
#define IOCTL_UCXHUB_SET_FUNCTION_HANDLE_DATA
Definition: hubucx.h:66
#define IOCTL_UCXHUB_GET_DUMP_DATA
Definition: hubucx.h:72
#define IOCTL_UCXHUB_NOTIFY_FORWARD_PROGRESS
Definition: hubucx.h:69
_In_ const GUID _In_ ULONG _In_opt_ PFN_WDF_WMI_INSTANCE_QUERY_INSTANCE Query
Definition: hubwmi.cpp:114
_In_ PIRP Irp
Definition: kse.h:79
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
if(dx< 0)
Definition: linetemp.h:194
#define min(a, b)
Definition: monoChain.cc:55
#define _Inout_
Definition: no_sal2.h:162
#define _Out_writes_bytes_opt_(s)
Definition: no_sal2.h:228
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
unsigned short USHORT
Definition: pedump.c:61
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
PVOID Arg1
Definition: ucxutil.h:103
Definition: csq.h:222
struct _IO_STACK_LOCATION::@5100::@5139 Others
union _IO_STACK_LOCATION::@1823 Parameters
struct _IO_STACK_LOCATION::@1823::@1824 DeviceIoControl
ULONG NumberOfPresentedDeviceMgmtEvtCallbacks
Definition: usb.h:565
#define MAXULONG
Definition: typedefs.h:251
#define NTAPI
Definition: typedefs.h:36
uint16_t * PUSHORT
Definition: typedefs.h:56
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXCONTROLLER * Controller
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
_In_ PGUID _In_ ULONG OutputBufferLength
Definition: ucxcontroller.h:81
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_Must_inspect_result_ _In_ UCXCONTROLLER _In_ PUCX_ROOTHUB_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ UCXROOTHUB * RootHub
Definition: ucxroothub.h:299
struct _ADDRESS0_OWNERSHIP_ACQUIRE * PADDRESS0_OWNERSHIP_ACQUIRE
BOOLEAN NTAPI UcxVerifierWantsFailure(_In_ ULONG Setting)
Definition: ucxutil.cpp:71
NTSTATUS NTAPI UcxRandomErrorStatus(VOID)
Definition: ucxutil.cpp:93
ULONG NTAPI UcxRandomInRange(_In_ ULONG Max)
Definition: ucxutil.cpp:85
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
#define USBD_STATUS_DEVICE_GONE
Definition: usb.h:222
struct _URB * PURB
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
Definition: usbdlib.h:333
#define IOCTL_INTERNAL_USB_REGISTER_COMPOSITE_DEVICE
Definition: usbioctl.h:760
#define IOCTL_INTERNAL_USB_REQUEST_REMOTE_WAKE_NOTIFICATION
Definition: usbioctl.h:766
#define IOCTL_INTERNAL_USB_UNREGISTER_COMPOSITE_DEVICE
Definition: usbioctl.h:763
USHORT Count
Definition: userreq.cpp:200
WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, ActualLength)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
Definition: wdfdevice.h:2231
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY Policy
Definition: wdfinterrupt.h:653
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL * PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL
Definition: wdfio.h:348
@ WdfIoForwardProgressActionUseReservedRequest
Definition: wdfio.h:462
@ WdfIoForwardProgressActionFailRequest
Definition: wdfio.h:461
FORCEINLINE VOID WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_EXAMINE_INIT(_Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy, _In_ ULONG TotalForwardProgressRequests, _In_ PFN_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS EvtIoWdmIrpForForwardProgress)
Definition: wdfio.h:571
FORCEINLINE VOID WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_DEFAULT_INIT(_Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy, _In_ ULONG TotalForwardProgressRequests)
Definition: wdfio.h:556
FORCEINLINE VOID WDF_IO_QUEUE_CONFIG_INIT(_Out_ PWDF_IO_QUEUE_CONFIG Config, _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)
Definition: wdfio.h:426
@ WdfIoQueueDispatchSequential
Definition: wdfio.h:78
@ WdfIoQueueDispatchParallel
Definition: wdfio.h:79
enum _WDF_IO_FORWARD_PROGRESS_ACTION WDF_IO_FORWARD_PROGRESS_ACTION
WDF_EXTERN_C_START enum _WDF_IO_QUEUE_DISPATCH_TYPE WDF_IO_QUEUE_DISPATCH_TYPE
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
Definition: wdfobject.h:147
#define WDF_GET_CONTEXT_TYPE_INFO(_contexttype)
Definition: wdfobject.h:238
@ WdfFalse
Definition: wdftypes.h:87
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH * Dispatch
Definition: wsk.h:188
#define NT_ASSERT
Definition: rtlfuncs.h:3334