https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6739fb1bc34249386d09d…
commit 6739fb1bc34249386d09d36058b7ac0f1fc78a37
Author:     Hervé Poussineau <hpoussin(a)reactos.org>
AuthorDate: Sat Jun 19 17:07:13 2021 +0200
Commit:     Hervé Poussineau <hpoussin(a)reactos.org>
CommitDate: Sat Jul 10 16:27:44 2021 +0200
    [WIN32K] Move detection of available display devices a new fonction
EngpUpdateGraphicsDeviceList
    - rewrite InitVideo() to call this new function
    - also call it at the start of UserEnumDisplayDevices, to detect new potential devices
---
 win32ss/gdi/eng/device.c      | 78 +++++++++++++++++++++++++++++++++++++
 win32ss/gdi/eng/device.h      |  3 ++
 win32ss/user/ntuser/display.c | 90 ++++---------------------------------------
 win32ss/user/ntuser/ntuser.h  |  6 +++
 4 files changed, 95 insertions(+), 82 deletions(-)
diff --git a/win32ss/gdi/eng/device.c b/win32ss/gdi/eng/device.c
index d3503009c1a..a02ef9d3a32 100644
--- a/win32ss/gdi/eng/device.c
+++ b/win32ss/gdi/eng/device.c
@@ -32,6 +32,84 @@ InitDeviceImpl(VOID)
     return STATUS_SUCCESS;
 }
