ReactOS 0.4.17-dev-1321-g5c122a9
usbdex.c File Reference
#include "usbdex.h"
Include dependency graph for usbdex.c:

Go to the source code of this file.

Classes

struct  _USBDEX_HANDLE_OBJECT
 

Macros

#define USBDEX_HANDLE_SIGNATURE   'DBSU'
 
#define USBDEX_MODE_UCX   USBD_INTERFACE_VERSION_602
 
#define USBDEX_MODE_LEGACY   USBD_INTERFACE_VERSION_600
 
#define USBDEX_MODE_NONE   0xFFFFFFFF
 
#define USBDEX_NONPAGED_POOL_NX   ((POOL_TYPE)0x200)
 
#define USBDEX_PIPE_MAX_TRANSFER_DEFAULT   0xFFFFFFFF
 
#define USBDEX_SELECT_INTERFACE_MAX_PIPES   32
 
#define USBDEX_COMPOSITE_VERSION   0x0100
 

Typedefs

typedef 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)
 
typedef struct _USBDEX_HANDLE_OBJECT USBDEX_HANDLE_OBJECT
 
typedef struct _USBDEX_HANDLE_OBJECT * PUSBDEX_HANDLE_OBJECT
 

Functions

FORCEINLINE PUSBDEX_HANDLE_OBJECT UsbdexHandleObject (_In_opt_ USBD_HANDLE USBDHandle)
 
FORCEINLINE BOOLEAN UsbdexIsUcxMode (_In_ PUSBDEX_HANDLE_OBJECT Handle)
 
static VOID UsbdexDetectPoolType (VOID)
 
static NTSTATUS NTAPI UsbdexSyncCompletion (_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_reads_opt_(_Inexpressible_("varies")) PVOID Context)
 
static NTSTATUS UsbdexCallAndWait (_In_ PDEVICE_OBJECT ClientDevice, _In_ PDEVICE_OBJECT Target, _In_ __drv_freesMem(Mem) PIRP Irp)
 
static NTSTATUS UsbdexQueryInterface (_In_ PDEVICE_OBJECT ClientDevice, _In_ PDEVICE_OBJECT Target, _In_ const GUID *InterfaceType, _Inout_ PINTERFACE Interface)
 
static NTSTATUS UsbdexSendCapabilityRequest (_In_ PDEVICE_OBJECT ClientDevice, _In_ PDEVICE_OBJECT Target, _Inout_ PUCXHUB_QUERY_CAPABILITY Request, _Out_opt_ PVOID OutputBuffer)
 
static NTSTATUS NTAPI UsbdexVerifierValueCallback (_In_z_ PWSTR ValueName, _In_ ULONG ValueType, _In_reads_bytes_opt_(ValueLength) PVOID ValueData, _In_ ULONG ValueLength, _In_opt_ PVOID Context, _In_opt_ PVOID EntryContext)
 
static PWSTR UsbdexBuildParametersPath (_In_ PDRIVER_OBJECT DriverObject, _In_ ULONG PoolTag)
 
static VOID UsbdexReadVerifierSettings (_In_ PDRIVER_OBJECT DriverObject, _In_z_ PCWSTR ParametersPath, _In_ ULONG PoolTag, _Inout_ PUSBD_CLIENT_INTERFACE Client)
 
static ULONG UsbdexProbeLegacyStack (_Inout_ PUSBDEX_HANDLE_OBJECT Handle)
 
static NTSTATUS UsbdexReferenceHandle (_Inout_ PUSBDEX_HANDLE_OBJECT Handle)
 
static VOID UsbdexDereferenceHandle (_Inout_ PUSBDEX_HANDLE_OBJECT Handle)
 
static NTSTATUS UsbdexStartAllocation (_In_opt_ PUSBDEX_HANDLE_OBJECT Handle, _In_ BOOLEAN ArgumentsValid, _Out_opt_ PURB *Urb)
 
static NTSTATUS UsbdexFinishAllocation (_Inout_ PUSBDEX_HANDLE_OBJECT Handle, _In_ NTSTATUS Status, _Inout_ PURB *Urb)
 
static PURB UsbdexAllocatePoolUrb (_In_ PUSBDEX_HANDLE_OBJECT Handle, _In_ SIZE_T Size)
 
static VOID UsbdexInitInterfaceInformation (_Out_ PUSBD_INTERFACE_INFORMATION Information, _In_ PUSB_INTERFACE_DESCRIPTOR Descriptor, _In_ UCHAR PipeCount)
 
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 UsbdexBuildSelectInterfaceUrb (_In_ PUSBDEX_HANDLE_OBJECT Handle, _In_ USBD_CONFIGURATION_HANDLE ConfigurationHandle, _Inout_ PUSBD_INTERFACE_LIST_ENTRY InterfaceListEntry, _Out_ PURB *Urb)
 
static NTSTATUS UsbdexLegacyCapability (_In_ PUSBDEX_HANDLE_OBJECT Handle, _In_ const GUID *CapabilityType, _In_opt_ PUCHAR OutputBuffer)
 
_Must_inspect_result_ _IRQL_requires_ (PASSIVE_LEVEL)
 Sends a synchronous IOCTL to the specified device object.
 
 _IRQL_requires_max_ (DISPATCH_LEVEL)
 

Variables

static POOL_TYPE UsbdexPoolType = NonPagedPool
 
static BOOLEAN UsbdexPoolTypeKnown = FALSE
 
static IO_COMPLETION_ROUTINE UsbdexSyncCompletion
 
