89 Urb->UrbHeader.UsbdFlags &= ~UCX_URB_FLAG_BUFFER_LOCKED;
141 Urb->UrbHeader.UsbdFlags &= ~UCX_URB_FLAG_BUFFER_LOCKED;
165#define UCX_URB_TRANSFER 0x01
166#define UCX_URB_DEFAULT_PIPE 0x02
167#define UCX_URB_NO_DATA 0x04
168#define UCX_URB_PIPE_REQUEST 0x08
173#define UCX_DIR_CLIENT 2
186#define UCX_RT_STANDARD 0
187#define UCX_RT_CLASS 1
188#define UCX_RT_VENDOR 2
190#define UCX_TO_DEVICE 0
191#define UCX_TO_INTERFACE 1
192#define UCX_TO_ENDPOINT 2
193#define UCX_TO_OTHER 3
195#define UCX_PIPE_REQUEST_SIZE sizeof(struct _URB_PIPE_REQUEST)
196#define UCX_DESCRIPTOR_SIZE sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST)
197#define UCX_FEATURE_SIZE sizeof(struct _URB_CONTROL_FEATURE_REQUEST)
198#define UCX_STATUS_SIZE sizeof(struct _URB_CONTROL_GET_STATUS_REQUEST)
199#define UCX_VENDOR_SIZE sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST)
201#define UCX_STD_TRANSFER (UCX_URB_TRANSFER | UCX_URB_DEFAULT_PIPE)
202#define UCX_STD_NO_DATA (UCX_URB_TRANSFER | UCX_URB_DEFAULT_PIPE | UCX_URB_NO_DATA)
204#define UCX_UNSUPPORTED(Length) { UcxUrbHandler::NotSupported, (USHORT)(Length), 0, 0, 0, 0, 0 }
205#define UCX_INVALID { UcxUrbHandler::InvalidFunction, 0, 0, 0, 0, 0, 0 }
206#define UCX_DESCRIPTOR(Dir, To, Req) { UcxUrbHandler::GetSetDescriptor, UCX_DESCRIPTOR_SIZE, UCX_STD_TRANSFER, Dir, UCX_RT_STANDARD, To, Req }
207#define UCX_FEATURE(To, Req) { UcxUrbHandler::SetClearFeature, UCX_FEATURE_SIZE, UCX_STD_NO_DATA, UCX_DIR_OUT, UCX_RT_STANDARD, To, Req }
208#define UCX_STATUS(To) { UcxUrbHandler::GetStatus, UCX_STATUS_SIZE, UCX_STD_TRANSFER, UCX_DIR_IN, UCX_RT_STANDARD, To, USB_REQUEST_GET_STATUS }
209#define UCX_VENDOR_CLASS(Type, To) { UcxUrbHandler::VendorClass, UCX_VENDOR_SIZE, UCX_STD_TRANSFER, UCX_DIR_CLIENT, Type, To, 0 }
265 { UcxUrbHandler::ControlTransfer,
sizeof(
struct _URB_CONTROL_TRANSFER_EX),
UCX_URB_TRANSFER, 0, 0, 0, 0 },
281 _In_ WDFDEVICE RootHubPdo,
300 DPRINT(
"IoSetCompletionRoutineEx failed 0x%lx for IRP %p, using the plain routine\n",
Status,
Irp);
309 _In_ WDFDEVICE RootHubPdo,
324 _In_ WDFDEVICE RootHubPdo,
366 if (
Device->m_StalePipeIoAllowed)
438 return Urb->UrbControlTransfer.SetupPacket;
469 return (
USHORT)(Where[0] | (Where[1] << 8));
477 _In_ WDFDEVICE RootHubPdo,
493 _In_ WDFDEVICE RootHubPdo,
507 case UcxUrbHandler::GetSetDescriptor:
512 case UcxUrbHandler::SetClearFeature:
513 Urb->UrbControlTransfer.TransferBufferLength = 0;
518 case UcxUrbHandler::GetStatus:
519 case UcxUrbHandler::GetInterface:
525 case UcxUrbHandler::GetConfiguration:
533 case UcxUrbHandler::VendorClass:
541 case UcxUrbHandler::MsFeatureDescriptor:
550 if (
Function->Handler != UcxUrbHandler::VendorClass)
555 *
Flags &= ~USBD_TRANSFER_DIRECTION_IN;
575 _In_ WDFDEVICE RootHubPdo,
590 if (
Pipe->IsochPeriodMicroframes > 8)
592 DPRINT1(
"Isoch URB %p on pipe %p has period %lu microframes\n",
Urb,
Pipe,
Pipe->IsochPeriodMicroframes);
593 Isoch->StartFrame = 0;
598 if (Packets != 0 && (Packets *
Pipe->IsochPeriodMicroframes) % 8 != 0)
600 DPRINT1(
"Isoch URB %p: %lu packets do not fill whole frames\n",
Urb, Packets);
601 Isoch->StartFrame = 0;
605 if (Packets == 0 || Packets >
Pipe->IsochPacketLimit)
607 DPRINT1(
"Isoch URB %p has bad packet count %lu, max %lu\n",
Urb, Packets,
Pipe->IsochPacketLimit);
627 Status =
Device->m_Controller->GetCurrentFrameNumber(&Frame);
630 DPRINT1(
"Getting the current frame for URB %p failed 0x%lx\n",
Urb,
Status);
634 Urb->UrbGetCurrentFrameNumber.FrameNumber = Frame;
650 switch (
Urb->UrbHeader.Function)
653 case URB_FUNCTION_CONTROL_TRANSFER_EX:
654 if (
Pipe->TransferType != UcxTransferType::Control)
661 if (
Pipe->TransferType != UcxTransferType::Bulk &&
Pipe->TransferType != UcxTransferType::Interrupt)
668 if (
Pipe->TransferType != UcxTransferType::Isochronous)
708 if (Transfer->
UrbLink !=
NULL &&
Code != URB_FUNCTION_CONTROL_TRANSFER_EX)
723 if (
Pipe->Kind == UcxEndpointKind::ZeroBandwidth)
737 if (
Pipe->TransferType == UcxTransferType::Control &&
748 Device->m_Controller->m_DriverVerifierEnabled)
761 _In_ WDFDEVICE RootHubPdo,
773 Code =
Urb->UrbHeader.Function;
791 if (
Urb->UrbHeader.UsbdDeviceHandle ==
NULL)
793 DPRINT1(
"URB %p function 0x%x has no device handle\n",
Urb,
Code);
797 Device = UcxUsbDevice::FromHandle((UCXUSBDEVICE)
Urb->UrbHeader.UsbdDeviceHandle);
799 if (
Device->m_Disconnected)
818 DPRINT1(
"Pipe URB %p function 0x%x has invalid pipe %p\n",
Urb,
Code,
Urb->UrbPipeRequest.PipeHandle);
825 if (
Pipe->Kind == UcxEndpointKind::ZeroBandwidth)
834 case UcxUrbHandler::NotSupported:
839 case UcxUrbHandler::InvalidFunction:
843 case UcxUrbHandler::AbortPipe:
846 case UcxUrbHandler::GetCurrentFrame:
849 case UcxUrbHandler::ControlTransfer:
853 case UcxUrbHandler::BulkOrInterrupt:
858 case UcxUrbHandler::Isoch:
885 Irp->IoStatus.Information = 0;
890 DPRINT(
"URB %p function 0x%x canceled before reaching the HCD\n",
Urb,
Urb->UrbHeader.Function);
893 Urb->UrbControlTransfer.TransferBufferLength = 0;
898 Urb->UrbIsochronousTransfer.IsoPacket[
Index].Status = 0xFFFFFFFF;
899 Urb->UrbIsochronousTransfer.ErrorCount = 0;
902 Device->m_TransferFailureCount++;
906 DPRINT(
"URB %p function 0x%x on device %p failed, USBD status 0x%lx\n",
908 Device->m_TransferFailureCount++;
909 Device->ReportNoPingResponseIfPending();
919 if (
Irp->PendingReturned)
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
DECLSPEC_NORETURN VOID NTAPI KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1, IN ULONG_PTR BugCheckParameter2, IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4)
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
BOOLEAN NTAPI UcxAnyUsbdHandleHasVerifier(_In_ UcxUsbDevice *Device)
NTSTATUS NTAPI UcxCompleteUrb(_In_ PIRP Irp, _In_ PURB Urb, _In_ NTSTATUS Status, _In_ USBD_STATUS UsbdStatus)
FORCEINLINE VOID NTAPI UcxXrbMarkInactive(_In_ PURB Urb)
FORCEINLINE BOOLEAN NTAPI UcxIsXrbIrp(_In_ PIRP Irp, _In_ PURB Urb)
#define STATUS_NOT_SUPPORTED
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
#define NT_SUCCESS(StatCode)
#define KeGetCurrentIrql()
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
#define UCXHUB_URB_FLAG_ALLOW_LARGE_TRANSFER
#define EXCEPTION_EXECUTE_HANDLER
NTSTATUS NTAPI IoSetCompletionRoutineEx(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_COMPLETION_ROUTINE CompletionRoutine, IN PVOID Context, IN BOOLEAN InvokeOnSuccess, IN BOOLEAN InvokeOnError, IN BOOLEAN InvokeOnCancel)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
BOOLEAN NTAPI KdRefreshDebuggerNotPresent(VOID)
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
#define _In_reads_bytes_(s)
#define _In_reads_opt_(s)
#define _Out_writes_bytes_(s)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define IoCopyCurrentIrpStackLocationToNext(Irp)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
static UcxPipe * FromHandle(_In_ USBD_PIPE_HANDLE Handle)
struct _LIST_ENTRY * Flink
USBD_PIPE_HANDLE PipeHandle
ULONG TransferBufferLength
#define CONTAINING_RECORD(address, type, field)
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
#define STATUS_INVALID_PARAMETER
#define STATUS_NO_SUCH_DEVICE
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
NTSTATUS NTAPI UcxUsbdStatusToNtStatus(_In_ USBD_STATUS UsbdStatus)
NTSTATUS NTAPI UcxProcessLegacyUrb(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PURB Urb)
static VOID NTAPI UcxSetCompletionOnNext(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PIO_COMPLETION_ROUTINE Completion, _In_ PVOID Context)
#define UCX_URB_PIPE_REQUEST
USBD_STATUS NTAPI UcxNtStatusToUsbdStatus(_In_ NTSTATUS Status)
NTSTATUS NTAPI UcxForwardIrpToQueue(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PIO_COMPLETION_ROUTINE Completion, _In_ PVOID Context, _In_ WDFQUEUE Queue)
#define UCX_URB_DEFAULT_PIPE
static USBD_STATUS NTAPI UcxPrepareTransfer(_In_ PURB Urb, _In_ UcxUsbDevice *Device, _In_ const UcxUrbFunction *Function, _Outptr_ UcxPipe **TargetPipe)
BOOLEAN NTAPI UcxValidatePipeHandle(_In_ UcxUsbDevice *Device, _In_ USBD_PIPE_HANDLE Handle)
static NTSTATUS NTAPI UcxForwardDefaultPipeRequest(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PURB Urb, _In_ WDFQUEUE Queue)
#define UCX_UNSUPPORTED(Length)
#define UCX_DESCRIPTOR_SIZE
VOID NTAPI UcxUnlockTransferBuffer(_Inout_ PURB Urb)
static NTSTATUS NTAPI UcxHandleStandardRequest(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PURB Urb, _In_ WDFQUEUE Queue, _In_ const UcxUrbFunction *Function)
static NTSTATUS NTAPI UcxHandleGetCurrentFrame(_In_ PIRP Irp, _In_ PURB Urb, _In_ UcxUsbDevice *Device)
static BOOLEAN NTAPI UcxChainedMdlMisaligned(_In_ PMDL Mdl, _In_ ULONG Length)
static NTSTATUS NTAPI UcxHandleIsoch(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PURB Urb, _In_ WDFQUEUE Queue, _In_ UcxPipe *Pipe)
NTSTATUS NTAPI UcxForwardIrpWithRequest(_In_ WDFDEVICE RootHubPdo, _In_ PIRP Irp, _In_ PIO_COMPLETION_ROUTINE Completion, _In_ PVOID Context, _In_ WDFQUEUE Queue, _In_ WDFREQUEST Request)
static IO_COMPLETION_ROUTINE UcxLegacyTransferCompletion
static VOID NTAPI UcxSetWord(_Out_writes_bytes_(2) PUCHAR Where, _In_ USHORT Value)
static USBD_STATUS NTAPI UcxCheckTransferAgainstPipe(_In_ PURB Urb, _In_ const UcxPipe *Pipe)
static USHORT NTAPI UcxGetWord(_In_reads_bytes_(2) const UCHAR *Where)
VOID NTAPI UcxLockTransferBuffer(_Inout_ PURB Urb)
static UCHAR NTAPI UcxRequestType(_In_ UCHAR Direction, _In_ UCHAR Type, _In_ UCHAR Recipient)
static const UcxUrbFunction UcxUrbFunctions[]
static PUCHAR NTAPI UcxSetupPacket(_In_ PURB Urb)
#define UCX_DESCRIPTOR(Dir, To, Req)
#define UCX_PIPE_REQUEST_SIZE
#define UCX_FEATURE(To, Req)
#define UCX_VENDOR_CLASS(Type, To)
FORCEINLINE VOID NTAPI UcxSetTransferDirection(_Inout_ PURB Urb, _In_ const UcxPipe *Pipe)
#define UCX_MAX_CONTROL_TRANSFER
FORCEINLINE VOID NTAPI UcxStampProcessorNumber(_Inout_ PURB Urb)
#define UCX_URB_FLAG_BUFFER_LOCKED
#define UCX_URB_FLAGS_KEEP_HUB_BITS
#define USB_REQUEST_GET_INTERFACE
#define USB_REQUEST_GET_CONFIGURATION
#define USB_REQUEST_GET_DESCRIPTOR
#define USB_REQUEST_SET_DESCRIPTOR
#define USB_REQUEST_SET_FEATURE
#define USB_REQUEST_CLEAR_FEATURE
#define USBD_STATUS_DEVICE_GONE
#define USBD_STATUS_INVALID_PIPE_HANDLE
#define USBD_STATUS_CANCELED
#define USBD_STATUS_SUCCESS
#define USBD_TRANSFER_DIRECTION_IN
#define URB_FUNCTION_CONTROL_TRANSFER
#define USBD_STATUS_NOT_SUPPORTED
#define USBD_STATUS_INSUFFICIENT_RESOURCES
#define USBD_STATUS_INVALID_PARAMETER
#define USBD_SHORT_TRANSFER_OK
#define USBD_STATUS_PORT_OPERATION_PENDING
#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
#define USBD_SUCCESS(Status)
#define USBD_STATUS_PENDING
#define USBD_DEFAULT_PIPE_TRANSFER
#define USBD_STATUS_INVALID_URB_FUNCTION
#define USBD_STATUS_BAD_START_FRAME
#define URB_FUNCTION_ISOCH_TRANSFER
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
@ WDF_DISPATCH_IRP_TO_IO_QUEUE_PREPROCESSED_IRP
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
_In_ PWDFDEVICE_INIT _In_ PWDF_REMOVE_LOCK_OPTIONS Options
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
_In_ WDFDEVICE _In_ PVOID _In_opt_ PMDL Mdl
WDF_EXTERN_C_START typedef _In_ WDFDEVICE _In_ WDFCONTEXT _In_ WDF_DMA_DIRECTION Direction
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
FORCEINLINE VOID WDF_REQUEST_FORWARD_OPTIONS_INIT(_Out_ PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions)
_In_ NTSTATUS _In_ USBD_STATUS UsbdStatus
NTSYSAPI void WINAPI DbgBreakPoint(void)
FORCEINLINE VOID IoSetNextIrpStackLocation(_Inout_ PIRP Irp)
#define STATUS_CONTINUE_COMPLETION
IO_COMPLETION_ROUTINE * PIO_COMPLETION_ROUTINE
enum _LOCK_OPERATION LOCK_OPERATION
#define MmGetMdlByteOffset(_Mdl)
#define MmGetMdlByteCount(_Mdl)