+NTSTATUS
+EngpUpdateGraphicsDeviceList(VOID)
+{
+    ULONG iDevNum, iVGACompatible = -1, ulMaxObjectNumber = 0;
+    WCHAR awcDeviceName[20];
+    WCHAR awcBuffer[256];
+    NTSTATUS Status;
+    PGRAPHICS_DEVICE pGraphicsDevice;
+    ULONG cbValue;
+    HKEY hkey;
+
+    /* Open the key for the adapters */
+    Status = RegOpenKey(L"\\Registry\\Machine\\HARDWARE\\DEVICEMAP\\VIDEO",
&hkey);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("Could not open HARDWARE\\DEVICEMAP\\VIDEO registry key:0x%lx\n",
Status);
+        return Status;
+    }
+
+    /* Read the name of the VGA adapter */
+    cbValue = sizeof(awcDeviceName);
+    Status = RegQueryValue(hkey, L"VgaCompatible", REG_SZ, awcDeviceName,
&cbValue);
+    if (NT_SUCCESS(Status))
+    {
+        iVGACompatible =
_wtoi(&awcDeviceName[sizeof("\\Device\\Video")-1]);
+        ERR("VGA adapter = %lu\n", iVGACompatible);
+    }
+
+    /* Get the maximum mumber of adapters */
+    if (!RegReadDWORD(hkey, L"MaxObjectNumber", &ulMaxObjectNumber))
+    {
+        ERR("Could not read MaxObjectNumber, defaulting to 0.\n");
+    }
+
+    TRACE("Found %lu devices\n", ulMaxObjectNumber + 1);
+
+    /* Loop through all adapters */
+    for (iDevNum = 0; iDevNum <= ulMaxObjectNumber; iDevNum++)
+    {
+        /* Create the adapter's key name */
+        swprintf(awcDeviceName, L"\\Device\\Video%lu", iDevNum);
+
+        /* Read the reg key name */
+        cbValue = sizeof(awcBuffer);
+        Status = RegQueryValue(hkey, awcDeviceName, REG_SZ, awcBuffer, &cbValue);
+        if (!NT_SUCCESS(Status))
+        {
+            ERR("failed to query the registry path:0x%lx\n", Status);
+            continue;
+        }
+
+        /* Initialize the driver for this device */
+        pGraphicsDevice = InitDisplayDriver(awcDeviceName, awcBuffer);
+        if (!pGraphicsDevice) continue;
+
+        /* Check if this is a VGA compatible adapter */
+        if (pGraphicsDevice->StateFlags & DISPLAY_DEVICE_VGA_COMPATIBLE)
+        {
+            /* Save this as the VGA adapter */
+            if (!gpVgaGraphicsDevice)
+                gpVgaGraphicsDevice = pGraphicsDevice;
+            TRACE("gpVgaGraphicsDevice = %p\n", gpVgaGraphicsDevice);
+        }
+        else
+        {
+            /* Set the first one as primary device */
+            if (!gpPrimaryGraphicsDevice)
+                gpPrimaryGraphicsDevice = pGraphicsDevice;
+            TRACE("gpPrimaryGraphicsDevice = %p\n", gpPrimaryGraphicsDevice);
+        }
+    }
+
+    /* Close the device map registry key */
+    ZwClose(hkey);
+
+    return STATUS_SUCCESS;
+}
+
 BOOLEAN
 EngpPopulateDeviceModeList(
     _Inout_ PGRAPHICS_DEVICE pGraphicsDevice,
diff --git a/win32ss/gdi/eng/device.h b/win32ss/gdi/eng/device.h
index b74649daa73..c66e4cf0ad6 100644
--- a/win32ss/gdi/eng/device.h
+++ b/win32ss/gdi/eng/device.h
@@ -39,6 +39,9 @@ EngpPopulateDeviceModeList(
     _Inout_ PGRAPHICS_DEVICE pGraphicsDevice,
     _In_ PDEVMODEW pdmDefault);
+NTSTATUS
+EngpUpdateGraphicsDeviceList(VOID);
+
 CODE_SEG("INIT")
 NTSTATUS
 NTAPI
diff --git a/win32ss/user/ntuser/display.c b/win32ss/user/ntuser/display.c
index 3c39c05ec35..676b7d0420c 100644
--- a/win32ss/user/ntuser/display.c
+++ b/win32ss/user/ntuser/display.c
@@ -155,12 +155,7 @@ NTSTATUS
 NTAPI
 InitVideo(VOID)
 {
-    ULONG iDevNum, iVGACompatible = -1, ulMaxObjectNumber = 0;
-    WCHAR awcDeviceName[20];
-    WCHAR awcBuffer[256];
     NTSTATUS Status;
-    PGRAPHICS_DEVICE pGraphicsDevice;
-    ULONG cbValue;
     HKEY hkey;
     TRACE("----------------------------- InitVideo()
-------------------------------\n");
@@ -173,85 +168,10 @@ InitVideo(VOID)
     if (gbBaseVideo)
         ERR("VGA mode requested.\n");
-    /* Open the key for the adapters */
-    Status = RegOpenKey(KEY_VIDEO, &hkey);
+    /* Initialize all display devices */
+    Status = EngpUpdateGraphicsDeviceList();
     if (!NT_SUCCESS(Status))
-    {
-        ERR("Could not open HARDWARE\\DEVICEMAP\\VIDEO registry key:0x%lx\n",
Status);
         return Status;
-    }
-
-    /* Read the name of the VGA adapter */
-    cbValue = sizeof(awcDeviceName);
-    Status = RegQueryValue(hkey, L"VgaCompatible", REG_SZ, awcDeviceName,
&cbValue);
-    if (NT_SUCCESS(Status))
-    {
-        iVGACompatible =
_wtoi(&awcDeviceName[sizeof("\\Device\\Video")-1]);
-        ERR("VGA adapter = %lu\n", iVGACompatible);
-    }
-
-    /* Get the maximum mumber of adapters */
-    if (!RegReadDWORD(hkey, L"MaxObjectNumber", &ulMaxObjectNumber))
-    {
-        ERR("Could not read MaxObjectNumber, defaulting to 0.\n");
-    }
-
-    TRACE("Found %lu devices\n", ulMaxObjectNumber + 1);
-
-    /* Loop through all adapters */
-    for (iDevNum = 0; iDevNum <= ulMaxObjectNumber; iDevNum++)
-    {
-        /* Create the adapter's key name */
-        swprintf(awcDeviceName, L"\\Device\\Video%lu", iDevNum);
-
-        /* Read the reg key name */
-        cbValue = sizeof(awcBuffer);
-        Status = RegQueryValue(hkey, awcDeviceName, REG_SZ, awcBuffer, &cbValue);
-        if (!NT_SUCCESS(Status))
-        {
-            ERR("failed to query the registry path:0x%lx\n", Status);
-            continue;
-        }
-
-        /* Initialize the driver for this device */
-        pGraphicsDevice = InitDisplayDriver(awcDeviceName, awcBuffer);
-        if (!pGraphicsDevice) continue;
-
-        /* Check if this is a VGA compatible adapter */
-        if (pGraphicsDevice->StateFlags & DISPLAY_DEVICE_VGA_COMPATIBLE)
-        {
-            /* Save this as the VGA adapter */
-            if (!gpVgaGraphicsDevice)
-                gpVgaGraphicsDevice = pGraphicsDevice;
-            TRACE("gpVgaGraphicsDevice = %p\n", gpVgaGraphicsDevice);
-        }
-        else
-        {
-            /* Set the first one as primary device */
-            if (!gpPrimaryGraphicsDevice)
-                gpPrimaryGraphicsDevice = pGraphicsDevice;
-            TRACE("gpPrimaryGraphicsDevice = %p\n", gpPrimaryGraphicsDevice);
-        }
-    }
-
-    /* Close the device map registry key */
-    ZwClose(hkey);
-
-    /* Was VGA mode requested? */
-    if (gbBaseVideo)
-    {
-        /* Check if we found a VGA compatible device */
-        if (gpVgaGraphicsDevice)
-        {
-            /* Set the VgaAdapter as primary */
-            gpPrimaryGraphicsDevice = gpVgaGraphicsDevice;
-            // FIXME: DEVMODE
-        }
-        else
-        {
-            ERR("Could not find VGA compatible driver. Trying normal.\n");
-        }
-    }
     /* Check if we had any success */
     if (!gpPrimaryGraphicsDevice)
@@ -326,6 +246,12 @@ UserEnumDisplayDevices(
     HKEY hkey;
     NTSTATUS Status;
+    if (!pustrDevice)
+    {
+        /* Check if some devices have been added since last time */
+        EngpUpdateGraphicsDeviceList();
+    }
+
     /* Ask gdi for the GRAPHICS_DEVICE */
     pGraphicsDevice = EngpFindGraphicsDevice(pustrDevice, iDevNum, 0);
     if (!pGraphicsDevice)
diff --git a/win32ss/user/ntuser/ntuser.h b/win32ss/user/ntuser/ntuser.h
index 379825056d1..78b6bacd965 100644
--- a/win32ss/user/ntuser/ntuser.h
+++ b/win32ss/user/ntuser/ntuser.h
@@ -48,4 +48,10 @@ RegWriteUserSetting(
     _In_reads_bytes_(cjDataSize) const VOID *pvData,
     _In_ ULONG cjDataSize);
+PGRAPHICS_DEVICE
+NTAPI
+InitDisplayDriver(
+    IN PWSTR pwszDeviceName,
+    IN PWSTR pwszRegKey);
+
 /* EOF */