static RTL_QUERY_REGISTRY_ROUTINE UsbdexVerifierValueCallback
 

Macro Definition Documentation

◆ USBDEX_COMPOSITE_VERSION

#define USBDEX_COMPOSITE_VERSION   0x0100

Definition at line 22 of file usbdex.c.

◆ USBDEX_HANDLE_SIGNATURE

#define USBDEX_HANDLE_SIGNATURE   'DBSU'

Definition at line 10 of file usbdex.c.

◆ USBDEX_MODE_LEGACY

#define USBDEX_MODE_LEGACY   USBD_INTERFACE_VERSION_600

Definition at line 14 of file usbdex.c.

◆ USBDEX_MODE_NONE

#define USBDEX_MODE_NONE   0xFFFFFFFF

Definition at line 15 of file usbdex.c.

◆ USBDEX_MODE_UCX

#define USBDEX_MODE_UCX   USBD_INTERFACE_VERSION_602

Definition at line 13 of file usbdex.c.

◆ USBDEX_NONPAGED_POOL_NX

#define USBDEX_NONPAGED_POOL_NX   ((POOL_TYPE)0x200)

Definition at line 18 of file usbdex.c.

◆ USBDEX_PIPE_MAX_TRANSFER_DEFAULT

#define USBDEX_PIPE_MAX_TRANSFER_DEFAULT   0xFFFFFFFF

Definition at line 20 of file usbdex.c.

◆ USBDEX_SELECT_INTERFACE_MAX_PIPES

#define USBDEX_SELECT_INTERFACE_MAX_PIPES   32

Definition at line 21 of file usbdex.c.

Typedef Documentation

◆ PFN_USBDEX_QUERY_REGISTRY

Definition at line 25 of file usbdex.c.

◆ PUSBDEX_HANDLE_OBJECT

◆ USBDEX_HANDLE_OBJECT

Function Documentation

◆ _IRQL_requires_()

_Must_inspect_result_ _IRQL_requires_ ( PASSIVE_LEVEL  )

Sends a synchronous IOCTL to the specified device object.

Parameters
[in]IoControlCodeThe IOCTL to send to the device.
[in]DeviceObjectPointer to the device object that will handle the IOCTL.
[in]InputBufferOptional pointer to a buffer containing input data for the IOCTL. When specified, the buffer should be at least of InputBufferLength size.
[in]InputBufferLengthSize in bytes, of the buffer pointed by InputBuffer.
[out]OutputBufferOptional pointer to a buffer that will receive output data from the IOCTL. When specified, the buffer should be at least of OutputBufferLength size.
[in]OutputBufferLengthSize in bytes, of the buffer pointed by OutputBuffer.
[in]FileObjectOptional pointer to a file object that may be necessary for the IOCTL.
Returns
An NTSTATUS code indicating success or failure of this function.
Note
Must be called at PASSIVE_LEVEL with all APCs enabled.

Nothing is found unless the PCI bus driver publishes the properties.

The root hub name without its prefix; NULL when the PDO has no name.

Grows a private buffer to what the helper asks for.

Lets KMDF handle the IRP, then hands it back here still uncompleted.

Waits for the device machine to answer a PnP or power event; returns the PnP status.

Deletes the UCX endpoints of the disabled pipes, then the interface record.

One 4 byte value; the registry type is not checked.

Reread whenever user experience settings change; the open status is returned.

Sends a synchronous IOCTL to the specified device object.

STATUS_SUCCESS when the caller's token is an administrator's.

Sends a synchronous IOCTL to the specified device object.

Reads one value of a walk. A missing value only clears Present; FALSE means stop.

Reads up to Size bytes of a value into a zeroed buffer; the type is not checked.

Writes a REG_BINARY value into the device's usbflags subkey.

Sets or clears ExtPropertiesInstalled from ExtPropDescSemaphore in the hardware key.

Fails only when a port cannot be bound to the USB4 host router its ACPI node names.

Assigns device, hardware, compatible, container and instance ids to a new child PDO.

Answers IRP_MN_QUERY_DEVICE_TEXT on a child PDO; always completes the IRP.

Takes the connector map lock, needed around HubConnectorFindCompanion.

Device hardware key values read at PDO prepare hardware.

Saves the MS OS 2.0 set info in usbflags when the set asks for alternate enumeration.

MsOs20Flags and EnumerationRetryCount, written at PDO start.

Rereads the UXD record; UpdateRequired says whether the device id changes.

Replacement PnP id of a UXD reserved device, or an empty String. Always succeeds.

Telemetry values under the device's Ceip subkey.

BootPathSurpriseRemovalCount + 1.

This machine's dual role features for a dual role partner.

Tells UCX the WDM PDO of the device; call right after the child PDO was created.

IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME: Argument1 and its length Argument2.

IOCTL_INTERNAL_USB_GET_BUS_INFO for the device: the 16 byte USB_BUS_NOTIFICATION at Argument1.

Registers the GUID_USB_WMI_NODE_INFO instance of a child PDO (not for hubs or composites).

Registers the boot device surprise removal event on an external, non hub boot PDO.

Fires the boot device surprise removal event, if one is registered.

Sends a synchronous IOCTL to the specified device object.

Publishes "<port>#<host>" for every bound port on the hub's PDO. QUIRK: with no bound port an older value is left in place.

Binds USB 3 ports to the host routers named by the USB4 DVSEC; an earlier ACPI mapping wins.

Waits on a PnP handshake event with no timeout, printing a watchdog line every minute so a stuck machine is visible in the debugger.

