10#define USBDEX_HANDLE_SIGNATURE 'DBSU'
13#define USBDEX_MODE_UCX USBD_INTERFACE_VERSION_602
14#define USBDEX_MODE_LEGACY USBD_INTERFACE_VERSION_600
15#define USBDEX_MODE_NONE 0xFFFFFFFF
18#define USBDEX_NONPAGED_POOL_NX ((POOL_TYPE)0x200)
20#define USBDEX_PIPE_MAX_TRANSFER_DEFAULT 0xFFFFFFFF
21#define USBDEX_SELECT_INTERFACE_MAX_PIPES 32
22#define USBDEX_COMPOSITE_VERSION 0x0100
160 Stack->Parameters.QueryInterface.InterfaceSpecificData =
NULL;
184 Stack->MinorFunction = 0;
225 static const WCHAR DriverPrefix[] =
L"\\Driver\\";
226 static const WCHAR ParametersSuffix[] =
L"\\Parameters";
227 const SIZE_T PrefixBytes =
sizeof(DriverPrefix) -
sizeof(
WCHAR);
233 if (DriverName->
Length <= PrefixBytes)
239 ServiceBytes = DriverName->
Length - PrefixBytes;
240 PathBytes = ServiceBytes +
sizeof(ParametersSuffix);
262 L"UsbVerifierEnabled",
263 L"UsbVerifierFailRegistration",
264 L"UsbVerifierFailChainedMdlSupport",
265 L"UsbVerifierFailStaticStreamSupport",
266 L"UsbVerifierStaticStreamCountOverride",
267 L"UsbVerifierFailEnableStaticStreams",
272 &
Client->VerifierFailRegistration,
273 &
Client->VerifierFailChainedMdlSupport,
274 &
Client->VerifierFailStaticStreamSupport,
275 &
Client->VerifierStaticStreamCountOverride,
276 &
Client->VerifierFailEnableStaticStreams,
325 BusInterface.
Size =
sizeof(BusInterface);
329 Handle->TargetDeviceObject,
330 &USB_BUS_INTERFACE_USBDI_GUID,
350 if (
Handle->CloseRequested ||
Handle->ReferenceCount < 1)
366 if (!
Handle->CloseRequested)
369 if (
Handle->Client.Unregister)
383 if (!
Handle || !ArgumentsValid)
486 PipeCount =
Entry->InterfaceDescriptor->bNumEndpoints;
495 Entry->InterfaceDescriptor,
582 PWSTR ParametersPath;
630 Handle->ReferenceCount = 1;
634 &GUID_USBD_CLIENT_INTERFACE,
644 Handle->Client.AllocSelectInterfaceUrb =
NULL;
721 Handle->TargetDeviceObject,
745 if (
Handle->Client.AllocUrb)
778 if (
Handle->Client.AllocIsochUrb)
802USBD_SelectConfigUrbAllocateAndBuild(
815 if (
Handle->Client.AllocSelectConfigUrb)
834USBD_SelectInterfaceUrbAllocateAndBuild(
849 if (
Handle->Client.AllocSelectInterfaceUrb)
876 if (
Handle->Client.ReleaseUrb)
904USBD_IsInterfaceVersionSupported(
914USBD_BuildRegisterCompositeDevice(
#define InterlockedIncrement
#define InterlockedDecrement
D3D12_VIDEO_MOTION_ESTIMATOR_SEARCH_BLOCK_SIZE BlockSize
#define STATUS_NOT_SUPPORTED
#define STATUS_NOT_IMPLEMENTED
#define NT_SUCCESS(StatCode)
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
#define __drv_freesMem(kind)
#define _IRQL_requires_max_(irql)
#define _IRQL_requires_(irql)
LOGICAL NTAPI MmIsDriverVerifying(IN PDRIVER_OBJECT DriverObject)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define KeGetCurrentIrql()
IN OUT PVCB IN PDEVICE_OBJECT TargetDeviceObject
_In_ GUID _In_ PVOID ValueData
#define UCXHUB_QUERY_CAPABILITY_VERSION
#define IOCTL_UCXHUB_QUERY_USB_CAPABILITY
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
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)
#define RtlEqualMemory(dst, src, len)
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define ExFreePoolWithTag(_P, _T)
PVOID PVOID PWCHAR PVOID Environment
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE ConfigurationHandle
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
#define _Outptr_result_bytebuffer_(s)
#define _Deref_out_range_(l, h)
#define _Must_inspect_result_
#define _In_reads_opt_(s)
#define _Out_writes_bytes_to_opt_(s, c)
#define _Out_writes_bytes_(s)
#define _In_reads_bytes_opt_(s)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RTL_REGISTRY_SERVICES
#define UNREFERENCED_PARAMETER(P)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
VOID NTAPI IoFreeIrp(IN PIRP Irp)
#define STATUS_INTERNAL_ERROR
#define STATUS_INVALID_LEVEL
#define IsEqualGUID(rguid1, rguid2)
#define STATUS_MORE_PROCESSING_REQUIRED
struct _IO_STACK_LOCATION::@5136::@5175 Others
union _IO_STACK_LOCATION::@1823 Parameters
struct _URB_SELECT_CONFIGURATION UrbSelectConfiguration
struct _URB_SELECT_INTERFACE UrbSelectInterface
PDEVICE_OBJECT TargetDeviceObject
volatile LONG ReferenceCount
USBD_CLIENT_INTERFACE Client
PINTERFACE_DEREFERENCE InterfaceDereference
PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED IsDeviceHighSpeed
PVOID NTAPI MmGetSystemRoutineAddress(IN PUNICODE_STRING SystemRoutineName)
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
_In_ PGUID _In_ ULONG _Out_ PULONG ResultLength
_In_ PGUID CapabilityType
_In_ PGUID _In_ ULONG OutputBufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_In_ UCXUSBDEVICE _In_ ULONG Interface
#define STATUS_INVALID_PARAMETER
#define STATUS_INVALID_DEVICE_STATE
#define STATUS_INSUFFICIENT_RESOURCES
struct _USBD_INTERFACE_INFORMATION * PUSBD_INTERFACE_INFORMATION
#define URB_FUNCTION_SELECT_INTERFACE
struct _USBD_ISO_PACKET_DESCRIPTOR USBD_ISO_PACKET_DESCRIPTOR
#define URB_FUNCTION_SELECT_CONFIGURATION
#define USB_BUSIF_USBDI_VERSION_1
#define USBD_CLIENT_INTERFACE_VERSION
static PURB UsbdexAllocatePoolUrb(_In_ PUSBDEX_HANDLE_OBJECT Handle, _In_ SIZE_T Size)
struct _USBDEX_HANDLE_OBJECT USBDEX_HANDLE_OBJECT
static BOOLEAN UsbdexPoolTypeKnown
static VOID UsbdexDereferenceHandle(_Inout_ PUSBDEX_HANDLE_OBJECT Handle)
static VOID UsbdexDetectPoolType(VOID)
static RTL_QUERY_REGISTRY_ROUTINE UsbdexVerifierValueCallback
NTSTATUS(NTAPI * PFN_USBDEX_QUERY_REGISTRY)(_In_ ULONG RelativeTo, _In_ PCWSTR Path, _Inout_ PRTL_QUERY_REGISTRY_TABLE QueryTable, _In_opt_ PVOID Context, _In_opt_ PVOID Environment)
static VOID UsbdexInitInterfaceInformation(_Out_ PUSBD_INTERFACE_INFORMATION Information, _In_ PUSB_INTERFACE_DESCRIPTOR Descriptor, _In_ UCHAR PipeCount)
static NTSTATUS UsbdexBuildSelectInterfaceUrb(_In_ PUSBDEX_HANDLE_OBJECT Handle, _In_ USBD_CONFIGURATION_HANDLE ConfigurationHandle, _Inout_ PUSBD_INTERFACE_LIST_ENTRY InterfaceListEntry, _Out_ PURB *Urb)
#define USBDEX_COMPOSITE_VERSION
static NTSTATUS UsbdexFinishAllocation(_Inout_ PUSBDEX_HANDLE_OBJECT Handle, _In_ NTSTATUS Status, _Inout_ PURB *Urb)
#define USBDEX_MODE_LEGACY
#define USBDEX_PIPE_MAX_TRANSFER_DEFAULT
#define USBDEX_SELECT_INTERFACE_MAX_PIPES
static ULONG UsbdexProbeLegacyStack(_Inout_ PUSBDEX_HANDLE_OBJECT Handle)
static VOID UsbdexReadVerifierSettings(_In_ PDRIVER_OBJECT DriverObject, _In_z_ PCWSTR ParametersPath, _In_ ULONG PoolTag, _Inout_ PUSBD_CLIENT_INTERFACE Client)
static NTSTATUS UsbdexSendCapabilityRequest(_In_ PDEVICE_OBJECT ClientDevice, _In_ PDEVICE_OBJECT Target, _Inout_ PUCXHUB_QUERY_CAPABILITY Request, _Out_opt_ PVOID OutputBuffer)
static NTSTATUS UsbdexQueryInterface(_In_ PDEVICE_OBJECT ClientDevice, _In_ PDEVICE_OBJECT Target, _In_ const GUID *InterfaceType, _Inout_ PINTERFACE Interface)
static IO_COMPLETION_ROUTINE UsbdexSyncCompletion
FORCEINLINE BOOLEAN UsbdexIsUcxMode(_In_ PUSBDEX_HANDLE_OBJECT Handle)
struct _USBDEX_HANDLE_OBJECT * PUSBDEX_HANDLE_OBJECT
static NTSTATUS UsbdexBuildSelectConfigUrb(_In_ PUSBDEX_HANDLE_OBJECT Handle, _In_opt_ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, _Inout_ PUSBD_INTERFACE_LIST_ENTRY InterfaceList, _Out_ PURB *Urb)
static NTSTATUS UsbdexStartAllocation(_In_opt_ PUSBDEX_HANDLE_OBJECT Handle, _In_ BOOLEAN ArgumentsValid, _Out_opt_ PURB *Urb)
#define USBDEX_HANDLE_SIGNATURE
static NTSTATUS UsbdexReferenceHandle(_Inout_ PUSBDEX_HANDLE_OBJECT Handle)
#define USBDEX_NONPAGED_POOL_NX
static NTSTATUS UsbdexLegacyCapability(_In_ PUSBDEX_HANDLE_OBJECT Handle, _In_ const GUID *CapabilityType, _In_opt_ PUCHAR OutputBuffer)
static PWSTR UsbdexBuildParametersPath(_In_ PDRIVER_OBJECT DriverObject, _In_ ULONG PoolTag)
static NTSTATUS UsbdexCallAndWait(_In_ PDEVICE_OBJECT ClientDevice, _In_ PDEVICE_OBJECT Target, _In_ __drv_freesMem(Mem) PIRP Irp)
static POOL_TYPE UsbdexPoolType
FORCEINLINE PUSBDEX_HANDLE_OBJECT UsbdexHandleObject(_In_opt_ USBD_HANDLE USBDHandle)
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
_Must_inspect_result_ _In_ PDEVICE_OBJECT _In_ ULONG _In_ ULONG _Out_ USBD_HANDLE * USBDHandle
#define GET_USBD_INTERFACE_SIZE(numEndpoints)
_In_ COMPOSITE_DEVICE_CAPABILITIES _In_ ULONG FunctionCount
_In_ ULONG USBDInterfaceVersion
_In_ COMPOSITE_DEVICE_CAPABILITIES CapabilityFlags
_Must_inspect_result_ _In_ PDEVICE_OBJECT _In_ ULONG USBDClientContractVersion
#define USBD_CLIENT_CONTRACT_VERSION_602
_In_ PUSBD_INTERFACE_LIST_ENTRY InterfaceList
_In_ USBD_CONFIGURATION_HANDLE _Inout_ PUSBD_INTERFACE_LIST_ENTRY InterfaceListEntry
_In_ COMPOSITE_DEVICE_CAPABILITIES _In_ ULONG _Out_ PREGISTER_COMPOSITE_DEVICE RegisterCompositeDevice
_In_ PIO_STACK_LOCATION IoStackLocation
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
NTSTATUS USBD_QueryUsbCapability(_In_ USBD_HANDLE USBDHandle, _In_ const GUID *CapabilityType, _In_ ULONG OutputBufferLength, _When_(OutputBufferLength==0, _Pre_null_) _When_(OutputBufferLength !=0 &&ResultLength==NULL, _Out_writes_bytes_(OutputBufferLength)) _When_(OutputBufferLength !=0 &&ResultLength !=NULL, _Out_writes_bytes_to_opt_(OutputBufferLength, *ResultLength)) PUCHAR OutputBuffer, _Out_opt_ _When_(ResultLength !=NULL, _Deref_out_range_(<=, OutputBufferLength)) PULONG ResultLength)
NTSTATUS USBD_UrbAllocate(_In_ USBD_HANDLE USBDHandle, _Outptr_result_bytebuffer_(sizeof(URB)) PURB *Urb)
NTSTATUS USBD_IsochUrbAllocate(_In_ USBD_HANDLE USBDHandle, _In_ ULONG NumberOfIsochPacket, _Outptr_result_bytebuffer_(sizeof(struct _URB_ISOCH_TRANSFER)+(NumberOfIsochPackets *sizeof(USBD_ISO_PACKET_DESCRIPTOR)) - sizeof(USBD_ISO_PACKET_DESCRIPTOR)) PURB *Urb)
NTSTATUS USBD_CreateHandle(_In_ PDEVICE_OBJECT DeviceObject, _In_ PDEVICE_OBJECT TargetDeviceObject, _In_ ULONG USBDClientContractVersion, _In_ ULONG PoolTag, _Out_ USBD_HANDLE *USBDHandle)
VOID USBD_CloseHandle(_In_ USBD_HANDLE USBDHandle)
VOID USBD_AssignUrbToIoStackLocation(_In_ USBD_HANDLE USBDHandle, _In_ PIO_STACK_LOCATION IoStackLocation, _In_ PURB Urb)
VOID USBD_UrbFree(_In_ USBD_HANDLE USBDHandle, _In_ PURB Urb)
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID InterfaceType
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG PoolTag
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ ULONG NumberOfIsochPackets
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IRP_MN_QUERY_INTERFACE
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
RtlInitUnicodeString & RoutineName