102 return Node->PhysicalDeviceObject;
106 for (ChildNode =
Node->Child;
108 ChildNode = ChildNode->
Sibling)
153 if (
Name.Length >
Name.MaximumLength)
159 if (
Name.MaximumLength)
200 DPRINT(
"IopInitializeDevice(%p)\n", ControlData);
233 DPRINT1(
"IoCreateDevice() failed (Status 0x%08lx)\n",
Status);
241 DPRINT1(
"Failed to allocate a device node!\n");
251 DPRINT1(
"RtlDuplicateUnicodeString() failed (Status 0x%08lx)\n",
Status);
384 DPRINT(
"IopGetDeviceProperty() called\n");
464 DPRINT(
"Got device capabiliities\n");
491 DPRINT(
"IRP_MN_QUERY_CAPABILITIES failed (Status 0x%08lx)\n",
Status);
559 #if (WINVER >= _WIN32_WINNT_WS03) 567 #if (WINVER >= _WIN32_WINNT_WIN7) 622 DPRINT(
"IopGetRelatedDevice() called\n");
633 Relation = RelatedDeviceData->
Relation;
698 if (RelatedDeviceNode ==
NULL)
737 DPRINT(
"IopGetRelatedDevice() done\n");
809 ULONG DeviceStatus = 0;
810 ULONG DeviceProblem = 0;
814 DPRINT(
"IopDeviceStatus() called\n");
859 DPRINT(
"Get status data\n");
865 DPRINT1(
"Set status data is NOT SUPPORTED\n");
869 DPRINT1(
"FIXME: Clear status data!\n");
910 DPRINT(
"IopGetDeviceRelations() called\n");
933 DPRINT1(
"IopCaptureUnicodeString() failed (Status 0x%08lx)\n",
Status);
941 DPRINT1(
"IopGetDeviceObjectFromDeviceInstance() returned NULL\n");
975 DPRINT1(
"IopInitiatePnpIrp() failed (Status 0x%08lx)\n",
Status);
981 DPRINT(
"Found %d device relations\n", DeviceRelations->
Count);
989 for (
i = 0;
i < DeviceRelations->
Count;
i++)
991 ChildDeviceObject = DeviceRelations->
Objects[
i];
1001 if (BufferLeft < ChildDeviceNode->InstancePath.Length + 2 *
sizeof(
WCHAR))
1038 if (DeviceRelations !=
NULL)
1058 DPRINT(
"IopGetDeviceDepth() called\n");
1221 DPRINT(
"NtGetPlugPlayEvent() called\n");
1226 DPRINT1(
"NtGetPlugPlayEvent cannot be called from kernel mode!\n");
1234 DPRINT1(
"NtGetPlugPlayEvent: Caller does not hold the SeTcbPrivilege privilege!\n");
1239 DPRINT(
"Waiting for pnp notification event\n");
1247 DPRINT(
"KeWaitForSingleObject() failed (Status %lx)\n",
Status);
1260 DPRINT1(
"Buffer is too small for the pnp-event\n");
1268 Entry->Event.TotalSize,
1272 Entry->Event.TotalSize);
1280 DPRINT(
"NtGetPlugPlayEvent() done\n");
1347 DPRINT(
"NtPlugPlayControl(%d %p %lu) called\n",
1353 DPRINT1(
"NtGetPlugPlayEvent cannot be called from kernel mode!\n");
1361 DPRINT1(
"NtGetPlugPlayEvent: Caller does not hold the SeTcbPrivilege privilege!\n");
1378 switch (PlugPlayControlClass)
1385 PlugPlayControlClass);
1400 PlugPlayControlClass);
static ULONG IopGetDeviceNodeStatus(PDEVICE_NODE DeviceNode)
#define PNP_PROPERTY_POWER_DATA
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
#define PNP_REMOVAL_RELATIONS
#define STATUS_PRIVILEGE_NOT_HELD
#define PDCAP_WARM_EJECT_SUPPORTED
PDEVICE_OBJECT PhysicalDeviceObject
PDEVICE_NODE IopRootDeviceNode
#define STATUS_INSUFFICIENT_RESOURCES
_In_opt_ PDEVICE_OBJECT _In_ ULONG _Outptr_result_nullonfailure_ _At_ * SymbolicLinkList(return==0, __drv_allocatesMem(Mem))) PZZWSTR *SymbolicLinkList
static const WCHAR ControlClass[]
_Must_inspect_result_ __drv_aliasesMem PDEVICE_OBJECT _In_ PDEVICE_OBJECT TargetDevice
static NTSTATUS IopGetRelatedDevice(PPLUGPLAY_CONTROL_RELATED_DEVICE_DATA RelatedDeviceData)
#define DNUF_NOT_DISABLEABLE
#define PDCAP_D1_SUPPORTED
#define PNP_POWER_RELATIONS
IN BOOLEAN OUT PSTR Buffer
#define DN_ROOT_ENUMERATED
#define STATUS_INVALID_PARAMETER
#define DN_DRIVER_BLOCKED
struct _LIST_ENTRY * Blink
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY DeviceProperty
PDEVICE_OBJECT Objects[1]
#define PNP_GET_SIBLING_DEVICE
FORCEINLINE PLIST_ENTRY RemoveTailList(_Inout_ PLIST_ENTRY ListHead)
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
#define KeGetPreviousMode()
PLUGPLAY_EVENT_BLOCK Event
NTSTATUS NTAPI IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, IN ULONG Flags, OUT PWSTR *SymbolicLinkList)
#define PNP_SET_DEVICE_STATUS
struct _PLUGPLAY_EVENT_BLOCK::@2345::@2348 TargetDevice
#define PNP_GET_PARENT_DEVICE
struct _EXTENDED_DEVOBJ_EXTENSION * PEXTENDED_DEVOBJ_EXTENSION
#define PNP_BUS_RELATIONS
static LIST_ENTRY IopPnpEventQueueHead
struct _PNP_EVENT_ENTRY PNP_EVENT_ENTRY
UNICODE_STRING DeviceInstance
_In_ WDFDEVICE _In_ PWDF_DEVICE_INTERFACE_PROPERTY_DATA PropertyData
static NTSTATUS IopGetDeviceRelations(PPLUGPLAY_CONTROL_DEVICE_RELATIONS_DATA RelationsData)
_NullNull_terminated_ WCHAR * PZZWSTR
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
static PDEVICE_OBJECT IopTraverseDeviceNode(PDEVICE_NODE Node, PUNICODE_STRING DeviceInstance)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
static NTSTATUS IopRemovePlugPlayEvent(_In_ PPLUGPLAY_CONTROL_USER_RESPONSE_DATA ResponseData)
enum _PLUGPLAY_CONTROL_CLASS PLUGPLAY_CONTROL_CLASS
#define STATUS_BUFFER_TOO_SMALL
NTSTATUS IopQueueTargetDeviceEvent(const GUID *Guid, PUNICODE_STRING DeviceIds)
static NTSTATUS IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData)
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
PLUGPLAY_EVENT_CATEGORY EventCategory
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define FILE_DEVICE_CONTROLLER
#define DNUF_DONT_SHOW_IN_UI
PDEVICE_NODE PipAllocateDeviceNode(IN PDEVICE_OBJECT PhysicalDeviceObject)
NTSTATUS NTAPI NtGetPlugPlayEvent(IN ULONG Reserved1, IN ULONG Reserved2, OUT PPLUGPLAY_EVENT_BLOCK Buffer, IN ULONG BufferSize)
#define PDCAP_D2_SUPPORTED
struct _DEVICE_RELATIONS * PDEVICE_RELATIONS
PDEVICE_OBJECT IopGetDeviceObjectFromDeviceInstance(PUNICODE_STRING DeviceInstance)
#define PNP_PROPERTY_BUSTYPEGUID
#define DeviceCapabilities
NTSTATUS NTAPI IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY DeviceProperty, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength)
#define PNP_PROPERTY_REMOVAL_POLICY_HARDWARE_DEFAULT
#define PDCAP_D3_SUPPORTED
static KEVENT IopPnpNotifyEvent
#define FILE_AUTOGENERATED_DEVICE_NAME
NTSTATUS IopInitPlugPlayEvents(VOID)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
#define PNP_PROPERTY_ADDRESS
enum _DEVICE_ACTION DEVICE_ACTION
#define PNP_PROPERTY_LOCATION_PATHS
#define PNP_PROPERTY_ENUMERATOR_NAME
#define DN_PRIVATE_PROBLEM
_In_ WDFDMATRANSACTION _In_ size_t MaximumLength
static BOOLEAN PiIsDevNodeStarted(_In_ PDEVICE_NODE DeviceNode)
UNICODE_STRING DeviceInstance
#define NT_SUCCESS(StatCode)
NTSYSAPI NTSTATUS WINAPI RtlDuplicateUnicodeString(int, const UNICODE_STRING *, UNICODE_STRING *)
#define PNP_GET_DEVICE_STATUS
#define STATUS_NO_SUCH_DEVICE
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
#define EXCEPTION_EXECUTE_HANDLER
#define PNP_PROPERTY_REMOVAL_POLICY
struct _PNP_EVENT_ENTRY * PPNP_EVENT_ENTRY
static NTSTATUS IopDeviceStatus(PPLUGPLAY_CONTROL_STATUS_DATA StatusData)
UNICODE_STRING DeviceInstance
#define ObDereferenceObject
#define STATUS_ACCESS_DENIED
static NTSTATUS IopInitializeDevice(_In_ PPLUGPLAY_CONTROL_DEVICE_CONTROL_DATA ControlData)
#define DNF_CHILD_WITH_INVALID_ID
#define PNP_PROPERTY_UI_NUMBER
#define PNP_PROPERTY_REMOVAL_POLICY_OVERRIDE
#define PNP_CLEAR_DEVICE_STATUS
PDRIVER_OBJECT IopRootDriverObject
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
#define ExAllocatePool(type, size)
#define PNP_PROPERTY_PHYSICAL_DEVICE_OBJECT_NAME
static NTSTATUS IopCaptureUnicodeString(PUNICODE_STRING DstName, PUNICODE_STRING SrcName)
#define DNF_LEGACY_DRIVER
_In_ PNDIS_STRING DeviceInstance
#define memcpy(s1, s2, n)
#define PNP_GET_CHILD_DEVICE
static NTSTATUS IopGetDeviceDepth(PPLUGPLAY_CONTROL_DEPTH_DATA DepthData)
UNICODE_STRING InstancePath
NTSTATUS PiPerformSyncDeviceAction(_In_ PDEVICE_OBJECT DeviceObject, _In_ DEVICE_ACTION Action)
Perfom a device operation synchronously via PiQueueDeviceAction.
const LUID SeTcbPrivilege
#define PDCAP_WAKE_FROM_D1_SUPPORTED
static NTSTATUS PiControlSyncDeviceAction(_In_ PPLUGPLAY_CONTROL_DEVICE_CONTROL_DATA DeviceData, _In_ PLUGPLAY_CONTROL_CLASS ControlClass)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
VOID Copy(PVOID Src, PVOID Dst, ULONG NumBytes)
SYSTEM_POWER_STATE PD_DeepestSystemWake
NTSTATUS NTAPI NtPlugPlayControl(IN PLUGPLAY_CONTROL_CLASS PlugPlayControlClass, IN OUT PVOID Buffer, IN ULONG BufferLength)
#define KeInitializeEvent(pEvt, foo, foo2)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
struct CM_Power_Data_s CM_POWER_DATA
struct CM_Power_Data_s * PCM_POWER_DATA
#define InitializeListHead(ListHead)
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define FIELD_OFFSET(t, f)
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define PNP_PROPERTY_LEGACYBUSTYPE
#define DNF_HAS_PRIVATE_PROBLEM
#define IRP_MN_QUERY_DEVICE_RELATIONS
struct _DEVICE_NODE * Sibling
DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
BOOLEAN NTAPI SeSinglePrivilegeCheck(_In_ LUID PrivilegeValue, _In_ KPROCESSOR_MODE PreviousMode)
Checks if a single privilege is present in the context of the calling thread.
#define PNP_EJECT_RELATIONS
#define DN_CHILD_WITH_INVALID_ID
#define PNP_PROPERTY_INSTALL_STATE
VOID PiInsertDevNode(_In_ PDEVICE_NODE DeviceNode, _In_ PDEVICE_NODE ParentNode)
#define ObReferenceObject
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
#define PDCAP_WAKE_FROM_D0_SUPPORTED
_In_ FLT_SET_CONTEXT_OPERATION Operation
NTSTATUS IopFreeDeviceNode(IN PDEVICE_NODE DeviceNode)
#define RtlCopyMemory(Destination, Source, Length)
#define PNP_PROPERTY_BUSNUMBER
#define _SEH2_EXCEPT(...)
DEVICE_POWER_STATE PD_MostRecentPowerState
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ ULONG _Out_ PVOID _Out_ PULONG RequiredSize
#define _SEH2_GetExceptionCode()
#define _SEH2_YIELD(__stmt)
#define PDCAP_WAKE_FROM_D2_SUPPORTED
#define PNP_PROPERTY_CONTAINERID
#define DN_WILL_BE_REMOVED
NTSTATUS NTAPI IopInitiatePnpIrp(IN PDEVICE_OBJECT DeviceObject, IN PIO_STATUS_BLOCK IoStatusBlock, IN UCHAR MinorFunction, IN PIO_STACK_LOCATION Stack)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
static NTSTATUS IopGetInterfaceDeviceList(PPLUGPLAY_CONTROL_INTERFACE_DEVICE_LIST_DATA DeviceList)
UNICODE_STRING DeviceInstance
#define PDCAP_WAKE_FROM_D3_SUPPORTED
base of all file and directory entries
PDEVICE_NODE FASTCALL IopGetDeviceNode(IN PDEVICE_OBJECT DeviceObject)
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
#define PDCAP_D0_SUPPORTED
#define DNF_DRIVER_BLOCKED
#define IRP_MN_QUERY_CAPABILITIES
#define DNUF_WILL_BE_REMOVED