Copies up to Size bytes of a device property; a failed query leaves the field zero.

Only the controller name length is real; both bandwidth fields read 0.

The answer overlays a USB_HUB_NAME on TotalSize, so TotalSize comes back as the name length + 4.

Evaluates a method without arguments into Output.

Drops every MSI descriptor and keeps only lists that still offer a line interrupt.

Picks the list with the best MSI offer: MSI-X first, then the most messages.

Keeps message descriptors covering Wanted messages and removes the others.

Evaluates _DSM on the controller ACPI object with a buffer as Arg3; returns up to 8 result bytes, 0 on failure.

Lets UCX hook the controller device init. Call before WdfDeviceCreate.

Definition at line 571 of file usbdex.c.

580{
582 PWSTR ParametersPath;
584
586 {
587 if (USBDHandle)
588 *USBDHandle = NULL;
590 }
591
593
594 if (!DeviceObject ||
597 PoolTag == 0)
598 {
599 if (USBDHandle)
600 *USBDHandle = NULL;
602 }
603
604 if (!USBDHandle)
606
607 ParametersPath = UsbdexBuildParametersPath(DeviceObject->DriverObject, PoolTag);
608
610 if (!Handle)
611 {
612 if (ParametersPath)
613 ExFreePoolWithTag(ParametersPath, PoolTag);
614 *USBDHandle = NULL;
616 }
617
618 if (ParametersPath)
619 UsbdexReadVerifierSettings(DeviceObject->DriverObject, ParametersPath, PoolTag, &Handle->Client);
620
621 Handle->Signature = USBDEX_HANDLE_SIGNATURE;
622 Handle->Client.Header.Size = sizeof(Handle->Client);
623 Handle->Client.Header.Version = USBD_CLIENT_INTERFACE_VERSION;
624 Handle->Client.ClientContractVersion = USBDClientContractVersion;
625 Handle->Client.DeviceObject = DeviceObject;
626 Handle->Client.PoolTag = PoolTag;
627 Handle->Client.ClientContext = Handle;
628 Handle->TargetDeviceObject = TargetDeviceObject;
629 Handle->Mode = USBDEX_MODE_UCX;
630 Handle->ReferenceCount = 1;
631
634 &GUID_USBD_CLIENT_INTERFACE,
635 (PINTERFACE)&Handle->Client);
636 if (!NT_SUCCESS(Status))
637 {
638 /* Nothing the lower stack may have left in the answer part is usable */
639 Handle->Client.Handle = NULL;
640 Handle->Client.Unregister = NULL;
641 Handle->Client.AllocUrb = NULL;
642 Handle->Client.AllocIsochUrb = NULL;
643 Handle->Client.AllocSelectConfigUrb = NULL;
644 Handle->Client.AllocSelectInterfaceUrb = NULL;
645 Handle->Client.ReleaseUrb = NULL;
646
647 /* Not a UCX stack; the handle still works, with pool URBs */
649 }
650
651 if (ParametersPath)
652 ExFreePoolWithTag(ParametersPath, PoolTag);
653
654 *USBDHandle = (USBD_HANDLE)Handle;
655 return STATUS_SUCCESS;
656}
LONG NTSTATUS
Definition: precomp.h:26
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
IN OUT PVCB IN PDEVICE_OBJECT TargetDeviceObject
Definition: fatprocs.h:1675
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h:24
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
Definition: precomp.h:45
#define STATUS_INVALID_LEVEL
Definition: ntstatus.h:658
#define STATUS_SUCCESS
Definition: shellext.h:65
uint16_t * PWSTR
Definition: typedefs.h:56
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define USBD_CLIENT_INTERFACE_VERSION
Definition: usbdclient.h:18
static VOID UsbdexDetectPoolType(VOID)
Definition: usbdex.c:69
static ULONG UsbdexProbeLegacyStack(_Inout_ PUSBDEX_HANDLE_OBJECT Handle)
Definition: usbdex.c:318
static VOID UsbdexReadVerifierSettings(_In_ PDRIVER_OBJECT DriverObject, _In_z_ PCWSTR ParametersPath, _In_ ULONG PoolTag, _Inout_ PUSBD_CLIENT_INTERFACE Client)
Definition: usbdex.c:254
static NTSTATUS UsbdexQueryInterface(_In_ PDEVICE_OBJECT ClientDevice, _In_ PDEVICE_OBJECT Target, _In_ const GUID *InterfaceType, _Inout_ PINTERFACE Interface)
Definition: usbdex.c:137
#define USBDEX_MODE_UCX
Definition: usbdex.c:13
#define USBDEX_HANDLE_SIGNATURE
Definition: usbdex.c:10
static PWSTR UsbdexBuildParametersPath(_In_ PDRIVER_OBJECT DriverObject, _In_ ULONG PoolTag)
Definition: usbdex.c:221
static POOL_TYPE UsbdexPoolType
Definition: usbdex.c:45
_Must_inspect_result_ _In_ PDEVICE_OBJECT _In_ ULONG _In_ ULONG _Out_ USBD_HANDLE * USBDHandle
Definition: usbdlib.h:281
_Must_inspect_result_ _In_ PDEVICE_OBJECT _In_ ULONG USBDClientContractVersion
Definition: usbdlib.h:279
#define USBD_CLIENT_CONTRACT_VERSION_602
Definition: usbdlib.h:100
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG PoolTag
Definition: wdfmemory.h:164

◆ _IRQL_requires_max_()

_IRQL_requires_max_ ( DISPATCH_LEVEL  )

IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION; the idle machine owns the IRP afterwards.

Records hub over current in the hub hardware key, once per devnode.

First selective suspend of the device; the registry write runs in a work item.

"USB device not recognized" popup for a port.

A hub was attached beyond the allowed tier depth.

The selected configuration draws more power than the port can give.

The controller ran out of bandwidth for the device; fired by the out of bandwidth timer.

Priority 1 to 3, forwarded to the HCD's EvtEndpointSetCharacteristic.

Tells apart devices that claim the same VID, PID and serial number.

Definition at line 658 of file usbdex.c.

663{
665
666 if (!Handle)
667 return;
668
669 /* Outstanding URBs keep the handle alive until their USBD_UrbFree */
670 Handle->CloseRequested = TRUE;
672}
#define TRUE
Definition: types.h:120
static VOID UsbdexDereferenceHandle(_Inout_ PUSBDEX_HANDLE_OBJECT Handle)
Definition: usbdex.c:359
FORCEINLINE PUSBDEX_HANDLE_OBJECT UsbdexHandleObject(_In_opt_ USBD_HANDLE USBDHandle)
Definition: usbdex.c:53

◆ UsbdexAllocatePoolUrb()

static PURB UsbdexAllocatePoolUrb ( _In_ PUSBDEX_HANDLE_OBJECT  Handle,
_In_ SIZE_T  Size 
)
static

Definition at line 420 of file usbdex.c.

423{
424 return ExAllocatePoolZero(UsbdexPoolType, Size, Handle->Client.PoolTag);
425}
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539

Referenced by UsbdexBuildSelectConfigUrb(), and UsbdexBuildSelectInterfaceUrb().

◆ UsbdexBuildParametersPath()

static PWSTR UsbdexBuildParametersPath ( _In_ PDRIVER_OBJECT  DriverObject,
_In_ ULONG  PoolTag 
)
static

Turns "\Driver\Name" into "Name\Parameters"; NULL for any other form.

Definition at line 221 of file usbdex.c.

224{
225 static const WCHAR DriverPrefix[] = L"\\Driver\\";
226 static const WCHAR ParametersSuffix[] = L"\\Parameters";
227 const SIZE_T PrefixBytes = sizeof(DriverPrefix) - sizeof(WCHAR);
228 PUNICODE_STRING DriverName = &DriverObject->DriverName;
229 SIZE_T ServiceBytes;
230 SIZE_T PathBytes;
231 PWSTR Path;
232
233 if (DriverName->Length <= PrefixBytes)
234 return NULL;
235
236 if (!RtlEqualMemory(DriverName->Buffer, DriverPrefix, PrefixBytes))
237 return NULL;
238
239 ServiceBytes = DriverName->Length - PrefixBytes;
240 PathBytes = ServiceBytes + sizeof(ParametersSuffix);
241
243 if (!Path)
244 return NULL;
245
246 RtlCopyMemory(Path, (PUCHAR)DriverName->Buffer + PrefixBytes, ServiceBytes);
247 RtlCopyMemory((PUCHAR)Path + ServiceBytes, ParametersSuffix, sizeof(ParametersSuffix));
248 return Path;
249}
#define L(x)
Definition: resources.c:13
UNICODE_STRING Path
#define RtlEqualMemory(dst, src, len)
Definition: kdvm.h:18
short WCHAR
Definition: pedump.c:58
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
unsigned char * PUCHAR
Definition: typedefs.h:53
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213

Referenced by _IRQL_requires_().

◆ UsbdexBuildSelectConfigUrb()

static NTSTATUS UsbdexBuildSelectConfigUrb ( _In_ PUSBDEX_HANDLE_OBJECT  Handle,
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR  ConfigurationDescriptor,
_Inout_ PUSBD_INTERFACE_LIST_ENTRY  InterfaceList,
_Out_ PURB *  Urb 
)
static

Definition at line 453 of file usbdex.c.

458{
461 PUCHAR End;
462 PURB NewUrb;
465 UCHAR PipeCount;
466
467 /* The URB Length field is 16 bits, so the whole request has to fit */
469 for (Entry = InterfaceList; Entry->InterfaceDescriptor; Entry++)
470 {
471 TotalSize += (ULONG)GET_USBD_INTERFACE_SIZE(Entry->InterfaceDescriptor->bNumEndpoints);
472 if (TotalSize > MAXUSHORT)
474 }
475
477 if (!NewUrb)
479
480 Cursor = (PUCHAR)&NewUrb->UrbSelectConfiguration.Interface;
481 End = (PUCHAR)NewUrb + TotalSize;
482
483 /* The descriptors may change under us, so every block is checked against the buffer again */
484 for (Entry = InterfaceList; Entry->InterfaceDescriptor; Entry++)
485 {
486 PipeCount = Entry->InterfaceDescriptor->bNumEndpoints;
488 if (BlockSize > (ULONG)(End - Cursor))
489 {
490 ExFreePoolWithTag(NewUrb, Handle->Client.PoolTag);
492 }
493
495 Entry->InterfaceDescriptor,
496 PipeCount);
498 Cursor += BlockSize;
499 }
500
501 NewUrb->UrbSelectConfiguration.Hdr.Length = (USHORT)TotalSize;
503 NewUrb->UrbSelectConfiguration.ConfigurationDescriptor = ConfigurationDescriptor;
504
505 *Urb = NewUrb;
506 return STATUS_SUCCESS;
507}
D3D12_VIDEO_MOTION_ESTIMATOR_SEARCH_BLOCK_SIZE BlockSize
Definition: d3d12video.idl:529
PUCHAR End
Definition: desccheck.cpp:2229
PUCHAR Cursor
Definition: desccheck.cpp:2228
PLIST_ENTRY Entry
Definition: devhcd.cpp:1262
Request TotalSize
Definition: hubwmi.cpp:555
unsigned short USHORT
Definition: pedump.c:61
Definition: usb.h:565
struct _URB_SELECT_CONFIGURATION UrbSelectConfiguration
Definition: usb.h:569
Definition: usbdlib.h:7
unsigned char UCHAR
Definition: typedefs.h:53
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define MAXUSHORT
Definition: typedefs.h:83
uint32_t ULONG
Definition: typedefs.h:59
_In_ UCXUSBDEVICE _In_ ULONG Interface
Definition: ucxusbdevice.h:428
struct _USBD_INTERFACE_INFORMATION * PUSBD_INTERFACE_INFORMATION
#define URB_FUNCTION_SELECT_CONFIGURATION
Definition: usb.h:86
static PURB UsbdexAllocatePoolUrb(_In_ PUSBDEX_HANDLE_OBJECT Handle, _In_ SIZE_T Size)
Definition: usbdex.c:420
static VOID UsbdexInitInterfaceInformation(_Out_ PUSBD_INTERFACE_INFORMATION Information, _In_ PUSB_INTERFACE_DESCRIPTOR Descriptor, _In_ UCHAR PipeCount)
Definition: usbdex.c:430
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
Definition: usbdlib.h:331
#define GET_USBD_INTERFACE_SIZE(numEndpoints)
Definition: usbdlib.h:148
_In_ PUSBD_INTERFACE_LIST_ENTRY InterfaceList
Definition: usbdlib.h:208
_In_opt_ PUSB_CONFIGURATION_DESCRIPTOR _Inout_ PUSBD_INTERFACE_LIST_ENTRY _Outptr_ PURB * Urb
Definition: usbdlib.h:333

◆ UsbdexBuildSelectInterfaceUrb()

static NTSTATUS UsbdexBuildSelectInterfaceUrb ( _In_ PUSBDEX_HANDLE_OBJECT  Handle,
_In_ USBD_CONFIGURATION_HANDLE  ConfigurationHandle,
_Inout_ PUSBD_INTERFACE_LIST_ENTRY  InterfaceListEntry,
_Out_ PURB *  Urb 
)
static

Definition at line 511 of file usbdex.c.

516{
518 PURB NewUrb;
520 UCHAR PipeCount;
521
522 Descriptor = InterfaceListEntry->InterfaceDescriptor;
523 if (!Descriptor)
525
526 PipeCount = Descriptor->bNumEndpoints;
527 if (PipeCount > USBDEX_SELECT_INTERFACE_MAX_PIPES)
529
531 (ULONG)GET_USBD_INTERFACE_SIZE(PipeCount);
532
534 if (!NewUrb)
536
537 UsbdexInitInterfaceInformation(&NewUrb->UrbSelectInterface.Interface, Descriptor, PipeCount);
538 InterfaceListEntry->Interface = &NewUrb->UrbSelectInterface.Interface;
539
540 NewUrb->UrbSelectInterface.Hdr.Length = (USHORT)TotalSize;
542 NewUrb->UrbSelectInterface.ConfigurationHandle = ConfigurationHandle;
543
544 *Urb = NewUrb;
545 return STATUS_SUCCESS;
546}
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE ConfigurationHandle
Definition: ndis.h:3947
struct _URB_SELECT_INTERFACE UrbSelectInterface
Definition: usb.h:568
#define URB_FUNCTION_SELECT_INTERFACE
Definition: usb.h:87
#define USBDEX_SELECT_INTERFACE_MAX_PIPES
Definition: usbdex.c:21
_In_ USBD_CONFIGURATION_HANDLE _Inout_ PUSBD_INTERFACE_LIST_ENTRY InterfaceListEntry
Definition: usbdlib.h:342
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342

◆ UsbdexCallAndWait()

static NTSTATUS UsbdexCallAndWait ( _In_ PDEVICE_OBJECT  ClientDevice,
_In_ PDEVICE_OBJECT  Target,
_In_ __drv_freesMem(Mem) PIRP  Irp 
)
static

Definition at line 110 of file usbdex.c.

114{
115 KEVENT Done;
117
119
121 if (!NT_SUCCESS(Status))
123
125 if (Status == STATUS_PENDING)
126 {
128 Status = Irp->IoStatus.Status;
129 }
130
131 IoFreeIrp(Irp);
132 return Status;
133}
KEVENT Done
Definition: devreq.cpp:1162
#define FALSE
Definition: types.h:117
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
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)
Definition: iocomp.c:220
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
_In_ PIRP Irp
Definition: kse.h:79
#define KernelMode
Definition: asm.h:38
@ NotificationEvent
#define IoCallDriver
Definition: irp.c:1257
VOID NTAPI IoFreeIrp(IN PIRP Irp)
Definition: irp.c:1698
#define STATUS_PENDING
Definition: telnetd.h:14
static IO_COMPLETION_ROUTINE UsbdexSyncCompletion
Definition: usbdex.c:48
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
@ Executive
Definition: ketypes.h:467

Referenced by UsbdexQueryInterface(), and UsbdexSendCapabilityRequest().

◆ UsbdexDereferenceHandle()

static VOID UsbdexDereferenceHandle ( _Inout_ PUSBDEX_HANDLE_OBJECT  Handle)
static

Definition at line 359 of file usbdex.c.

