https://git.reactos.org/?p=reactos.git;a=commitdiff;h=066337dc84f7c2a199a8f37913434825a36315d9

commit 066337dc84f7c2a199a8f37913434825a36315d9
Author:     Timo Kreuzer <[email protected]>
AuthorDate: Sat Jul 3 21:26:57 2021 +0200
Commit:     HervĂ© Poussineau <[email protected]>
CommitDate: Sat Jul 10 16:27:44 2021 +0200

    [VIDEOPRT] Refactor device map key creation
---
 win32ss/drivers/videoprt/dispatch.c |   7 ++-
 win32ss/drivers/videoprt/videoprt.c | 113 +++++++++++++++++++++++-------------
 2 files changed, 77 insertions(+), 43 deletions(-)

diff --git a/win32ss/drivers/videoprt/dispatch.c 
b/win32ss/drivers/videoprt/dispatch.c
index 7b900517fa8..6c01995de5e 100644
--- a/win32ss/drivers/videoprt/dispatch.c
+++ b/win32ss/drivers/videoprt/dispatch.c
@@ -347,9 +347,10 @@ IntVideoPortAddDevice(
                                                    DriverExtension,
                                                    PhysicalDeviceObject,
                                                    &DeviceObject);
-    if (NT_SUCCESS(Status))
-        VideoPortDeviceNumber++;
-
+    if (!NT_SUCCESS(Status))
+    {
+        ERR_(VIDEOPRT, "IntVideoPortCreateAdapterDeviceObject() failed with 
status 0x%lx\n", Status);
+    }
     return Status;
 }
 
diff --git a/win32ss/drivers/videoprt/videoprt.c 
b/win32ss/drivers/videoprt/videoprt.c
index b57cff52594..7e16abcc38e 100644
--- a/win32ss/drivers/videoprt/videoprt.c
+++ b/win32ss/drivers/videoprt/videoprt.c
@@ -37,7 +37,7 @@ BOOLEAN VpBaseVideo = FALSE;
 BOOLEAN VpNoVesa = FALSE;
 
 PKPROCESS CsrProcess = NULL;
-ULONG VideoPortDeviceNumber = 0;
+static ULONG VideoPortMaxObjectNumber = -1;
 KMUTEX VideoPortInt10Mutex;
 KSPIN_LOCK HwResetAdaptersLock;
 RTL_STATIC_LIST_HEAD(HwResetAdaptersList);
@@ -53,6 +53,64 @@ DriverEntry(
     return STATUS_SUCCESS;
 }
 
