https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6cac5b8c9e70abaea48f80...
commit 6cac5b8c9e70abaea48f808cd9085418c2f33a74 Author: Victor Perevertkin victor.perevertkin@reactos.org AuthorDate: Thu Jun 29 19:24:51 2023 +0300 Commit: Victor Perevertkin victor.perevertkin@reactos.org CommitDate: Thu Jun 29 19:25:28 2023 +0300
[NTOS:PNP] Refactor PnpRootCreateDevice
- Remove unused "DriverObject" argument - Make "FullInstancePath" mandatory - Extract the PDO creation into separate function, it will be used later --- ntoskrnl/include/internal/io.h | 7 +++-- ntoskrnl/io/pnpmgr/pnpreport.c | 7 +++-- ntoskrnl/io/pnpmgr/pnproot.c | 70 ++++++++++++++++++++++-------------------- 3 files changed, 46 insertions(+), 38 deletions(-)
diff --git a/ntoskrnl/include/internal/io.h b/ntoskrnl/include/internal/io.h index c4cb5c366cb..680e20ef4e0 100644 --- a/ntoskrnl/include/internal/io.h +++ b/ntoskrnl/include/internal/io.h @@ -1063,12 +1063,15 @@ PnpRootDriverEntry( IN PUNICODE_STRING RegistryPath );
+NTSTATUS +PnpRootCreateDeviceObject( + OUT PDEVICE_OBJECT *DeviceObject); + NTSTATUS PnpRootCreateDevice( IN PUNICODE_STRING ServiceName, - IN OPTIONAL PDRIVER_OBJECT DriverObject, OUT PDEVICE_OBJECT *PhysicalDeviceObject, - OUT OPTIONAL PUNICODE_STRING FullInstancePath + OUT PUNICODE_STRING FullInstancePath );
NTSTATUS diff --git a/ntoskrnl/io/pnpmgr/pnpreport.c b/ntoskrnl/io/pnpmgr/pnpreport.c index 9f6f06688bd..735760f8c4f 100644 --- a/ntoskrnl/io/pnpmgr/pnpreport.c +++ b/ntoskrnl/io/pnpmgr/pnpreport.c @@ -223,7 +223,7 @@ IoReportDetectedDevice( }
/* We use the caller's PDO if they supplied one */ - UNICODE_STRING instancePath; + UNICODE_STRING instancePath = {0}; if (DeviceObject && *DeviceObject) { Pdo = *DeviceObject; @@ -231,7 +231,7 @@ IoReportDetectedDevice( else { /* Create the PDO */ - Status = PnpRootCreateDevice(&ServiceName, NULL, &Pdo, &instancePath); + Status = PnpRootCreateDevice(&ServiceName, &Pdo, &instancePath); if (!NT_SUCCESS(Status)) { DPRINT("PnpRootCreateDevice() failed (Status 0x%08lx)\n", Status); @@ -247,7 +247,8 @@ IoReportDetectedDevice( return STATUS_INSUFFICIENT_RESOURCES; }
- Status = RtlDuplicateUnicodeString(0, &instancePath, &DeviceNode->InstancePath); + // The string comes from PnpRootCreateDevice, so it can be used right away + DeviceNode->InstancePath = instancePath;
/* Open a handle to the instance path key */ Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, REG_OPTION_NON_VOLATILE, &InstanceKey); diff --git a/ntoskrnl/io/pnpmgr/pnproot.c b/ntoskrnl/io/pnpmgr/pnproot.c index 4a9ae6607b5..b0948da4882 100644 --- a/ntoskrnl/io/pnpmgr/pnproot.c +++ b/ntoskrnl/io/pnpmgr/pnproot.c @@ -108,6 +108,7 @@ PnpRootRegisterDevice( IN PDEVICE_OBJECT DeviceObject) { PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension = &PnpRootDOExtension; + PPNPROOT_PDO_DEVICE_EXTENSION PdoDeviceExtension; PPNPROOT_DEVICE Device; PDEVICE_NODE DeviceNode; PWSTR InstancePath; @@ -147,6 +148,10 @@ PnpRootRegisterDevice(
Device->Pdo = DeviceObject;
+ PdoDeviceExtension = DeviceObject->DeviceExtension; + RtlZeroMemory(PdoDeviceExtension, sizeof(PNPROOT_PDO_DEVICE_EXTENSION)); + PdoDeviceExtension->DeviceInfo = Device; + KeAcquireGuardedMutex(&DeviceExtension->DeviceListLock); InsertTailList(&DeviceExtension->DeviceListHead, &Device->ListEntry); @@ -158,13 +163,28 @@ PnpRootRegisterDevice( return STATUS_SUCCESS; }
+NTSTATUS +PnpRootCreateDeviceObject( + OUT PDEVICE_OBJECT *DeviceObject) +{ + NTSTATUS status = IoCreateDevice( + IopRootDriverObject, + sizeof(PNPROOT_PDO_DEVICE_EXTENSION), + NULL, + FILE_DEVICE_CONTROLLER, + FILE_AUTOGENERATED_DEVICE_NAME, + FALSE, + DeviceObject); + + return status; +} + /* Creates a new PnP device for a legacy driver */ NTSTATUS PnpRootCreateDevice( IN PUNICODE_STRING ServiceName, - IN OPTIONAL PDRIVER_OBJECT DriverObject, OUT PDEVICE_OBJECT *PhysicalDeviceObject, - OUT OPTIONAL PUNICODE_STRING FullInstancePath) + OUT PUNICODE_STRING FullInstancePath) { PPNPROOT_FDO_DEVICE_EXTENSION DeviceExtension; PPNPROOT_PDO_DEVICE_EXTENSION PdoDeviceExtension; @@ -172,7 +192,6 @@ PnpRootCreateDevice( WCHAR InstancePath[5]; PPNPROOT_DEVICE Device = NULL; NTSTATUS Status; - UNICODE_STRING PathSep = RTL_CONSTANT_STRING(L"\"); ULONG NextInstance; UNICODE_STRING EnumKeyName = RTL_CONSTANT_STRING(L"\Registry\Machine\" REGSTR_PATH_SYSTEMENUM); HANDLE EnumHandle, DeviceKeyHandle = NULL, InstanceKeyHandle; @@ -207,7 +226,7 @@ PnpRootCreateDevice( goto cleanup; } RtlZeroMemory(Device, sizeof(PNPROOT_DEVICE)); - Device->DeviceID = DevicePath; + Device->DeviceID = DevicePath; // "Root<service_name>" RtlInitEmptyUnicodeString(&DevicePath, NULL, 0);
Status = IopOpenRegistryKeyEx(&EnumHandle, NULL, &EnumKeyName, KEY_READ); @@ -278,6 +297,7 @@ tryagain: goto cleanup; }
+ // "0000" or higher if (!RtlCreateUnicodeString(&Device->InstanceID, InstancePath)) { Status = STATUS_NO_MEMORY; @@ -300,31 +320,22 @@ tryagain: /* Just close the handle */ ObCloseHandle(InstanceKeyHandle, KernelMode);
- if (FullInstancePath) + // generate the full device instance path + FullInstancePath->MaximumLength = Device->DeviceID.Length + sizeof(L'\') + Device->InstanceID.Length; + FullInstancePath->Length = 0; + FullInstancePath->Buffer = ExAllocatePool(PagedPool, FullInstancePath->MaximumLength); + if (!FullInstancePath->Buffer) { - FullInstancePath->MaximumLength = Device->DeviceID.Length + PathSep.Length + Device->InstanceID.Length; - FullInstancePath->Length = 0; - FullInstancePath->Buffer = ExAllocatePool(PagedPool, FullInstancePath->MaximumLength); - if (!FullInstancePath->Buffer) - { - Status = STATUS_NO_MEMORY; - goto cleanup; - } - - RtlAppendUnicodeStringToString(FullInstancePath, &Device->DeviceID); - RtlAppendUnicodeStringToString(FullInstancePath, &PathSep); - RtlAppendUnicodeStringToString(FullInstancePath, &Device->InstanceID); + Status = STATUS_NO_MEMORY; + goto cleanup; }
+ RtlAppendUnicodeStringToString(FullInstancePath, &Device->DeviceID); + RtlAppendUnicodeToString(FullInstancePath, L"\"); + RtlAppendUnicodeStringToString(FullInstancePath, &Device->InstanceID); + /* Initialize a device object */ - Status = IoCreateDevice( - DriverObject ? DriverObject : IopRootDeviceNode->PhysicalDeviceObject->DriverObject, - sizeof(PNPROOT_PDO_DEVICE_EXTENSION), - NULL, - FILE_DEVICE_CONTROLLER, - FILE_AUTOGENERATED_DEVICE_NAME, - FALSE, - &Device->Pdo); + Status = PnpRootCreateDeviceObject(&Device->Pdo); if (!NT_SUCCESS(Status)) { DPRINT("IoCreateDevice() failed with status 0x%08lx\n", Status); @@ -923,14 +934,7 @@ PnpRootQueryDeviceRelations( { /* Create a physical device object for the * device as it does not already have one */ - Status = IoCreateDevice( - DeviceObject->DriverObject, - sizeof(PNPROOT_PDO_DEVICE_EXTENSION), - NULL, - FILE_DEVICE_CONTROLLER, - FILE_AUTOGENERATED_DEVICE_NAME, - FALSE, - &Device->Pdo); + Status = PnpRootCreateDeviceObject(&Device->Pdo); if (!NT_SUCCESS(Status)) { DPRINT("IoCreateDevice() failed with status 0x%08lx\n", Status);