361{
362 if (InterlockedDecrement(&Handle->ReferenceCount) > 0)
363 return;
364
365 /* Only a closed handle goes away; anything else is a client imbalance */
366 if (!Handle->CloseRequested)
367 return;
368
369 if (Handle->Client.Unregister)
370 Handle->Client.Unregister(Handle->Client.Handle);
371
372 ExFreePoolWithTag(Handle, Handle->Client.PoolTag);
373}
#define InterlockedDecrement
Definition: armddk.h:52

Referenced by _IRQL_requires_max_(), and UsbdexFinishAllocation().

◆ UsbdexDetectPoolType()

static VOID UsbdexDetectPoolType ( VOID  )
static

Definition at line 69 of file usbdex.c.

70{
72
74 return;
75
77
79 OsVersion.dwOSVersionInfoSize = sizeof(OsVersion);
81 {
82 if (OsVersion.dwMajorVersion > 6 ||
83 (OsVersion.dwMajorVersion == 6 && OsVersion.dwMinorVersion >= 2))
84 {
86 }
87 }
88
90}
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:182
#define NonPagedPool
Definition: env_spec_w32.h:307
static ULONG OsVersion
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
static BOOLEAN UsbdexPoolTypeKnown
Definition: usbdex.c:46
#define USBDEX_NONPAGED_POOL_NX
Definition: usbdex.c:18

Referenced by _IRQL_requires_().

◆ UsbdexFinishAllocation()

static NTSTATUS UsbdexFinishAllocation ( _Inout_ PUSBDEX_HANDLE_OBJECT  Handle,
_In_ NTSTATUS  Status,
_Inout_ PURB *  Urb 
)
static

Definition at line 404 of file usbdex.c.

408{
409 if (!NT_SUCCESS(Status))
410 {
411 *Urb = NULL;
413 }
414
415 return Status;
416}

◆ UsbdexHandleObject()

FORCEINLINE PUSBDEX_HANDLE_OBJECT UsbdexHandleObject ( _In_opt_ USBD_HANDLE  USBDHandle)

Definition at line 53 of file usbdex.c.

55{
57}

Referenced by _IRQL_requires_max_().

◆ UsbdexInitInterfaceInformation()

static VOID UsbdexInitInterfaceInformation ( _Out_ PUSBD_INTERFACE_INFORMATION  Information,
_In_ PUSB_INTERFACE_DESCRIPTOR  Descriptor,
_In_ UCHAR  PipeCount 
)
static

Definition at line 430 of file usbdex.c.

434{
436 ULONG Index;
437
438 Information->Length = (USHORT)GET_USBD_INTERFACE_SIZE(PipeCount);
439 Information->InterfaceNumber = Descriptor->bInterfaceNumber;
440 Information->AlternateSetting = Descriptor->bAlternateSetting;
441 Information->NumberOfPipes = PipeCount;
442
443 Pipe = Information->Pipes;
444 for (Index = 0; Index < PipeCount; Index++)
445 {
446 Pipe[Index].MaximumTransferSize = USBDEX_PIPE_MAX_TRANSFER_DEFAULT;
447 Pipe[Index].PipeFlags = 0;
448 }
449}
#define USBDEX_PIPE_MAX_TRANSFER_DEFAULT
Definition: usbdex.c:20
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
Definition: wdfrequest.h:1049
_In_ WDFUSBPIPE Pipe
Definition: wdfusb.h:1741

Referenced by UsbdexBuildSelectConfigUrb(), and UsbdexBuildSelectInterfaceUrb().

◆ UsbdexIsUcxMode()

FORCEINLINE BOOLEAN UsbdexIsUcxMode ( _In_ PUSBDEX_HANDLE_OBJECT  Handle)

Definition at line 61 of file usbdex.c.

63{
64 return Handle->Mode != USBDEX_MODE_NONE && Handle->Mode >= USBDEX_MODE_UCX;
65}
#define USBDEX_MODE_NONE
Definition: usbdex.c:15

◆ UsbdexLegacyCapability()

static NTSTATUS UsbdexLegacyCapability ( _In_ PUSBDEX_HANDLE_OBJECT  Handle,
_In_ const GUID *  CapabilityType,
_In_opt_ PUCHAR  OutputBuffer 
)
static

Definition at line 551 of file usbdex.c.

555{
556 if (IsEqualGUID(CapabilityType, &GUID_USB_CAPABILITY_DEVICE_CONNECTION_HIGH_SPEED_COMPATIBLE))
557 {
558 if (OutputBuffer)
560
561 return Handle->HighSpeed ? STATUS_SUCCESS : STATUS_NOT_SUPPORTED;
562 }
563
564 if (IsEqualGUID(CapabilityType, &GUID_USB_CAPABILITY_SELECTIVE_SUSPEND))
566
568}
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
_In_ PGUID CapabilityType
Definition: ucxcontroller.h:80
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863

◆ UsbdexProbeLegacyStack()

static ULONG UsbdexProbeLegacyStack ( _Inout_ PUSBDEX_HANDLE_OBJECT  Handle)
static

Definition at line 318 of file usbdex.c.

320{
321 USB_BUS_INTERFACE_USBDI_V1 BusInterface;
323
324 RtlZeroMemory(&BusInterface, sizeof(BusInterface));
325 BusInterface.Size = sizeof(BusInterface);
326 BusInterface.Version = USB_BUSIF_USBDI_VERSION_1;
327
328 Status = UsbdexQueryInterface(Handle->Client.DeviceObject,
329 Handle->TargetDeviceObject,
330 &USB_BUS_INTERFACE_USBDI_GUID,
331 (PINTERFACE)&BusInterface);
332 if (!NT_SUCCESS(Status))
333 return USBDEX_MODE_NONE;
334
335 if (BusInterface.IsDeviceHighSpeed)
336 Handle->HighSpeed = BusInterface.IsDeviceHighSpeed(BusInterface.BusContext);
337
338 /* The bus driver referenced the interface while answering; this is the only use of it */
339 if (BusInterface.InterfaceDereference)
340 BusInterface.InterfaceDereference(BusInterface.BusContext);
341
342 return USBDEX_MODE_LEGACY;
343}
PINTERFACE_DEREFERENCE InterfaceDereference
Definition: usbbusif.h:98
PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED IsDeviceHighSpeed
Definition: usbbusif.h:103
#define USB_BUSIF_USBDI_VERSION_1
Definition: usbbusif.h:74
#define USBDEX_MODE_LEGACY
Definition: usbdex.c:14

Referenced by _IRQL_requires_().

◆ UsbdexQueryInterface()

static NTSTATUS UsbdexQueryInterface ( _In_ PDEVICE_OBJECT  ClientDevice,
_In_ PDEVICE_OBJECT  Target,
_In_ const GUID *  InterfaceType,
_Inout_ PINTERFACE  Interface 
)
static

Definition at line 137 of file usbdex.c.

142{
144 PIRP Irp;
145
146 Irp = IoAllocateIrp(Target->StackSize, FALSE);
147 if (!Irp)
149
150 /* PnP IRPs must start out as not supported */
151 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
152
154 Stack->MajorFunction = IRP_MJ_PNP;
155 Stack->MinorFunction = IRP_MN_QUERY_INTERFACE;
156 Stack->Parameters.QueryInterface.InterfaceType = InterfaceType;
157 Stack->Parameters.QueryInterface.Size = Interface->Size;
158 Stack->Parameters.QueryInterface.Version = Interface->Version;
159 Stack->Parameters.QueryInterface.Interface = Interface;
160 Stack->Parameters.QueryInterface.InterfaceSpecificData = NULL;
161
162 return UsbdexCallAndWait(ClientDevice, Target, Irp);
163}
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
Definition: irp.c:647
static NTSTATUS UsbdexCallAndWait(_In_ PDEVICE_OBJECT ClientDevice, _In_ PDEVICE_OBJECT Target, _In_ __drv_freesMem(Mem) PIRP Irp)
Definition: usbdex.c:110
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID InterfaceType
Definition: wdffdo.h:463
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2721
#define IRP_MN_QUERY_INTERFACE

Referenced by _IRQL_requires_(), and UsbdexProbeLegacyStack().

◆ UsbdexReadVerifierSettings()

static VOID UsbdexReadVerifierSettings ( _In_ PDRIVER_OBJECT  DriverObject,
_In_z_ PCWSTR  ParametersPath,
_In_ ULONG  PoolTag,
_Inout_ PUSBD_CLIENT_INTERFACE  Client 
)
static

Definition at line 254 of file usbdex.c.

259{
260 PCWSTR ValueNames[] =
261 {
262 L"UsbVerifierEnabled",
263 L"UsbVerifierFailRegistration",
264 L"UsbVerifierFailChainedMdlSupport",
265 L"UsbVerifierFailStaticStreamSupport",
266 L"UsbVerifierStaticStreamCountOverride",
267 L"UsbVerifierFailEnableStaticStreams",
268 };
269 PULONG Fields[] =
270 {
271 &Client->VerifierEnabled,
272 &Client->VerifierFailRegistration,
273 &Client->VerifierFailChainedMdlSupport,
274 &Client->VerifierFailStaticStreamSupport,
275 &Client->VerifierStaticStreamCountOverride,
276 &Client->VerifierFailEnableStaticStreams,
277 };
279 PFN_USBDEX_QUERY_REGISTRY QueryValues;
281 SIZE_T TableBytes;
282 ULONG Index;
283
284 C_ASSERT(RTL_NUMBER_OF(ValueNames) == RTL_NUMBER_OF(Fields));
285
286 Client->VerifierEnabled = MmIsDriverVerifying(DriverObject) ? 1 : 0;
287
288 /* One extra zeroed entry terminates the table */
289 TableBytes = (RTL_NUMBER_OF(ValueNames) + 1) * sizeof(*Table);
291 if (!Table)
292 return;
293
294 for (Index = 0; Index < RTL_NUMBER_OF(ValueNames); Index++)
295 {
297 Table[Index].Flags = 0;
298 Table[Index].Name = (PWSTR)ValueNames[Index];
299 Table[Index].EntryContext = Fields[Index];
300 Table[Index].DefaultType = REG_DWORD;
301 Table[Index].DefaultData = Fields[Index];
302 Table[Index].DefaultLength = sizeof(ULONG);
303 }
304
305 RtlInitUnicodeString(&RoutineName, L"RtlQueryRegistryValuesEx");
307 if (!QueryValues)
308 QueryValues = RtlQueryRegistryValues;
309
310 (VOID)QueryValues(RTL_REGISTRY_SERVICES, ParametersPath, Table, NULL, NULL);
311
313}
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
#define VOID
Definition: acefi.h:82
LOGICAL NTAPI MmIsDriverVerifying(IN PDRIVER_OBJECT DriverObject)
Definition: drvmgmt.c:212
ASMGENDATA Table[]
Definition: genincdata.c:61
#define C_ASSERT(e)
Definition: intsafe.h:73
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RTL_REGISTRY_SERVICES
Definition: nt_native.h:162
#define REG_DWORD
Definition: sdbapi.c:615
char Name[55]
Definition: genincdata.c:33
Definition: client.c:31
PVOID NTAPI MmGetSystemRoutineAddress(IN PUNICODE_STRING SystemRoutineName)
Definition: sysldr.c:3672
uint32_t * PULONG
Definition: typedefs.h:59
const uint16_t * PCWSTR
Definition: typedefs.h:57
static RTL_QUERY_REGISTRY_ROUTINE UsbdexVerifierValueCallback
Definition: usbdex.c:49
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)
Definition: usbdex.c:26
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
RtlInitUnicodeString & RoutineName
Definition: xhcientry.cpp:59

