15 { 0x9bbbf831, 0xa2f2, 0x43b4, { 0x96, 0xd1, 0x86, 0x94, 0x4b, 0x59, 0x14, 0xb3 } };
22C_ASSERT(
sizeof(USB_HUB_PORT_INFORMATION) == 16);
28#define HUB_WMI_MIN_ACQUIRE_SIZE 10
31#define HUB_WMI_FIELD(Info, Field) \
32 ((PUCHAR)(Info) + FIELD_OFFSET(USB_DEVICE_NODE_INFO, Field))
170 MaskBytes =
Descriptor->bNumberOfPorts / 8 + 1;
219 PUSB_DEVICE_NODE_INFO
Info = (PUSB_DEVICE_NODE_INFO)
OutBuffer;
220 PUSB_HUB_PORT_INFORMATION
Entry;
229 Needed =
sizeof(USB_DEVICE_NODE_INFO) + ((
ULONG)PortCount - 1) *
sizeof(USB_HUB_PORT_INFORMATION);
239 Info->Sig = USB_NODE_INFO_SIG;
240 Info->LengthInBytes = Needed;
249 Info->HubDeviceInfo.NumberOfHubPorts = PortCount;
331 PUSB_DEVICE_NODE_INFO
Info = (PUSB_DEVICE_NODE_INFO)
OutBuffer;
344 DPRINT1(
"PDO %p WMI node query without a device\n",
Pdo);
365 Info->UsbDeviceInfo.CurrentConfigurationValue =
Config->Descriptor.bConfigurationValue;
366 Info->UsbDeviceInfo.NumberOfOpenPipes =
Config->EndpointCount;
371 Info->Sig = USB_NODE_INFO_SIG;
375 Info->UsbDeviceInfo.DeviceDescriptor =
Child->m_DeviceDescriptor;
376 Info->UsbDeviceInfo.Speed =
Child->Speed();
377 Info->UsbDeviceInfo.PortNumber =
Pdo->m_PortNumber;
378 Info->UsbDeviceInfo.ConnectionIndex =
Pdo->m_PortNumber;
379 Info->UsbDeviceInfo.ConnectionStatus =
Child->m_Port->m_ConnectionStatus;
385 Info->BusAddress.RootHubPortNumber =
Pdo->m_PortNumber;
387 Info->BusAddress.HubPortNumber[
Depth - 1] =
Pdo->m_PortNumber;
390 HubWmiCopyProperty(
Device,
393 sizeof(
Info->DeviceDescription));
394 HubWmiCopyProperty(
Device,
397 sizeof(
Info->UsbDeviceInfo.PnpHardwareId));
398 HubWmiCopyProperty(
Device,
401 sizeof(
Info->UsbDeviceInfo.PnpCompatibleId));
406 Child->m_SerialNumber,
407 min(
Child->m_SerialNumberLength,
sizeof(
Info->UsbDeviceInfo.SerialNumberId)));
413 Child->m_FriendlyName,
414 min((
ULONG)
Child->m_FriendlyNameLength,
sizeof(
Info->UsbDeviceInfo.PnpDeviceDescription)));
435 DPRINT1(
"Hub %p over current reset for invalid port %lu\n",
Hub,
Request->ConnectionNumber);
475 DPRINT1(
"Hub %p: controller name for WMI bus info failed 0x%lx\n",
Hub,
Status);
500 DPRINT1(
"WMI name request size %lu does not fit buffer of %lu bytes\n",
541HubWmiControllerNameRequest(
632 &GUID_USB_WMI_STD_DATA,
644 &GUID_USB_WMI_NODE_INFO,
663 &GUID_USB_WMI_NODE_INFO,
689HubWmiRegisterBootSurpriseRemoval(
708 DPRINT1(
"PDO %p: WMI surprise removal provider failed 0x%lx\n",
Pdo,
Status);
722HubWmiNotifyBootSurpriseRemoval(
VOID)
742 DPRINT1(
"WMI surprise removal event failed 0x%lx\n",
Status);
760HubWmiNotifyEnumerationFailure(
770HubWmiNotifyHubNestedTooDeeply(
780HubWmiNotifyInsufficientPower(
790HubWmiNotifyInsufficientBandwidth(
static _Out_opt_ PULONGLONG Start
WDFWMIINSTANCE m_WmiInstance
UNICODE_STRING m_SymbolicLinkName
static HubFdo * FromDevice(_In_ WDFDEVICE Device)
USB_30_HUB_DESCRIPTOR Usb30
UCXHUB_PARENT_INTERFACE m_Parent
BOOLEAN IsRootHub() const
union HubFdo::@1628 m_HubDescriptor
HubPort * FindPort(_In_ ULONG PortNumber)
static HubPdo * FromDevice(_In_ WDFDEVICE Device)
VOID Post(_In_ PortEvent Event)
USB_CONNECTION_STATUS m_ConnectionStatus
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
#define NT_SUCCESS(StatCode)
#define _IRQL_requires_max_(irql)
#define _IRQL_requires_(irql)
#define IsListEmpty(ListHead)
_In_ UCXUSBDEVICE UsbDevice
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
WdfFdoLockStaticChildListForIteration(Hub->m_Device)
static KSPIN_LOCK HubWmiSurpriseLock
_In_ HubPort _In_ USHORT _Out_ PUSHORT DeviceAddress
#define HUB_WMI_FIELD(Info, Field)
WdfFdoUnlockStaticChildListFromIteration(Hub->m_Device)
VOID NTAPI HubMakeUsb2StyleDescriptor(_In_ HubFdo *Hub, _Out_ PUSB_HUB_DESCRIPTOR Descriptor)
_In_ const GUID _In_ ULONG _In_opt_ PFN_WDF_WMI_INSTANCE_QUERY_INSTANCE _In_opt_ PFN_WDF_WMI_INSTANCE_EXECUTE_METHOD Method
static PCWSTR NTAPI HubWmiHubName(_In_ HubFdo *Hub, _Out_ PULONG Length)
static VOID NTAPI HubWmiFirePortEvent(_In_ HubFdo *Hub, _In_ ULONG PortNumber, _In_ USB_NOTIFICATION_TYPE Type)
VOID NTAPI HubWmiNotifyOverCurrent(_In_ HubFdo *Hub, _In_ ULONG PortNumber)
_In_ const GUID _In_ ULONG ProviderFlags
return WdfWmiInstanceCreate(Device, &Config, Attributes, Instance)
WDF_WMI_INSTANCE_CONFIG Config
static NTSTATUS NTAPI HubWmiQueryHubNode(_In_ WDFWMIINSTANCE WmiInstance, _In_ ULONG OutBufferSize, _Out_writes_bytes_to_(OutBufferSize, *BufferUsed) PVOID OutBuffer, _Out_ PULONG BufferUsed)
_In_ ULONG _Inout_ PUSB_BUS_NOTIFICATION _Out_ PULONG BufferUsed
static NTSTATUS NTAPI HubWmiHubNameRequest(_In_ HubFdo *Hub, _In_ ULONG OutBufferSize, _Inout_ PUSB_ACQUIRE_INFO Request, _Out_ PULONG BufferUsed)
_In_ const GUID _In_ ULONG _In_opt_ PFN_WDF_WMI_INSTANCE_QUERY_INSTANCE _In_opt_ PFN_WDF_WMI_INSTANCE_EXECUTE_METHOD _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_opt_ WDFWMIINSTANCE * Instance
static NTSTATUS NTAPI HubWmiExecuteMethod(_In_ WDFWMIINSTANCE WmiInstance, _In_ ULONG MethodId, _In_ ULONG InBufferSize, _In_ ULONG OutBufferSize, _Inout_ PVOID Buffer, _Out_ PULONG BufferUsed)
WDF_WMI_PROVIDER_CONFIG_INIT & Provider
static NTSTATUS NTAPI HubWmiResetOverCurrent(_In_ HubFdo *Hub, _In_ PUSB_CONNECTION_NOTIFICATION Request)
static const GUID HubWmiSurpriseRemovalGuid
#define HUB_WMI_MIN_ACQUIRE_SIZE
static BOOLEAN NTAPI HubWmiAcquireSizeValid(_In_ PUSB_ACQUIRE_INFO Request, _In_ ULONG OutBufferSize)
_In_ HubPort _In_ USHORT PortNumber
static NTSTATUS NTAPI HubWmiQueryDeviceNode(_In_ WDFWMIINSTANCE WmiInstance, _In_ ULONG OutBufferSize, _Out_writes_bytes_to_(OutBufferSize, *BufferUsed) PVOID OutBuffer, _Out_ PULONG BufferUsed)
static VOID NTAPI HubWmiEvtSurpriseRemovalCleanup(_In_ WDFOBJECT Object)
_In_ const GUID _In_ ULONG _In_opt_ PFN_WDF_WMI_INSTANCE_QUERY_INSTANCE _In_opt_ PFN_WDF_WMI_INSTANCE_EXECUTE_METHOD _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
static VOID NTAPI HubWmiCopyPipes(_In_ HubConfiguration *Config, _Out_ PUSB_PIPE_INFO Pipes)
_In_ const GUID _In_ ULONG _In_opt_ PFN_WDF_WMI_INSTANCE_QUERY_INSTANCE Query
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
#define _Out_writes_bytes_to_(s, c)
#define _Out_writes_bytes_(s)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define RtlFillMemory(Dest, Length, Fill)
_In_ UCHAR _In_ ULONG _Out_ PUCHAR _Outptr_result_bytebuffer_ OutBufferLength PVOID * OutBuffer
#define STATUS_BUFFER_TOO_SMALL
WDFWMIINSTANCE SurpriseRemovalWmi
USB_DEVICE_SPEED HubSpeed
USB_TOPOLOGY_ADDRESS HubTopologyAddress
UCHAR bPowerOnToPowerGood
USHORT wHubCharacteristics
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
_In_ UCXUSBDEVICE _In_ ULONG Interface
#define STATUS_DEVICE_NOT_CONNECTED
#define STATUS_INVALID_PARAMETER
#define USB_20_HUB_DESCRIPTOR_TYPE
enum _USB_NOTIFICATION_TYPE USB_NOTIFICATION_TYPE
struct _USB_PIPE_INFO USB_PIPE_INFO
enum _USB_CONNECTION_STATUS USB_CONNECTION_STATUS
struct _USB_HUB_NAME * PUSB_HUB_NAME
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
@ WdfRetrievePresentChildren
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PWDFDEVICE_INIT _In_ PFN_WDF_DEVICE_SHUTDOWN_NOTIFICATION Notification
_In_ WDF_SPECIAL_FILE_TYPE NotificationType
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG _In_ _Out_ WDFMEMORY * Memory
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
#define WdfObjectReference(Handle)
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
#define WdfObjectDereference(Handle)
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING DeviceDescription
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
#define WDF_NO_OBJECT_ATTRIBUTES
FORCEINLINE VOID WDF_WMI_PROVIDER_CONFIG_INIT(_Out_ PWDF_WMI_PROVIDER_CONFIG Config, _In_ CONST GUID *Guid)
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD * PFN_WDF_WMI_INSTANCE_EXECUTE_METHOD
_In_ ULONG _Out_ PULONG BufferUsed
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE * PFN_WDF_WMI_INSTANCE_QUERY_INSTANCE
FORCEINLINE VOID WDF_WMI_INSTANCE_CONFIG_INIT_PROVIDER_CONFIG(_Out_ PWDF_WMI_INSTANCE_CONFIG Config, _In_ PWDF_WMI_PROVIDER_CONFIG ProviderConfig)
@ WdfWmiProviderEventOnly
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_WMI_INSTANCE_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_opt_ WDFWMIINSTANCE * Instance
_Must_inspect_result_ _In_ WDFWMIINSTANCE WmiInstance
@ DevicePropertyCompatibleIDs
@ DevicePropertyHardwareID
@ DevicePropertyDeviceDescription