40 #define MAX_DEVICE_ID_LEN 200 41 #define MAX_SEPARATORS_INSTANCEID 0 42 #define MAX_SEPARATORS_DEVICEID 1 129 ULONG SeparatorsCount = 0;
160 for (PtrChar =
Id; PtrChar < StringEnd; PtrChar++)
166 if (!IsMultiSz || (PtrPrevChar && PtrChar == PtrPrevChar + 1))
168 if (MaxSeparators == SeparatorsCount || IsMultiSz)
173 DPRINT1(
"IopValidateID: SeparatorsCount - %lu, MaxSeparators - %lu\n",
174 SeparatorsCount, MaxSeparators);
179 PtrPrevChar = PtrChar;
182 else if (Char < ' ' || Char > 0x7F || Char ==
',')
184 DPRINT1(
"IopValidateID: Invalid character - %04X\n", Char);
187 else if (Char ==
' ')
191 else if (Char ==
'\\')
195 if (SeparatorsCount > MaxSeparators)
197 DPRINT1(
"IopValidateID: SeparatorsCount - %lu, MaxSeparators - %lu\n",
198 SeparatorsCount, MaxSeparators);
204 DPRINT1(
"IopValidateID: Not terminated ID\n");
226 DPRINT(
"Sending IRP_MN_QUERY_ID.BusQueryDeviceID to device stack\n");
235 DPRINT1(
"IopInitiatePnpIrp(BusQueryDeviceID) failed (Status %x)\n",
Status);
249 DPRINT(
"Sending IRP_MN_QUERY_CAPABILITIES to device stack (after enumeration)\n");
256 DPRINT1(
"IopQueryDeviceCapabilities() failed (Status 0x%08lx)\n",
Status);
273 DPRINT(
"Instance ID is not unique\n");
277 DPRINT1(
"IopGetParentIdPrefix() failed (Status 0x%08lx)\n",
Status);
283 DPRINT(
"Sending IRP_MN_QUERY_ID.BusQueryInstanceID to device stack\n");
292 DPRINT(
"IopInitiatePnpIrp(BusQueryInstanceID) failed (Status %lx)\n",
Status);
309 InstancePath->Length = 0;
310 InstancePath->MaximumLength = DeviceId.
Length +
sizeof(
WCHAR) +
316 InstancePath->MaximumLength +=
sizeof(
WCHAR);
320 InstancePath->MaximumLength,
322 if (!InstancePath->Buffer)
390 HANDLE ccsServicesHandle, serviceHandle =
NULL;
408 sizeof(*driverEntry),
443 DPRINT(
"Service \"%wZ\" is disabled (start type %u)\n", &
serviceName, startType);
513 DPRINT1(
"Failed to load driver \"%wZ\" for %wZ (status %x)\n",
553 .Name = Lower ?
L"LowerFilters" :
L"UpperFilters",
563 if (ClassKey ==
NULL)
572 .Name = Lower ?
L"LowerFilters" :
L"UpperFilters",
600 HANDLE EnumRootKey, SubKey;
613 DPRINT1(
"IopOpenRegistryKeyEx() failed for \"%wZ\" (status %x)\n", &EnumRoot,
Status);
622 DPRINT1(
"Failed to open a devnode instance key for \"%wZ\" (status %x)\n",
643 DPRINT1(
"IopOpenRegistryKeyEx() failed for \"%wZ\" (status %x)\n",
644 &ccsControlClass,
Status);
653 DPRINT1(
"Failed to open class key \"%wZ\" (status %x)\n", &classGUID,
Status);
669 DPRINT(
"Properties key failed to open for \"%wZ\" (status %x)\n",
730 sizeof(*driverEntry),
734 DPRINT(
"No service for \"%wZ\" (RawDeviceOK)\n", &
DeviceNode->InstancePath);
742 DPRINT(
"No service for \"%wZ\" (loadDrv: %u)\n", &
DeviceNode->InstancePath, LoadDrivers);
755 listEntry != &drvListHead;
756 listEntry = listEntry->
Flink)
771 else if (driverObject ==
NULL)
799 if (!SystemPowerDeviceNodeCreated)
803 SystemPowerDeviceNodeCreated =
TRUE;
823 DPRINT1(
"DO_DEVICE_INITIALIZING is not cleared on a device 0x%p!\n", attachedDO);
844 if (ClassKey !=
NULL)
866 DeviceCaps->Version = 1;
867 DeviceCaps->Address = -1;
868 DeviceCaps->UINumber = -1;
872 Stack.Parameters.DeviceCapabilities.Capabilities = DeviceCaps;
883 DPRINT1(
"IRP_MN_QUERY_CAPABILITIES failed with status 0x%lx\n",
Status);
890 if (DeviceCaps->LockSupported)
893 if (DeviceCaps->EjectSupported)
896 if (DeviceCaps->Removable)
899 if (DeviceCaps->DockDevice)
902 if (DeviceCaps->UniqueID)
905 if (DeviceCaps->SilentInstall)
908 if (DeviceCaps->RawDeviceOK)
911 if (DeviceCaps->SurpriseRemovalOK)
914 if (DeviceCaps->HardwareDisabled)
917 if (DeviceCaps->NonDynamic)
920 if (DeviceCaps->NoDisplayInUI)
930 Status = ZwSetValueKey(InstanceKey,
938 if (DeviceCaps->UINumber !=
MAXULONG)
941 Status = ZwSetValueKey(InstanceKey,
945 &DeviceCaps->UINumber,
968 DPRINT(
"Sending IRP_MN_QUERY_ID.BusQueryHardwareIDs to device stack\n");
988 DPRINT(
"Hardware IDs:\n");
1001 Status = ZwSetValueKey(InstanceKey,
1014 DPRINT(
"IopInitiatePnpIrp() failed (Status %x)\n",
Status);
1033 DPRINT(
"Sending IRP_MN_QUERY_ID.BusQueryCompatibleIDs to device stack\n");
1053 DPRINT(
"Compatible IDs:\n");
1066 Status = ZwSetValueKey(InstanceKey,
1074 DPRINT1(
"ZwSetValueKey() failed (Status %lx) or no Compatible ID returned\n",
Status);
1079 DPRINT(
"IopInitiatePnpIrp() failed (Status %x)\n",
Status);
1101 DPRINT1(
"ZwQueryDefaultLocale() failed with status %x\n",
status);
1118 status = ZwSetValueKey(InstanceKey,
1134 DPRINT(
"Driver didn't return DeviceDesc (status %x)\n",
status);
1136 status = ZwSetValueKey(InstanceKey,
1140 unknownDeviceDesc.
Buffer,
1160 &deviceLocationInfo);
1162 if (deviceLocationInfo && deviceLocationInfo[0] !=
UNICODE_NULL)
1166 status = ZwSetValueKey(InstanceKey,
1178 if (deviceLocationInfo)
1184 DPRINT(
"Driver didn't return LocationInformation (status %x)\n",
status);
1212 DPRINT1(
"IopCreateDeviceInstancePath() failed with status 0x%lx\n",
Status);
1219 if (OldDeviceObject !=
NULL)
1223 DPRINT1(
"Duplicate device instance '%wZ'\n", &InstancePathU);
1225 DPRINT1(
"Old instance parent: '%wZ'\n", &OldDeviceNode->
Parent->InstancePath);
1244 DPRINT1(
"Failed to create the instance key! (Status %lx)\n",
Status);
1259 DPRINT(
"Sending IRP_MN_QUERY_BUS_INFORMATION to device stack\n");
1276 DPRINT(
"IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n",
Status);
1283 DPRINT(
"Sending IRP_MN_QUERY_RESOURCES to device stack\n");
1296 DPRINT(
"IopInitiatePnpIrp() failed (Status %x) or IoStatusBlock.Information=NULL\n",
Status);
1300 DPRINT(
"Sending IRP_MN_QUERY_RESOURCE_REQUIREMENTS to device stack\n");
1312 DPRINT(
"IopInitiatePnpIrp() failed (Status %08lx)\n",
Status);
1316 if (InstanceKey !=
NULL)
1356 WCHAR ValueBuffer[6];
1381 ServiceKeyName.
Length = 0;
1385 DPRINT1(
"No ServiceKeyName.Buffer!\n");
1392 DPRINT(
"ServiceKeyName: %wZ\n", &ServiceKeyName);
1422 &KeyValueInformation);
1435 KeyValueInformation =
NULL;
1440 &KeyValueInformation);
1452 KeyValueInformation =
NULL;
1456 swprintf(ValueBuffer,
L"%lu", NextInstance);
1458 Status = ZwSetValueKey(ServiceEnumKey,
1473 Status = ZwSetValueKey(ServiceEnumKey,
1484 Status = ZwSetValueKey(ServiceEnumKey,
1489 sizeof(NextInstance));
1493 if (ServiceEnumKey !=
NULL)
1496 if (ServiceKey !=
NULL)
1517 HANDLE enumRootHandle, instanceHandle;
1523 DPRINT1(
"IopOpenRegistryKeyEx() failed for \"%wZ\" (status %x)\n", &enumRoot,
Status);
1532 DPRINT1(
"Failed to open a devnode instance key for \"%wZ\" (status %x)\n",
1547 DPRINT(
"Sending IRP_MN_QUERY_CAPABILITIES to device stack (after start)\n");
1552 DPRINT(
"IopInitiatePnpIrp() failed (Status 0x%08lx)\n",
Status);
1614 targetDevice = vpbDevObj->Vpb->DeviceObject;
1627 vpbDevObj = vpbDevObj->AttachedDevice;
1629 }
while (vpbDevObj);
1660 DeviceNode->ResourceListTranslated->Count = 0;
1682 for (
i = 0;
i < DeviceRelations->
Count;
i++)
1699 ChildDeviceNode = ParentDeviceNode->
Child;
1700 while (ChildDeviceNode !=
NULL)
1702 NextDeviceNode = ChildDeviceNode->
Sibling;
1707 ChildDeviceNode = NextDeviceNode;
1743 ChildDeviceNode = ParentDeviceNode->
Child;
1744 while (ChildDeviceNode !=
NULL)
1746 NextDeviceNode = ChildDeviceNode->
Sibling;
1751 ChildDeviceNode = NextDeviceNode;
1766 for (
i = 0;
i < DeviceRelations->
Count;
i++)
1795 DPRINT(
"IopInitiatePnpIrp() failed with status 0x%08lx\n",
Status);
1796 DeviceRelations =
NULL;
1803 if (DeviceRelations)
1838 PDEVICE_NODE ChildDeviceNode, NextDeviceNode, FailedRemoveDevice;
1843 ChildDeviceNode = ParentDeviceNode->
Child;
1844 while (ChildDeviceNode !=
NULL)
1846 NextDeviceNode = ChildDeviceNode->
Sibling;
1853 FailedRemoveDevice = ChildDeviceNode;
1858 ChildDeviceNode = NextDeviceNode;
1866 ChildDeviceNode = ParentDeviceNode->
Child;
1867 while (ChildDeviceNode !=
NULL)
1869 NextDeviceNode = ChildDeviceNode->
Sibling;
1876 if (ChildDeviceNode == FailedRemoveDevice)
1879 ChildDeviceNode = NextDeviceNode;
1898 for (
i = 0;
i < DeviceRelations->
Count;
i++)
1913 for (
i = 0;
i <=
j;
i++)
1919 for (;
i < DeviceRelations->
Count;
i++)
1947 DPRINT1(
"Removal vetoed by failing the query remove request\n");
1962 DPRINT(
"IopInitiatePnpIrp() failed with status 0x%08lx\n",
Status);
1963 DeviceRelations =
NULL;
1970 if (DeviceRelations)
1980 if (DeviceRelations)
1985 if (DeviceRelations)
2009 if (surpriseRemoval)
2018 if (surpriseRemoval)
2107 DPRINT(
"QDR request failed for %wZ, status %x\n",
2116 if (!DeviceRelations)
2129 DPRINT(
"PiEnumerateDevice: enumerating %u children\n", DeviceRelations->
Count);
2132 for (
i = 0;
i < DeviceRelations->
Count;
i++)
2134 ChildDeviceObject = DeviceRelations->
Objects[
i];
2138 if (!ChildDeviceNode)
2142 if (ChildDeviceNode)
2155 DPRINT1(
"PipAllocateDeviceNode() failed. Skipping PDO %u\n",
i);
2228 DPRINT(
"IopInitiatePnpIrp() failed with status 0x%08lx\n",
Status);
2229 DeviceRelations =
NULL;
2236 if (DeviceRelations)
2246 if (DeviceRelations)
2253 if (DeviceRelations)
2259 if (DeviceRelations)
2300 DeviceNode->ResourceRequirements = resourceRequirements;
2322 doProcessAgain =
FALSE;
2336 switch (currentNode->
State)
2362 doProcessAgain =
TRUE;
2369 doProcessAgain =
TRUE;
2390 doProcessAgain =
TRUE;
2401 doProcessAgain =
TRUE;
2416 doProcessAgain =
TRUE;
2432 doProcessAgain =
TRUE;
2439 doProcessAgain =
TRUE;
2448 doProcessAgain =
TRUE;
2471 if (!doProcessAgain)
2478 ASSERT(currentNode->
Child->Parent == currentNode);
2479 currentNode = currentNode->
Child;
2489 currentNode = currentNode->
Sibling;
2496 currentNode = currentNode->
Parent;
2504 }
while (doProcessAgain || currentNode !=
RootNode);
2516 return "PiActionEnumDeviceTree";
2518 return "PiActionEnumRootDevices";
2520 return "PiActionResetDevice";
2522 return "PiActionAddBootDevices";
2524 return "PiActionStartDevice";
2526 return "PiActionQueryState";
2528 return "(request unknown)";
2559 DPRINT(
"Processing PnP request %p: DeviceObject - %p, Action - %s\n",
2595 DPRINT1(
"NOTE: attempt to start an already started/uninitialized device %wZ\n",
2617 if (
Request->CompletionStatus)
2658 DPRINT(
"PiQueueDeviceAction: DeviceObject - %p, Request - %p, Action - %s\n",
2665 Request->CompletionEvent = CompletionEvent;
2666 Request->CompletionStatus = CompletionStatus;
#define DO_DEVICE_INITIALIZING
BOOLEAN PnPBootDriversLoaded
#define IRP_MN_CANCEL_REMOVE_DEVICE
struct _CM_RESOURCE_LIST * PCM_RESOURCE_LIST
struct _ADD_DEV_DRIVERS_LIST ADD_DEV_DRIVERS_LIST
LIST_ENTRY IopDeviceActionRequestList
struct _ATTACH_FILTER_DRIVERS_CONTEXT * PATTACH_FILTER_DRIVERS_CONTEXT
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
return STATUS_NOT_SUPPORTED
NTSTATUS IopGetDriverNames(_In_ HANDLE ServiceHandle, _Out_ PUNICODE_STRING DriverName, _Out_opt_ PUNICODE_STRING ServiceName)
static NTSTATUS PiInitializeDevNode(_In_ PDEVICE_NODE DeviceNode)
#define STATUS_PLUGPLAY_NO_DEVICE
#define DNF_NON_STOPPED_REBALANCE
PDEVICE_OBJECT PhysicalDeviceObject
static NTSTATUS IopQueryRemoveChildDevices(PDEVICE_NODE ParentDeviceNode, BOOLEAN Force)
#define IRP_MN_QUERY_RESOURCES
enum _BUS_QUERY_ID_TYPE BUS_QUERY_ID_TYPE
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
static VOID IopCancelRemoveChildDevices(PDEVICE_NODE ParentDeviceNode)
static NTSTATUS PiEnumerateDevice(_In_ PDEVICE_NODE DeviceNode)
#define IRP_MN_REMOVE_DEVICE
#define STATUS_INSUFFICIENT_RESOURCES
struct _ATTACH_FILTER_DRIVERS_CONTEXT ATTACH_FILTER_DRIVERS_CONTEXT
_In_ ULONG _In_ ULONG _In_ ULONG Length
static VOID PiDevNodeStateMachine(_In_ PDEVICE_NODE RootNode)
#define PNP_DEVICE_REMOVED
static NTSTATUS NTAPI IopQueryRemoveDevice(IN PDEVICE_OBJECT DeviceObject)
PNP_DEVNODE_STATE PiSetDevNodeState(_In_ PDEVICE_NODE DeviceNode, _In_ PNP_DEVNODE_STATE NewState)
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
#define OBJ_CASE_INSENSITIVE
NTSTATUS PiIrpCancelStopDevice(_In_ PDEVICE_NODE DeviceNode)
#define DNUF_NOT_DISABLEABLE
NTSTATUS PiIrpQueryDeviceText(_In_ PDEVICE_NODE DeviceNode, _In_ LCID LocaleId, _In_ DEVICE_TEXT_TYPE Type, _Out_ PWSTR *DeviceText)
#define CM_PROB_HELD_FOR_EJECT
struct _DEVICE_ACTION_REQUEST DEVICE_ACTION_REQUEST
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING
#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS
PDEVICE_OBJECT Objects[1]
#define CM_PROB_OUT_OF_MEMORY
NTSTATUS NTAPI IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, IN ULONG CreateOptions, OUT PHANDLE Handle)
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
NTSTATUS PiIrpQueryResourceRequirements(_In_ PDEVICE_NODE DeviceNode, _Out_ PIO_RESOURCE_REQUIREMENTS_LIST *Resources)
enum _CM_SERVICE_LOAD_TYPE SERVICE_LOAD_TYPE
#define STATUS_FAILED_DRIVER_ENTRY
static VOID NTAPI IopCancelRemoveDevice(IN PDEVICE_OBJECT DeviceObject)
VOID NTAPI KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql)
#define DNF_NO_RESOURCE_REQUIRED
NTSTATUS PiIrpQueryStopDevice(_In_ PDEVICE_NODE DeviceNode)
VOID NTAPI IoAcquireVpbSpinLock(OUT PKIRQL Irql)
NTSYSAPI NTSTATUS NTAPI ZwQueryDefaultLocale(_In_ BOOLEAN UserProfile, _Out_ PLCID DefaultLocaleId)
#define DNF_HAS_BOOT_CONFIG
struct _IO_RESOURCE_REQUIREMENTS_LIST * PIO_RESOURCE_REQUIREMENTS_LIST
#define CM_PROB_FAILED_START
#define CM_PROB_FAILED_POST_START
static NTSTATUS PiIrpSendRemoveCheckVpb(_In_ PDEVICE_OBJECT DeviceObject, _In_ UCHAR MinorFunction)
Sends one of the remove IRPs to the device stack.
POBJECT_TYPE IoDriverObjectType
#define REG_OPENED_EXISTING_KEY
#define CM_PROB_FAILED_DRIVER_ENTRY
PDEVICE_OBJECT PhysicalDeviceObject
#define InsertTailList(ListHead, Entry)
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
NTSTATUS PiIrpStartDevice(_In_ PDEVICE_NODE DeviceNode)
#define OBJ_KERNEL_HANDLE
#define PNP_DEVICE_DISABLED
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
struct _DEVICE_NODE * Parent
#define PNP_DEVICE_DONT_DISPLAY_IN_UI
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
PLIST_ENTRY DriversListHead
static NTSTATUS IopRemoveDevice(PDEVICE_NODE DeviceNode)
#define RtlMoveMemory(Destination, Source, Length)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
static NTSTATUS IopQueryHardwareIds(PDEVICE_NODE DeviceNode, HANDLE InstanceKey)
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
NTSTATUS IopLoadDriver(_In_ HANDLE ServiceHandle, _Out_ PDRIVER_OBJECT *DriverObject)
_In_ PDEVICE_OBJECT DeviceObject
static NTSTATUS IopQueryCompatibleIds(PDEVICE_NODE DeviceNode, HANDLE InstanceKey)
return STATUS_NOT_IMPLEMENTED
NTSTATUS NTAPI IopCreateRegistryKeyEx(OUT PHANDLE Handle, IN HANDLE BaseHandle OPTIONAL, IN PUNICODE_STRING KeyName, IN ACCESS_MASK DesiredAccess, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL)
PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
struct _DEVICE_NODE * Child
KSPIN_LOCK IopDeviceActionLock
#define IRP_MN_QUERY_REMOVE_DEVICE
_Must_inspect_result_ typedef _Out_ PHIDP_CAPS Capabilities
#define DNUF_DONT_SHOW_IN_UI
NTSTATUS IopUpdateResourceMapForPnPDevice(IN PDEVICE_NODE DeviceNode)
PDEVICE_NODE PipAllocateDeviceNode(IN PDEVICE_OBJECT PhysicalDeviceObject)
static struct _test_info info[]
NTSTATUS NTAPI IopQueryDeviceCapabilities(PDEVICE_NODE DeviceNode, PDEVICE_CAPABILITIES DeviceCaps)
PDRIVER_EXTENSION DriverExtension
_In_ UCHAR _In_ UCHAR MinorFunction
LIST_ENTRY RequestListEntry
NTSTATUS PiPerformSyncDeviceAction(_In_ PDEVICE_OBJECT DeviceObject, _In_ DEVICE_ACTION Action)
Perfom a device operation synchronously via PiQueueDeviceAction.
_Must_inspect_result_ _In_opt_ PVOID _In_opt_ PVOID InstanceId
PDEVICE_OBJECT DeviceObject
static NTSTATUS IopCreateDeviceInstancePath(_In_ PDEVICE_NODE DeviceNode, _Out_ PUNICODE_STRING InstancePath)
struct _DEVICE_RELATIONS * PDEVICE_RELATIONS
#define IopDeviceNodeSetFlag(DeviceNode, Flag)
VOID NTAPI IopInstallCriticalDevice(PDEVICE_NODE DeviceNode)
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
#define DO_BUS_ENUMERATED_DEVICE
struct _PNP_BUS_INFORMATION * PPNP_BUS_INFORMATION
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
KEVENT PiEnumerationFinished
#define DeviceCapabilities
NTSTATUS PiIrpStopDevice(_In_ PDEVICE_NODE DeviceNode)
ADD_DEV_DRIVER_TYPE DriverType
#define VPB_REMOVE_PENDING
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)
PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
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 GLint GLint j
enum _DEVICE_ACTION DEVICE_ACTION
#define STATUS_ILL_FORMED_SERVICE_ENTRY
static VOID NTAPI IopSendRemoveDevice(IN PDEVICE_OBJECT DeviceObject)
#define REG_OPTION_NON_VOLATILE
enum _ADD_DEV_DRIVER_TYPE ADD_DEV_DRIVER_TYPE
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
VOID PiSetDevNodeProblem(_In_ PDEVICE_NODE DeviceNode, _In_ UINT32 Problem)
struct _LIST_ENTRY * Flink
#define CM_PROB_HARDWARE_DISABLED
NTSTATUS IopQueueTargetDeviceEvent(const GUID *Guid, PUNICODE_STRING DeviceIds)
#define IRP_MN_SURPRISE_REMOVAL
#define STATUS_OBJECT_TYPE_MISMATCH
#define ExInitializeWorkItem(Item, Routine, Context)
static BOOLEAN IopValidateID(_In_ PWCHAR Id, _In_ BUS_QUERY_ID_TYPE QueryType)
PDRIVER_OBJECT DriverObject
#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED
NTSTATUS IopSynchronousCall(IN PDEVICE_OBJECT DeviceObject, IN PIO_STACK_LOCATION IoStackLocation, OUT PVOID *Information)
USHORT NTAPI IopGetBusTypeGuidIndex(LPGUID BusTypeGuid)
NTSTATUS IopGetParentIdPrefix(PDEVICE_NODE DeviceNode, PUNICODE_STRING ParentIdPrefix)
#define TAG_PNP_DEVACTION
NTSTATUS CompletionStatus
#define NT_SUCCESS(StatCode)
PDEVICE_OBJECT IopGetDeviceObjectFromDeviceInstance(PUNICODE_STRING DeviceInstance)
NTSYSAPI NTSTATUS WINAPI RtlDuplicateUnicodeString(int, const UNICODE_STRING *, UNICODE_STRING *)
#define CM_PROB_DISABLED_SERVICE
static NTSTATUS PiCallDriverAddDevice(_In_ PDEVICE_NODE DeviceNode, _In_ BOOLEAN LoadDrivers)
Loads all drivers for a device node (actual service and filters) and calls their AddDevice routine.
#define ObDereferenceObject
static NTSTATUS PiAttachFilterDrivers(PLIST_ENTRY DriversListHead, PDEVICE_NODE DeviceNode, HANDLE EnumSubKey, HANDLE ClassKey, BOOLEAN Lower, BOOLEAN LoadDrivers)
Calls PiAttachFilterDriversCallback for filter drivers (if any)
_In_ GUID _In_ PVOID ValueData
#define PNP_DEVICE_NOT_DISABLEABLE
VOID FASTCALL KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, IN KIRQL OldIrql)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define REGSTR_VAL_CLASSGUID
static VOID IopSendRemoveChildDevices(PDEVICE_NODE ParentDeviceNode)
_Must_inspect_result_ _In_ KTMOBJECT_TYPE QueryType
static NTSTATUS NTAPI PiAttachFilterDriversCallback(PWSTR ValueName, ULONG ValueType, PVOID ValueData, ULONG ValueLength, PVOID Ctx, PVOID EntryContext)
Loads and/or returns the driver associated with the registry entry if the driver is enabled....
struct _RTL_QUERY_REGISTRY_TABLE RTL_QUERY_REGISTRY_TABLE
PDEVICE_NODE PopSystemPowerDeviceNode
static VOID NTAPI IopSendSurpriseRemoval(IN PDEVICE_OBJECT DeviceObject)
#define STATUS_UNSUCCESSFUL
WORK_QUEUE_ITEM IopDeviceActionWorkItem
#define ExAllocatePoolWithTag(hernya, size, tag)
static VOID NTAPI PipDeviceActionWorker(_In_opt_ PVOID Context)
#define IRP_MN_QUERY_BUS_INFORMATION
#define MAX_DEVICE_ID_LEN
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
static NTSTATUS PiUpdateDeviceState(_In_ PDEVICE_NODE DeviceNode)
Processes the IoInvalidateDeviceState request.
BOOLEAN PnPBootDriversInitialized
NTSTATUS PiIrpQueryResources(_In_ PDEVICE_NODE DeviceNode, _Out_ PCM_RESOURCE_LIST *Resources)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define ExAllocatePool(type, size)
#define CM_PROB_DRIVER_FAILED_LOAD
#define RTL_REGISTRY_HANDLE
#define DNF_LEGACY_DRIVER
static NTSTATUS IopPrepareDeviceForRemoval(PDEVICE_OBJECT DeviceObject, BOOLEAN Force)
_In_ PNDIS_STRING DeviceInstance
#define PNP_DEVICE_FAILED
static const WCHAR Cleanup[]
VOID NTAPI IoRequestDeviceEject(IN PDEVICE_OBJECT PhysicalDeviceObject)
int _cdecl swprintf(const WCHAR *,...)
KIRQL FASTCALL KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber)
#define IopDeviceNodeHasFlag(DeviceNode, Flag)
#define REGSTR_KEY_DEVICE_PROPERTIES
#define MAX_SEPARATORS_INSTANCEID
#define CM_PROB_NEED_RESTART
UNICODE_STRING InstancePath
static VOID IopSendRemoveDeviceRelations(PDEVICE_RELATIONS DeviceRelations)
KSPIN_LOCK IopDeviceTreeLock
PDRIVER_ADD_DEVICE AddDevice
static NTSTATUS NTAPI IopSendEject(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI IopGetRegistryValue(IN HANDLE Handle, IN PWSTR ValueName, OUT PKEY_VALUE_FULL_INFORMATION *Information)
#define KeInitializeEvent(pEvt, foo, foo2)
#define STATUS_OBJECT_NAME_NOT_FOUND
NTSTATUS NTAPI IopOpenRegistryKeyEx(PHANDLE KeyHandle, HANDLE ParentKey, PUNICODE_STRING Name, ACCESS_MASK DesiredAccess)
static VOID IopCancelPrepareDeviceForRemoval(PDEVICE_OBJECT DeviceObject)
static NTSTATUS IopQueryRemoveDeviceRelations(PDEVICE_RELATIONS DeviceRelations, BOOLEAN Force)
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
NTSTATUS PiIrpQueryPnPDeviceState(_In_ PDEVICE_NODE DeviceNode, _Out_ PPNP_DEVICE_STATE DeviceState)
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
#define DNF_RESOURCE_REQUIREMENTS_CHANGED
static VOID ErrorExit(LPTSTR lpszMessage)
#define InitializeListHead(ListHead)
PDEVICE_OBJECT NTAPI IoGetAttachedDevice(PDEVICE_OBJECT DeviceObject)
#define STATUS_PNP_REBOOT_REQUIRED
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define CM_PROB_DEVICE_NOT_THERE
#define KeReleaseSpinLock(sl, irql)
#define IRP_MN_QUERY_DEVICE_RELATIONS
struct _DEVICE_NODE * Sibling
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
static VOID IopCancelRemoveDeviceRelations(PDEVICE_RELATIONS DeviceRelations)
VOID PiNotifyTargetDeviceChange(_In_ LPCGUID Event, _In_ PDEVICE_OBJECT DeviceObject, _In_opt_ PTARGET_DEVICE_CUSTOM_NOTIFICATION CustomNotification)
Delivers the event to all drivers subscribed to EventCategoryTargetDeviceChange PnP event.
static VOID PiFakeResourceRebalance(_In_ PDEVICE_NODE DeviceNode)
ERESOURCE IopDriverLoadResource
VOID PiInsertDevNode(_In_ PDEVICE_NODE DeviceNode, _In_ PDEVICE_NODE ParentNode)
#define ObReferenceObject
static NTSTATUS PiStartDeviceFinal(_In_ PDEVICE_NODE DeviceNode)
static NTSTATUS IopSetServiceEnumData(_In_ PDEVICE_NODE DeviceNode, _In_ HANDLE InstanceHandle)
NTSTATUS NTAPI IopAssignDeviceResources(IN PDEVICE_NODE DeviceNode)
BOOLEAN IopDeviceActionInProgress
#define CM_PROB_DRIVER_SERVICE_KEY_INVALID
static const WCHAR ServicesKeyName[]
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
char * cleanup(char *str)
NTSTATUS * CompletionStatus
VOID PiQueueDeviceAction(_In_ PDEVICE_OBJECT DeviceObject, _In_ DEVICE_ACTION Action, _In_opt_ PKEVENT CompletionEvent, _Out_opt_ NTSTATUS *CompletionStatus)
Queue a device operation to a worker thread.
#define REG_OPTION_VOLATILE
#define CM_PROB_FAILED_ADD
_In_ WDFDEVICE _In_ PPNP_BUS_INFORMATION BusInformation
PDEVICE_NODE IopRootDeviceNode
VOID NTAPI KeClearEvent(IN PKEVENT Event)
#define RTL_QUERY_REGISTRY_REQUIRED
#define ExFreePoolWithTag(_P, _T)
NTSTATUS PiIrpQueryDeviceRelations(_In_ PDEVICE_NODE DeviceNode, _In_ DEVICE_RELATION_TYPE Type)
NTSTATUS NTAPI ObReferenceObjectByName(IN PUNICODE_STRING ObjectPath, IN ULONG Attributes, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext, OUT PVOID *ObjectPtr)
static SERVICE_STATUS status
#define KEY_CREATE_SUB_KEY
NTSTATUS NTAPI IopInitiatePnpIrp(IN PDEVICE_OBJECT DeviceObject, IN PIO_STATUS_BLOCK IoStatusBlock, IN UCHAR MinorFunction, IN PIO_STACK_LOCATION Stack)
VOID NTAPI IoReleaseVpbSpinLock(IN KIRQL Irql)
#define MAX_SEPARATORS_DEVICEID
struct _ADD_DEV_DRIVERS_LIST * PADD_DEV_DRIVERS_LIST
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
struct _DEVICE_ACTION_REQUEST * PDEVICE_ACTION_REQUEST
ADD_DEV_DRIVER_TYPE DriverType
VOID PiSetDevNodeText(_In_ PDEVICE_NODE DeviceNode, _In_ HANDLE InstanceKey)
Sets the DeviceNode's DeviceDesc and LocationInformation registry values.
PDEVICE_NODE FASTCALL IopGetDeviceNode(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS IopSetDeviceInstanceData(HANDLE InstanceKey, PDEVICE_NODE DeviceNode)
#define IRP_MN_QUERY_CAPABILITIES
PCONFIGURATION_COMPONENT_DATA RootNode
_Inout_ PVCB _In_ BOOLEAN Force
#define RTL_CONSTANT_STRING(s)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength