18 #define ENUM_NAME_ROOT L"Root" 107 for (NextEntry = DeviceExtension->DeviceListHead.
Flink;
108 NextEntry != &DeviceExtension->DeviceListHead;
109 NextEntry = NextEntry->
Flink)
168 InstancePath[0] =
L'\\';
194 WCHAR InstancePath[5];
200 HANDLE EnumHandle, DeviceKeyHandle =
NULL, InstanceKeyHandle;
216 DPRINT1(
"ExAllocatePoolWithTag() failed\n");
227 DPRINT(
"ExAllocatePoolWithTag() failed\n");
232 Device->DeviceID = DevicePath;
233 RtlInitEmptyUnicodeString(&DevicePath,
NULL, 0);
249 DPRINT1(
"Failed to open registry key\n");
260 (
PWSTR)DeviceKeyHandle,
266 for (NextInstance = 0; NextInstance <= 9999; NextInstance++)
268 _snwprintf(InstancePath,
sizeof(InstancePath) /
sizeof(
WCHAR),
L"%04lu", NextInstance);
274 if (NextInstance > 9999)
282 _snwprintf(InstancePath,
sizeof(InstancePath) /
sizeof(
WCHAR),
L"%04lu", NextInstance);
286 DPRINT1(
"NextInstance value is corrupt! (%lu)\n", NextInstance);
288 (
PWSTR)DeviceKeyHandle,
295 (
PWSTR)DeviceKeyHandle,
299 sizeof(NextInstance));
302 DPRINT1(
"Failed to write new NextInstance value! (0x%x)\n",
Status);
328 if (FullInstancePath)
330 FullInstancePath->MaximumLength =
Device->DeviceID.Length + PathSep.
Length +
Device->InstanceID.Length;
331 FullInstancePath->Length = 0;
333 if (!FullInstancePath->Buffer)
355 DPRINT(
"IoCreateDevice() failed with status 0x%08lx\n",
Status);
389 if (DeviceKeyHandle !=
NULL)
439 if (BinaryValue ==
NULL)
442 *
Buffer->Data = BinaryValue;
472 DPRINT(
"ExAllocatePoolWithTag() failed\n");
479 Device->DeviceID = *DevicePath;
480 RtlInitEmptyUnicodeString(DevicePath,
NULL, 0);
483 DPRINT1(
"RtlCreateUnicodeString() failed\n");
493 DPRINT1(
"IopOpenRegistryKeyEx() failed for '%wZ' with status 0x%lx\n",
539 DeviceExtension->DeviceListCount++;
543 if (DeviceKeyHandle !=
NULL)
569 ULONG KeyInfoSize, SubKeyInfoSize;
571 ULONG Index1, Index2;
586 DPRINT(
"ExAllocatePoolWithTag() failed\n");
590 SubKeyInfoSize = KeyInfoSize;
596 DPRINT(
"ExAllocatePoolWithTag() failed\n");
630 ASSERT(KeyInfoSize < ResultSize);
631 KeyInfoSize = ResultSize;
638 DPRINT1(
"ExAllocatePoolWithTag(%lu) failed\n", KeyInfoSize);
646 DPRINT(
"ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
666 DPRINT(
"IopOpenRegistryKeyEx() failed for '%wZ' with status 0x%lx\n",
689 ASSERT(SubKeyInfoSize < ResultSize);
690 SubKeyInfoSize = ResultSize;
697 DPRINT1(
"ExAllocatePoolWithTag(%lu) failed\n", SubKeyInfoSize);
705 DPRINT(
"ZwEnumerateKey() failed with status 0x%08lx\n",
Status);
710 SubKeyInfo->Name[SubKeyInfo->NameLength /
sizeof(
WCHAR)] = 0;
720 DPRINT1(
"ExAllocatePoolWithTag() failed\n");
727 DPRINT(
"Found device %wZ\\%S!\n", &DevicePath, SubKeyInfo->Name);
789 DPRINT(
"EnumerateDevices() failed with status 0x%08lx\n",
Status);
806 DPRINT(
"ExAllocatePoolWithTag() failed\n");
813 Relations->
Count = OtherRelations->Count;
822 NextEntry = NextEntry->
Flink)
841 DPRINT(
"IoCreateDevice() failed with status 0x%08lx\n",
Status);
905 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS\n");
910 DPRINT(
"IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
925 DPRINT(
"IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n");
957 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / TargetDeviceRelation\n");
961 DPRINT(
"ExAllocatePoolWithTag() failed\n");
967 Relations->
Count = 1;
1027 return Irp->IoStatus.Status;
1061 return Irp->IoStatus.Status;
1083 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / DeviceTextDescription\n");
1097 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / DeviceTextLocationInformation\n");
1103 DPRINT1(
"IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / unknown query id type 0x%lx\n", DeviceTextType);
1128 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
1148 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
1160 DPRINT1(
"IRP_MJ_PNP / IRP_MN_QUERY_ID / unknown query id type 0x%lx\n",
IdType);
1183 &GUID_BUS_TYPE_INTERNAL,
1221 DPRINT(
"IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
1230 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_CAPABILITIES\n");
1235 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_RESOURCES\n");
1240 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
1245 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
1250 DPRINT(
"IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
1288 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_PNP_DEVICE_STATE\n");
1292 DPRINT(
"IRP_MJ_PNP / IRP_MN_QUERY_BUS_INFORMATION\n");
1409 DPRINT(
"IoCreateDevice() failed with status 0x%08lx\n",
Status);
1426 &DeviceExtension->
Ldo);
1429 DPRINT(
"IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n",
Status);
1435 DPRINT(
"Done AddDevice()\n");
1499 &IopPfnDumpDeviceObject);
1502 DPRINT1(
"Creating PFN Dump device failed with %lx\n",
Status);
#define DO_DEVICE_INITIALIZING
#define STATUS_REVISION_MISMATCH
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
static NTSTATUS EnumerateDevices(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS PnpRootRegisterDevice(IN PDEVICE_OBJECT DeviceObject)
#define IRP_MN_QUERY_RESOURCES
enum _BUS_QUERY_ID_TYPE BUS_QUERY_ID_TYPE
#define IRP_MN_REMOVE_DEVICE
#define STATUS_INSUFFICIENT_RESOURCES
UNICODE_STRING DeviceDescription
#define STATUS_NO_MORE_ENTRIES
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING SubKeyName
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
#define OBJ_CASE_INSENSITIVE
#define IRP_MN_QUERY_POWER
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
VOID FASTCALL KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
struct _PNPROOT_PDO_DEVICE_EXTENSION * PPNPROOT_PDO_DEVICE_EXTENSION
struct _DEVICE_OBJECT * PDEVICE_OBJECT
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS
VOID NTAPI MmDumpArmPfnDatabase(IN BOOLEAN StatusOnly)
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PCM_RESOURCE_LIST ResourceList
#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS
PDEVICE_OBJECT Objects[1]
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
PPNPROOT_DEVICE DeviceInfo
static NTSTATUS PdoQueryId(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp)
#define REGSTR_PATH_SYSTEMENUM
struct _PNPROOT_DEVICE * PPNPROOT_DEVICE
static NTSTATUS CreateDeviceFromRegistry(_Inout_ PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension, _Inout_ PUNICODE_STRING DevicePath, _In_ PCWSTR InstanceId, _In_ HANDLE SubKeyHandle)
#define STATUS_INVALID_DEVICE_REQUEST
IN PVOID IN PVOID IN USHORT IN USHORT Size
struct _PNPROOT_COMMON_DEVICE_EXTENSION * PPNPROOT_COMMON_DEVICE_EXTENSION
static NTSTATUS PdoQueryDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp)
static NTSTATUS PdoQueryBusInformation(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp)
PDEVICE_OBJECT PhysicalDeviceObject
#define InsertTailList(ListHead, Entry)
static NTSTATUS PnpRootFdoPnpControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
enum _DEVICE_TEXT_TYPE DEVICE_TEXT_TYPE
#define OBJ_KERNEL_HANDLE
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
static NTSTATUS PdoQueryResources(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp)
PNPROOT_COMMON_DEVICE_EXTENSION Common
#define STATUS_BUFFER_TOO_SMALL
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext(_Inout_ PIRP Irp)
_In_ PDEVICE_OBJECT DeviceObject
PNPROOT_DEVICE_STATE State
struct _PNPROOT_FDO_DEVICE_EXTENSION * PPNPROOT_FDO_DEVICE_EXTENSION
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define FILE_DEVICE_CONTROLLER
NTSYSAPI NTSTATUS WINAPI RtlWriteRegistryValue(ULONG, PCWSTR, PCWSTR, ULONG, PVOID, ULONG)
#define REGSTR_KEY_ROOTENUM
PDRIVER_EXTENSION DriverExtension
_Must_inspect_result_ _In_opt_ PVOID _In_opt_ PVOID InstanceId
struct _DEVICE_RELATIONS * PDEVICE_RELATIONS
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
int _snwprintf(wchar_t *buffer, size_t count, const wchar_t *format,...)
#define RTL_QUERY_REGISTRY_SUBKEY
#define DO_BUS_ENUMERATED_DEVICE
struct _PNP_BUS_INFORMATION * PPNP_BUS_INFORMATION
#define IoCompleteRequest
#define DeviceCapabilities
NTSTATUS NTAPI PnpRootAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
_In_ BUS_QUERY_ID_TYPE IdType
#define FILE_AUTOGENERATED_DEVICE_NAME
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)
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
NTSTATUS PnpRootCreateDevice(IN PUNICODE_STRING ServiceName, IN OPTIONAL PDRIVER_OBJECT DriverObject, OUT PDEVICE_OBJECT *PhysicalDeviceObject, OUT OPTIONAL PUNICODE_STRING FullInstancePath)
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
struct _LIST_ENTRY * Flink
#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE
#define IRP_MN_STOP_DEVICE
NTSTATUS NTAPI IoAttachDeviceToDeviceStackSafe(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice, IN OUT PDEVICE_OBJECT *AttachedToDeviceObject)
#define NT_SUCCESS(StatCode)
NTSYSAPI NTSTATUS WINAPI RtlDuplicateUnicodeString(int, const UNICODE_STRING *, UNICODE_STRING *)
#define STATUS_NO_SUCH_DEVICE
struct _PNPROOT_PDO_DEVICE_EXTENSION PNPROOT_PDO_DEVICE_EXTENSION
#define IRP_MN_START_DEVICE
_In_ GUID _In_ PVOID ValueData
NTSTATUS NTAPI PnpRootDriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
#define IRP_MN_QUERY_DEVICE_TEXT
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING _Out_ PNDIS_HANDLE SubKeyHandle
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IRP_MN_QUERY_BUS_INFORMATION
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
PDRIVER_OBJECT IopRootDriverObject
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
static NTSTATUS PnpRootQueryDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
static NTSTATUS NTAPI QueryBinaryValueCallback(IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext)
NTSYSAPI NTSTATUS WINAPI RtlDeleteRegistryValue(ULONG, PCWSTR, PCWSTR)
#define ExAllocatePool(type, size)
#define RTL_REGISTRY_HANDLE
static PDEVICE_OBJECT PnpRootDeviceObject
_Must_inspect_result_ _In_ WDFDEVICE Device
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
PDRIVER_ADD_DEVICE AddDevice
VOID FASTCALL KeInitializeGuardedMutex(OUT PKGUARDED_MUTEX GuardedMutex)
NTSTATUS NTAPI IopOpenRegistryKeyEx(PHANDLE KeyHandle, HANDLE ParentKey, PUNICODE_STRING Name, ACCESS_MASK DesiredAccess)
#define STATUS_BUFFER_OVERFLOW
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
#define InitializeListHead(ListHead)
_In_ PIO_STACK_LOCATION IrpSp
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
static NTSTATUS NTAPI PnpRootPnpControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PNPROOT_COMMON_DEVICE_EXTENSION Common
#define FIELD_OFFSET(t, f)
struct _PNPROOT_COMMON_DEVICE_EXTENSION PNPROOT_COMMON_DEVICE_EXTENSION
KGUARDED_MUTEX DeviceListLock
#define FILE_DEVICE_UNKNOWN
#define IRP_MN_QUERY_DEVICE_RELATIONS
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
UNICODE_STRING * PUNICODE_STRING
VOID FASTCALL KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
#define ObReferenceObject
UNICODE_STRING InstanceID
LIST_ENTRY DeviceListHead
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 InitializeObjectAttributes(p, n, a, r, s)
char * cleanup(char *str)
#define RtlCopyMemory(Destination, Source, Length)
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
#define FILE_DEVICE_SECURE_OPEN
static NTSTATUS PdoQueryCapabilities(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp)
static NTSTATUS PdoQueryDeviceText(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp)
#define REG_OPTION_VOLATILE
#define ExFreePoolWithTag(_P, _T)
static NTSTATUS PdoQueryResourceRequirements(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp)
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList
#define FILE_DEVICE_BUS_EXTENDER
#define RTL_QUERY_REGISTRY_REQUIRED
static NTSTATUS NTAPI PnpRootPowerControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
static NTSTATUS PnpRootPdoPnpControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IRP_MN_QUERY_PNP_DEVICE_STATE
struct _PNPROOT_DEVICE PNPROOT_DEVICE
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
#define RTL_QUERY_REGISTRY_DIRECT
static NTSTATUS NTAPI QueryStringCallback(IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext)
static NTSTATUS LocateChildDevice(IN PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension, IN PCUNICODE_STRING DeviceId, IN PCWSTR InstanceId, OUT PPNPROOT_DEVICE *ChildDevice)
PDEVICE_NODE FASTCALL IopGetDeviceNode(IN PDEVICE_OBJECT DeviceObject)
#define IRP_MN_QUERY_CAPABILITIES
struct _PNPROOT_FDO_DEVICE_EXTENSION PNPROOT_FDO_DEVICE_EXTENSION
#define KEY_ENUMERATE_SUB_KEYS
#define RTL_CONSTANT_STRING(s)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
PULONG MinorVersion OPTIONAL