Referenced by _IRQL_requires_().

◆ UsbdexReferenceHandle()

static NTSTATUS UsbdexReferenceHandle ( _Inout_ PUSBDEX_HANDLE_OBJECT  Handle)
static

Definition at line 347 of file usbdex.c.

349{
350 if (Handle->CloseRequested || Handle->ReferenceCount < 1)
352
353 InterlockedIncrement(&Handle->ReferenceCount);
354 return STATUS_SUCCESS;
355}
#define InterlockedIncrement
Definition: armddk.h:53
#define STATUS_INVALID_DEVICE_STATE
Definition: udferr_usr.h:178

Referenced by UsbdexStartAllocation().

◆ UsbdexSendCapabilityRequest()

static NTSTATUS UsbdexSendCapabilityRequest ( _In_ PDEVICE_OBJECT  ClientDevice,
_In_ PDEVICE_OBJECT  Target,
_Inout_ PUCXHUB_QUERY_CAPABILITY  Request,
_Out_opt_ PVOID  OutputBuffer 
)
static

Definition at line 167 of file usbdex.c.

172{
174 PIRP Irp;
175
176 Irp = IoAllocateIrp(Target->StackSize, FALSE);
177 if (!Irp)
179
180 Irp->AssociatedIrp.SystemBuffer = OutputBuffer;
181
183 Stack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
184 Stack->MinorFunction = 0;
185 Stack->Parameters.DeviceIoControl.IoControlCode = IOCTL_UCXHUB_QUERY_USB_CAPABILITY;
186 Stack->Parameters.Others.Argument1 = Request;
187
188 return UsbdexCallAndWait(ClientDevice, Target, Irp);
189}
#define IOCTL_UCXHUB_QUERY_USB_CAPABILITY
Definition: hubucx.h:65
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
#define IRP_MJ_INTERNAL_DEVICE_CONTROL

◆ UsbdexStartAllocation()

static NTSTATUS UsbdexStartAllocation ( _In_opt_ PUSBDEX_HANDLE_OBJECT  Handle,
_In_ BOOLEAN  ArgumentsValid,
_Out_opt_ PURB *  Urb 
)
static

Definition at line 378 of file usbdex.c.

382{
383 if (!Handle || !ArgumentsValid)
384 {
385 if (Urb)
386 *Urb = NULL;
388 }
389
390 if (!Urb)
392
393 *Urb = NULL;
394
397
398 return STATUS_SUCCESS;
399}
static NTSTATUS UsbdexReferenceHandle(_Inout_ PUSBDEX_HANDLE_OBJECT Handle)
Definition: usbdex.c:347

◆ UsbdexSyncCompletion()

static NTSTATUS NTAPI UsbdexSyncCompletion ( _In_ PDEVICE_OBJECT  DeviceObject,
_In_ PIRP  Irp,
_In_reads_opt_(_Inexpressible_("varies")) PVOID  Context 
)
static

Definition at line 95 of file usbdex.c.

99{
102
105}
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68
#define IO_NO_INCREMENT
Definition: iotypes.h:598

◆ UsbdexVerifierValueCallback()

static NTSTATUS NTAPI UsbdexVerifierValueCallback ( _In_z_ PWSTR  ValueName,
_In_ ULONG  ValueType,
_In_reads_bytes_opt_(ValueLength) PVOID  ValueData,
_In_ ULONG  ValueLength,
_In_opt_ PVOID  Context,
_In_opt_ PVOID  EntryContext 
)
static

Definition at line 194 of file usbdex.c.

201{
204
205 if (ValueType != REG_DWORD)
207
208 if (ValueLength != sizeof(ULONG))
210
211 /* A missing value comes back as the default, which already is the destination */
212 if (ValueData != EntryContext)
214
215 return STATUS_SUCCESS;
216}
_In_ GUID _In_ PVOID ValueData
Definition: hubbusif.h:312
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
Definition: rtlfuncs.h:4230
#define STATUS_INTERNAL_ERROR
Definition: ntstatus.h:559
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
Definition: wdfregistry.h:282
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
Definition: wdfregistry.h:275

Variable Documentation

◆ UsbdexPoolType

◆ UsbdexPoolTypeKnown

BOOLEAN UsbdexPoolTypeKnown = FALSE
static

Definition at line 46 of file usbdex.c.

Referenced by UsbdexDetectPoolType().

◆ UsbdexSyncCompletion

IO_COMPLETION_ROUTINE UsbdexSyncCompletion
static

Definition at line 48 of file usbdex.c.

Referenced by UsbdexCallAndWait().

◆ UsbdexVerifierValueCallback

RTL_QUERY_REGISTRY_ROUTINE UsbdexVerifierValueCallback
static

Definition at line 49 of file usbdex.c.

Referenced by UsbdexReadVerifierSettings().