+static
+NTSTATUS
+IntVideoPortAddDeviceMapLink(
+    PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension)
+{
+    WCHAR DeviceBuffer[20];
+    UNICODE_STRING DeviceName;
+    WCHAR SymlinkBuffer[20];
+    UNICODE_STRING SymlinkName;
+    ULONG DeviceNumber;
+    NTSTATUS Status;
+
+    /* Create a unicode device name. */
+    DeviceNumber = DeviceExtension->DeviceNumber;
+    swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
+
+    /* Add entry to DEVICEMAP\VIDEO key in registry. */
+    Status = RtlWriteRegistryValue(RTL_REGISTRY_DEVICEMAP,
+                                   L"VIDEO",
+                                   DeviceBuffer,
+                                   REG_SZ,
+                                   DeviceExtension->RegistryPath.Buffer,
+                                   DeviceExtension->RegistryPath.Length + 
sizeof(UNICODE_NULL));
+    if (!NT_SUCCESS(Status))
+    {
+        ERR_(VIDEOPRT, "Failed to create DEViCEMAP registry entry: 0x%X\n", 
Status);
+        return Status;
+    }
+
+    Status = RtlWriteRegistryValue(RTL_REGISTRY_DEVICEMAP,
+                                   L"VIDEO",
+                                   L"MaxObjectNumber",
+                                   REG_DWORD,
+                                   &VideoPortMaxObjectNumber,
+                                   sizeof(VideoPortMaxObjectNumber));
+    if (!NT_SUCCESS(Status))
+    {
+        ERR_(VIDEOPRT, "Failed to write MaxObjectNumber: 0x%X\n", Status);
+        return Status;
+    }
+
+    /* Create symbolic link "\??\DISPLAYx" */
+    swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
+    RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
+    RtlInitUnicodeString(&DeviceName, DeviceBuffer);
+    Status = IoCreateSymbolicLink(&SymlinkName, &DeviceName);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR_(VIDEOPRT, "Failed to write MaxObjectNumber: 0x%X\n", Status);
+        return Status;
+    }
+
+    /* Update MaxObjectNumber */
+    VideoPortMaxObjectNumber = DeviceNumber;
+
+    return STATUS_SUCCESS;
+}
+
 PVOID
 NTAPI
 IntVideoPortImageDirectoryEntryToData(
@@ -114,8 +172,8 @@ IntVideoPortCreateAdapterDeviceObject(
      * Find the first free device number that can be used for video device
      * object names and symlinks.
      */
-    DeviceNumber = VideoPortDeviceNumber;
-    if (DeviceNumber == 0xFFFFFFFF)
+    DeviceNumber = VideoPortMaxObjectNumber + 1;
+    if (DeviceNumber == (ULONG)-1)
     {
         WARN_(VIDEOPRT, "Can't find free device number\n");
         return STATUS_UNSUCCESSFUL;
@@ -247,6 +305,17 @@ IntVideoPortCreateAdapterDeviceObject(
 
     /* Remove the initailizing flag */
     (*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING;
+
+    /* Set up the VIDEO/DEVICEMAP registry keys */
+    Status = IntVideoPortAddDeviceMapLink(DeviceExtension);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR_(VIDEOPRT, "IntVideoPortAddDeviceMapLink() failed with status 
0x%08x\n", Status);
+        IoDeleteDevice(*DeviceObject);
+        *DeviceObject = NULL;
+        return Status;
+    }
+
     return STATUS_SUCCESS;
 }
 
@@ -258,21 +327,14 @@ IntVideoPortFindAdapter(
     IN PVIDEO_PORT_DRIVER_EXTENSION DriverExtension,
     IN PDEVICE_OBJECT DeviceObject)
 {
-    WCHAR DeviceVideoBuffer[20];
     PVIDEO_PORT_DEVICE_EXTENSION DeviceExtension;
     NTSTATUS Status;
     VIDEO_PORT_CONFIG_INFO ConfigInfo;
     SYSTEM_BASIC_INFORMATION SystemBasicInfo;
     UCHAR Again = FALSE;
-    WCHAR DeviceBuffer[20];
-    UNICODE_STRING DeviceName;
-    WCHAR SymlinkBuffer[20];
-    UNICODE_STRING SymlinkName;
     BOOL LegacyDetection = FALSE;
-    ULONG DeviceNumber;
 
     DeviceExtension = 
(PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-    DeviceNumber = DeviceExtension->DeviceNumber;
 
     /* Setup a ConfigInfo structure that we will pass to HwFindAdapter. */
     RtlZeroMemory(&ConfigInfo, sizeof(VIDEO_PORT_CONFIG_INFO));
@@ -371,33 +433,6 @@ IntVideoPortFindAdapter(
      * such as creating symlinks or setting up interrupts and timer.
      */
 
-    /* Create a unicode device name. */
-    swprintf(DeviceBuffer, L"\\Device\\Video%lu", DeviceNumber);
-    RtlInitUnicodeString(&DeviceName, DeviceBuffer);
-
-    /* Create symbolic link "\??\DISPLAYx" */
-    swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
-    RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
-    IoCreateSymbolicLink(&SymlinkName, &DeviceName);
-
-    /* Add entry to DEVICEMAP\VIDEO key in registry. */
-    swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DeviceNumber);
-    RtlWriteRegistryValue(
-        RTL_REGISTRY_DEVICEMAP,
-        L"VIDEO",
-        DeviceVideoBuffer,
-        REG_SZ,
-        DeviceExtension->RegistryPath.Buffer,
-        DeviceExtension->RegistryPath.Length + sizeof(UNICODE_NULL));
-
-    RtlWriteRegistryValue(
-        RTL_REGISTRY_DEVICEMAP,
-        L"VIDEO",
-        L"MaxObjectNumber",
-        REG_DWORD,
-        &DeviceNumber,
-        sizeof(DeviceNumber));
-
     /* FIXME: Allocate hardware resources for device. */
 
     /* Allocate interrupt for device. */
@@ -771,9 +806,7 @@ VideoPortInitialize(
         }
 
         Status = IntVideoPortFindAdapter(DriverObject, DriverExtension, 
DeviceObject);
-        if (NT_SUCCESS(Status))
-            VideoPortDeviceNumber++;
-        else
+        if (!NT_SUCCESS(Status))
             ERR_(VIDEOPRT, "IntVideoPortFindAdapter returned 0x%x\n", Status);
 
         return Status;

Reply via email to