https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6cac5b8c9e70abaea48f808cd9085418c2f33a74

commit 6cac5b8c9e70abaea48f808cd9085418c2f33a74
Author:     Victor Perevertkin <[email protected]>
AuthorDate: Thu Jun 29 19:24:51 2023 +0300
Commit:     Victor Perevertkin <[email protected]>
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);

Reply via email to