14#define HUB_OVERCURRENT_TIME 500
15#define HUB_RESET_RETRY_TIME 500
16#define HUB_DESCRIPTOR_RETRY_TIME 100
18#define HUB_DEFAULT_IDLE_TIMEOUT 50
19#define HUB_ROOT_MAX_PORT_POWER 500
22#define HUB_RESET_LIMIT 3
23#define HUB_RECOVERY_LIMIT 10
24#define HUB_RECOVERY_WINDOW (60LL * 1000 * 1000 * 10)
27#define HUB_MSG_HUB_RESET_FAILED 0x40020003
40 return HubGetFdoContext(
Device);
49 WdfDeviceWdmGetDeviceObject(
m_Device),
68HubFdo::FlushAndDeleteWorkItem(
117 SetFlag(HubFlag::PowerReferencePending);
127 if (!
HasFlag(HubFlag::PowerReferencePending))
134 ClearFlag(HubFlag::PowerReferencePending);
141HubFdo::QueryCapabilities()
188HubFdo::QueryInterfaces()
198 &GUID_UCXHUB_PARENT_INTERFACE,
222HubFdo::ProbeParentCapabilities()
230 WdfIoTargetWdmGetTargetDeviceObject(WdfDeviceGetIoTarget(
m_Device)),
237 &GUID_USB_CAPABILITY_HIGH_BANDWIDTH_ISOCH,
252 SetFlag(HubFlag::ParentNoSelectiveSuspend);
258HubFdo::AssignIdleSettings(
270 Settings.IdleTimeoutType = TimeoutType;
282HubFdo::ConfigureIdle()
296 SetFlag(HubFlag::S0IdleConfigured);
300 &GUID_HUB_IDLE_TIMEOUT_SETTING,
305 DPRINT1(
"Hub %p idle timeout setting registration failed\n",
m_Device);
318 Wake.ArmForWakeIfChildrenAreArmedForWake =
TRUE;
319 Wake.IndicateChildWakeOnParentWake =
TRUE;
352HubFdo::InitializeMachine()
382 Kind = HubKind::Root;
386 Kind = HubKind::Usb20;
390 Kind = HubKind::Usb30;
440 Status = HubUsb4Initialize(
this);
449 Status = QueryCapabilities();
455 WdfDeviceSetPnpCapabilities(
Device, &PnpCaps);
457 Status = QueryInterfaces();
461 ProbeParentCapabilities();
471 &GUID_UCXHUB_STACK_INTERFACE,
480 &GUID_UCXHUB_STACK_INTERFACE,
495 &USB_BUS_INTERFACE_USBDI_GUID,
516 WdfDeviceSetBusInformationForChildren(
Device, &BusInfo);
520 Status = InitializeMachine();
525 return PostAndWait(HubEvent::DeviceAdded,
"DeviceAdded");
556 WdfDeviceInitSetPnpPowerEventCallbacks(
DeviceInit, &PnpPower);
561 DPRINT1(
"Shutdown preprocess callback failed 0x%lx\n",
Status);
570 WdfDeviceInitSetPowerPolicyEventCallbacks(
DeviceInit, &PowerPolicy);
605HubFdoInSystemContainer(
649HubFdoApplyTunnelLpmRule(
669 DPRINT(
"Hub %p turns link power management off below it\n",
Hub);
692 HubReadHubRegistryValues(
Hub);
693 HubReadUsb4HostName(
Hub);
694 HubFdoApplyTunnelLpmRule(
Hub);
696 Status =
Hub->PostAndWait(HubEvent::PrepareHardware,
"PrepareHardware");
703 &DEVPKEY_Device_DeviceDesc,
715 if (
Name.Length == 0)
726 DPRINT1(
"Hub %p symbolic link name allocation failed\n",
Device);
741 HubConnectorMapPorts(
Hub);
742 HubUsb4MapDvsecHosts(
Hub);
753 HubDromReportFirmwareUpdateDevice(
Hub);
788 HubConnectorUnmapPorts(
Hub);
789 HubUsb4UnregisterNotification(
Hub);
794 Status =
Hub->PostAndWait(HubEvent::ReleaseHardware,
"ReleaseHardware");
832 HubUsb4RegisterNotification(
Hub);
838 &GUID_HUB_SELECTIVE_SUSPEND_POLICY,
843 DPRINT1(
"Hub %p selective suspend setting registration failed\n",
Device);
847 DPRINT(
"Hub %p D0 entry from state %d, action %d\n",
857 return Hub->PostAndWait(HubEvent::D0EntryFromSx,
"D0EntryFromSx");
860 return Hub->PostAndWait(HubEvent::D0Entry,
"D0Entry");
881 DPRINT(
"Hub %p D0 exit to state %d, action %d\n",
891 return Hub->PostAndWait(HubEvent::D0Exit,
"D0Exit");
895 return Hub->PostAndWait(HubEvent::D0ExitFinal,
"D0ExitFinal");
896 return Hub->PostAndWait(HubEvent::D0Exit,
"D0Exit");
941 Wake.ArmForWakeIfChildrenAreArmedForWake =
TRUE;
942 Wake.IndicateChildWakeOnParentWake =
TRUE;
955 HubRequestReservedIo(
Hub);
1022 HubUsb4UnregisterNotification(
Hub);
1023 HubUsb4CloseAllHosts(
Hub);
1042 Hub->PostAndWait(HubEvent::DeviceCleanup,
"DeviceCleanup");
1071 KeFlushQueuedDpcs();
1103 if (!
Hub->
HasFlag(HubFlag::S0IdleConfigured))
1119 if (
Hub->
HasFlag(HubFlag::GlobalPowerReference))
1121 DPRINT(
"Hub %p selective suspend on, dropping power reference\n",
Hub->
m_Device);
1126 else if (!
Hub->
HasFlag(HubFlag::GlobalPowerReference))
1128 DPRINT(
"Hub %p selective suspend off, taking power reference\n",
Hub->
m_Device);
1233 DPRINT1(
"Hub %p start failed in state %s, depth %lu\n",
1243 DPRINT1(
"Hub %p failed in state %s, message 0x%lx\n",
1274 DPRINT1(
"Hub %p reset recovery %lu, last port status 0x%lx\n",
DECLSPEC_NORETURN VOID NTAPI KeBugCheckEx(IN ULONG BugCheckCode, IN ULONG_PTR BugCheckParameter1, IN ULONG_PTR BugCheckParameter2, IN ULONG_PTR BugCheckParameter3, IN ULONG_PTR BugCheckParameter4)
VOID NTAPI HubNoPingResponse(_In_ UCXHUB_HUB_CONTEXT HubContext, _In_ UCXHUB_DEVICE_CONTEXT DeviceContext)
_In_ DsmEvent _In_ PCSTR What
WdfDeviceSetSpecialFileSupport(Device, WdfSpecialFilePaging, TRUE)
USB_BUS_INTERFACE_USBDI_V3 m_Usbdi
static EVT_WDF_DEVICE_USAGE_NOTIFICATION EvtUsageNotification
static EVT_WDF_DEVICE_RELEASE_HARDWARE EvtReleaseHardware
PUSB_CONFIGURATION_DESCRIPTOR m_ConfigDescriptor
static EVT_WDF_DRIVER_DEVICE_ADD EvtDeviceAdd
static EVT_WDF_DEVICE_D0_EXIT EvtD0Exit
static EVT_WDF_DEVICE_PREPARE_HARDWARE EvtPrepareHardware
BOOLEAN m_StreamsSupported
static EVT_WDFDEVICE_WDM_IRP_PREPROCESS EvtShutdown
VOID ClearFlag(_In_ HubFlag Flag)
static EVT_WDF_DEVICE_SURPRISE_REMOVAL EvtSurpriseRemoval
static EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 EvtArmWakeFromS0
VOID SetFlag(_In_ HubFlag Flag)
VOID QueueSurpriseRemovalToPorts()
UNICODE_STRING m_SymbolicLinkName
WDFIOTARGET m_RootHubTarget
static UCXHUB_WORKITEM_ROUTINE MachineWorkItem
VOID ReleasePowerReference()
PVOID m_SelectiveSuspendSetting
USHORT m_DescriptorRetryCount
VOID AcquirePowerReference()
VOID Post(_In_ HubEvent Event)
HubControlRequest m_Control
PUCXHUB_WORKITEM AllocateWorkItem()
ULONG m_LastResetPortStatus
HubInterruptRequest m_Interrupt
static EVT_WDF_OBJECT_CONTEXT_DESTROY EvtDestroy
UCXHUB_STACK_INTERFACE m_Stack
ULONG m_LifetimeRecoveryCount
BOOLEAN HasFlag(_In_ HubFlag Flag) const
static HubFdo * FromDevice(_In_ WDFDEVICE Device)
static EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 EvtDisarmWakeFromS0
static POWER_SETTING_CALLBACK PowerSettingChanged
DEVICE_CAPABILITIES m_Capabilities
static VOID NTAPI TimerFired(_In_ PVOID Context)
VOID EnqueueWorkItem(_In_ PUCXHUB_WORKITEM WorkItem, _In_ PUCXHUB_WORKITEM_ROUTINE Routine, _In_ PVOID Context, _In_ BOOLEAN ForwardProgress)
UCXUSBDEVICE UsbDevice() const
LIST_ENTRY m_HubListEntry
PVOID m_IdleTimeoutSetting
PUCXHUB_WORKITEM m_WorkItem
HubParentInfo m_ParentInfo
UCXHUB_PARENT_INTERFACE m_Parent
BOOLEAN IsRootHub() const
static EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX EvtDisarmWakeFromSx
WDF_POWER_DEVICE_STATE m_PowerState
ULONG m_SspIsochBurstCount
BOOLEAN m_NeedsForwardProgress
LARGE_INTEGER m_FirstRecoveryTime
static EVT_WDF_DEVICE_ARM_WAKE_FROM_SX EvtArmWakeFromSx
static EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtCleanup
static EVT_WDF_DEVICE_D0_ENTRY EvtD0Entry
VOID Initialize(_In_ HubFdo *Hub, _In_ HubKind Kind)
VOID ReleasePowerReference()
VOID ArmResetRetryTimer()
VOID ClearPipeResetCount()
VOID InitializeResetCount()
VOID InitializeDescriptorRetries()
BOOLEAN RecoveryLimitReached()
VOID StartDescriptorRetryTimer()
VOID AcquirePowerReference()
BOOLEAN DescriptorRetriesExhausted()
VOID ReportFailureToPnp()
BOOLEAN PipeResetLimitReached()
BOOLEAN ResetLimitReached()
VOID ArmOverCurrentTimer()
VOID Start(_In_ ULONG Milliseconds)
VOID Initialize(_In_ PFN_HUB_TIMER_FIRED Fired, _In_ PVOID Context)
const State * SmCurrent() const
#define STATUS_NOT_SUPPORTED
#define DEVPROP_TYPE_STRING
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
_Check_return_ _In_ ULONG _Inout_ PDXGK_CHILD_CONTAINER_ID ContainerId
#define NT_SUCCESS(StatCode)
#define RTL_CONSTANT_STRING(s)
static VOID Wake(_In_ UCHAR Csn)
#define _IRQL_requires_(irql)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeRaiseIrql(irql, oldIrql)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeLowerIrql(oldIrql)
#define KeSetEvent(pEvt, foo, foo2)
#define KeQuerySystemTime(t)
#define InitializeListHead(ListHead)
WdfRegistryClose(HardwareKey)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
#define ClearFlag(_F, _SF)
return pRequest Reuse(ReuseParams)
#define HUB_USB3_BOOT_DEVICE_FAILED
#define HUB_BUGCHECK_USB3
#define HUB_BOOT_DEVICE_IS_HUB
return WdfDeviceOpenRegistryKey(Child->m_Pdo->m_Device, PLUGPLAY_REGKEY_DEVICE, Access, WDF_NO_OBJECT_ATTRIBUTES, Key)
VOID NTAPI HubClearTtBuffer(_In_ UCXHUB_HUB_CONTEXT HubContext, _In_ UCXHUB_DEVICE_CONTEXT DeviceContext, _In_ UCXENDPOINT Endpoint, _In_ ULONG EndpointNumber, _In_ ULONG TtPortNumber)
BOOLEAN NTAPI HubUsb4NeedsHostPower(_In_ HubChild *Child)
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
#define UCXHUB_STACK_INTERFACE_VERSION_2
UCXHUB_WORKITEM_ROUTINE * PUCXHUB_WORKITEM_ROUTINE
#define UCXHUB_PARENT_INTERFACE_VERSION
#define UCXHUB_STACK_INTERFACE_VERSION_1
_In_opt_ PVOID _In_ PUCXHUB_WORKITEM WorkItem
@ UcxHubWorkItemForwardProgressNotRequired
#define UCXHUB_WORKITEM_FLAG_NEEDS_FLUSH
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define ExFreePoolWithTag(_P, _T)
#define _In_reads_bytes_(s)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define UNREFERENCED_PARAMETER(P)
NTSTATUS NTAPI IoRegisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
#define IoCompleteRequest
@ PowerActionShutdownReset
#define IsEqualGUID(rguid1, rguid2)
_Must_inspect_result_ NTSTATUS Create(_In_ WDFOBJECT Parent, _In_ WDFIOTARGET SizingTarget)
PFN_HUB_UNREGISTER_POWER_SETTING UnregisterPowerSetting
PFN_HUB_REGISTER_POWER_SETTING RegisterPowerSetting
PDEVICE_OBJECT RootHubPdo
PFN_UCXHUB_GET_SYMBOLIC_NAME QueryHubLinkName
USB_DEVICE_SPEED HubSpeed
PFN_UCXHUB_CONTROLLER_STOP_IDLE BlockControllerIdle
UCXHUB_HUB_CONTEXT HubContext
PFN_UCXHUB_WORKITEM_ALLOCATE WorkItemAllocate
PFN_UCXHUB_WORKITEM_FLUSH WorkItemFlush
PFN_UCXHUB_CLEAR_TT_BUFFER ClearTtBuffer
PFN_UCXHUB_CONTROLLER_RESUME_IDLE AllowControllerIdle
PFN_UCXHUB_NO_PING_RESPONSE NoPingResponse
PFN_UCXHUB_WORKITEM_DELETE WorkItemDelete
PFN_UCXHUB_STREAMS_SUPPORTED StreamsSupported
PFN_UCXHUB_WORKITEM_ENQUEUE WorkItemEnqueue
WDF_TRI_STATE SurpriseRemovalOK
PFN_WDF_DEVICE_D0_ENTRY EvtDeviceD0Entry
PFN_WDF_DEVICE_D0_EXIT EvtDeviceD0Exit
PFN_WDF_DEVICE_SURPRISE_REMOVAL EvtDeviceSurpriseRemoval
PFN_WDF_DEVICE_USAGE_NOTIFICATION EvtDeviceUsageNotification
PFN_WDF_DEVICE_PREPARE_HARDWARE EvtDevicePrepareHardware
PFN_WDF_DEVICE_RELEASE_HARDWARE EvtDeviceReleaseHardware
PFN_WDF_DEVICE_ARM_WAKE_FROM_S0 EvtDeviceArmWakeFromS0
PFN_WDF_DEVICE_DISARM_WAKE_FROM_S0 EvtDeviceDisarmWakeFromS0
PFN_WDF_DEVICE_ARM_WAKE_FROM_SX EvtDeviceArmWakeFromSx
PFN_WDF_DEVICE_DISARM_WAKE_FROM_SX EvtDeviceDisarmWakeFromSx
#define RtlZeroMemory(Destination, Length)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PUCX_CONTROLLER_CONFIG Config
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
static const WCHAR HubNonFunctionalDescription[]
#define HUB_MSG_HUB_RESET_FAILED
#define HUB_RECOVERY_LIMIT
#define HUB_OVERCURRENT_TIME
#define HUB_ROOT_MAX_PORT_POWER
static const UNICODE_STRING HubSystemContainerId
#define HUB_DEFAULT_IDLE_TIMEOUT
#define HUB_RECOVERY_WINDOW
#define HUB_RESET_RETRY_TIME
#define HUB_DESCRIPTOR_RETRY_TIME
#define HUB_PARENT_DISABLE_LPM
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL HubEvtIoInternalDeviceControl
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL HubEvtIoDeviceControl
#define USB_BUSIF_USBDI_VERSION_3
#define USBD_CLIENT_CONTRACT_VERSION_602
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_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)
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_In_ PWDFDEVICE_INIT DeviceInit
_Must_inspect_result_ _In_ WDFDRIVER Driver
#define DECLARE_CONST_UNICODE_STRING(_variablename, _string)
_In_ PDEVICE_OBJECT DeviceObject
@ WakeDoNotAllowUserControl
FORCEINLINE VOID WDF_DEVICE_PNP_CAPABILITIES_INIT(_Out_ PWDF_DEVICE_PNP_CAPABILITIES Caps)
_In_ WDF_POWER_DEVICE_STATE PreviousState
enum _WDF_SPECIAL_FILE_TYPE WDF_SPECIAL_FILE_TYPE
@ WdfReleaseHardwareOrderOnFailureAfterDescendants
enum _WDF_POWER_DEVICE_STATE WDF_POWER_DEVICE_STATE
_In_ WDFCMRESLIST _In_ WDFCMRESLIST ResourcesTranslated
_In_ WDF_SPECIAL_FILE_TYPE _In_ BOOLEAN IsInNotificationPath
FORCEINLINE VOID WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(_Out_ PWDF_DEVICE_POWER_POLICY_IDLE_SETTINGS Settings, _In_ WDF_POWER_POLICY_S0_IDLE_CAPABILITIES IdleCaps)
_In_ WDF_SPECIAL_FILE_TYPE NotificationType
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_POWER_POLICY_IDLE_SETTINGS Settings
@ WdfDeviceFailedNoRestart
@ WdfSpecialFileHibernation
#define WdfDeviceStopIdle(Device, WaitForD0)
FORCEINLINE VOID WDF_PNPPOWER_EVENT_CALLBACKS_INIT(_Out_ PWDF_PNPPOWER_EVENT_CALLBACKS Callbacks)
_In_ PWDFDEVICE_INIT _In_ PWDF_REMOVE_LOCK_OPTIONS Options
enum _WDF_POWER_POLICY_IDLE_TIMEOUT_TYPE WDF_POWER_POLICY_IDLE_TIMEOUT_TYPE
_In_ WDF_POWER_DEVICE_STATE TargetState
_In_ WDFCMRESLIST ResourcesRaw
@ SystemManagedIdleTimeoutWithHint
@ DriverManagedIdleTimeout
FORCEINLINE VOID WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(_Out_ PWDF_DEVICE_POWER_POLICY_WAKE_SETTINGS Settings)
FORCEINLINE VOID WDF_POWER_POLICY_EVENT_CALLBACKS_INIT(_Out_ PWDF_POWER_POLICY_EVENT_CALLBACKS Callbacks)
#define WdfDeviceResumeIdle(Device)
FORCEINLINE VOID WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(_Out_ PWDF_IO_QUEUE_CONFIG Config, _In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)
@ WdfIoQueueDispatchSequential
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
_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 WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(_attributes, _contexttype)
@ WdfExecutionLevelPassive
#define WdfObjectReference(Handle)
#define WdfObjectDereference(Handle)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_Must_inspect_result_ FORCEINLINE BOOLEAN WdfRequestSend(_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_opt_ PWDF_REQUEST_SEND_OPTIONS Options)
FORCEINLINE VOID WDF_REQUEST_SEND_OPTIONS_INIT(_Out_ PWDF_REQUEST_SEND_OPTIONS Options, _In_ ULONG Flags)
@ WDF_REQUEST_SEND_OPTION_SYNCHRONOUS
@ WDF_REQUEST_REUSE_NO_FLAGS
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
FORCEINLINE VOID WDF_REQUEST_REUSE_PARAMS_INIT(_Out_ PWDF_REQUEST_REUSE_PARAMS Params, _In_ ULONG Flags, _In_ NTSTATUS Status)
#define WDF_NO_OBJECT_ATTRIBUTES
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
#define PLUGPLAY_REGKEY_DEVICE
@ DevicePropertyContainerID
#define IRP_MN_QUERY_CAPABILITIES
#define PLUGPLAY_PROPERTY_PERSISTENT
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define MmLockPagableCodeSection(Address)