Author: akhaldi
Date: Sat Oct 29 18:25:32 2016
New Revision: 73069

URL: http://svn.reactos.org/svn/reactos?rev=73069&view=rev
Log:
[0.4.3] * Apply the patch that allows us to dynamically change the resolution 
by resizing in VirtualBox. CORE-6742

Modified:
    branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/device.c
    branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/device.h
    branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/pdevobj.c
    branches/ros-branch-0_4_3/reactos/win32ss/user/ntuser/display.c

Modified: branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/device.c
URL: 
http://svn.reactos.org/svn/reactos/branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/device.c?rev=73069&r1=73068&r2=73069&view=diff
==============================================================================
--- branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/device.c  [iso-8859-1] 
(original)
+++ branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/device.c  [iso-8859-1] 
Sat Oct 29 18:25:32 2016
@@ -30,99 +30,22 @@
     return STATUS_SUCCESS;
 }
 
-
-PGRAPHICS_DEVICE
-NTAPI
-EngpRegisterGraphicsDevice(
-    _In_ PUNICODE_STRING pustrDeviceName,
-    _In_ PUNICODE_STRING pustrDiplayDrivers,
-    _In_ PUNICODE_STRING pustrDescription,
+BOOLEAN
+EngpPopulateDeviceModeList(
+    _Inout_ PGRAPHICS_DEVICE pGraphicsDevice,
     _In_ PDEVMODEW pdmDefault)
 {
-    PGRAPHICS_DEVICE pGraphicsDevice;
-    PDEVICE_OBJECT pDeviceObject;
-    PFILE_OBJECT pFileObject;
-    NTSTATUS Status;
     PWSTR pwsz;
-    ULONG i, cj, cModes = 0;
-    SIZE_T cjWritten;
-    BOOL bEnable = TRUE;
+    PLDEVOBJ pldev;
     PDEVMODEINFO pdminfo;
     PDEVMODEW pdm, pdmEnd;
-    PLDEVOBJ pldev;
+    ULONG i, cModes = 0;
     BOOLEAN bModeMatch = FALSE;
 
-    TRACE("EngpRegisterGraphicsDevice(%wZ)\n", pustrDeviceName);
-
-    /* Allocate a GRAPHICS_DEVICE structure */
-    pGraphicsDevice = ExAllocatePoolWithTag(PagedPool,
-                                            sizeof(GRAPHICS_DEVICE),
-                                            GDITAG_GDEVICE);
-    if (!pGraphicsDevice)
-    {
-        ERR("ExAllocatePoolWithTag failed\n");
-        return NULL;
-    }
-
-    /* Try to open the driver */
-    Status = IoGetDeviceObjectPointer(pustrDeviceName,
-                                      FILE_READ_DATA | FILE_WRITE_DATA,
-                                      &pFileObject,
-                                      &pDeviceObject);
-    if (!NT_SUCCESS(Status))
-    {
-        ERR("Could not open driver %wZ, 0x%lx\n", pustrDeviceName, Status);
-        ExFreePoolWithTag(pGraphicsDevice, GDITAG_GDEVICE);
-        return NULL;
-    }
-
-    /* Enable the device */
-    EngFileWrite(pFileObject, &bEnable, sizeof(BOOL), &cjWritten);
-
-    /* Copy the device and file object pointers */
-    pGraphicsDevice->DeviceObject = pDeviceObject;
-    pGraphicsDevice->FileObject = pFileObject;
-
-    /* Copy device name */
-    RtlStringCbCopyNW(pGraphicsDevice->szNtDeviceName,
-                     sizeof(pGraphicsDevice->szNtDeviceName),
-                     pustrDeviceName->Buffer,
-                     pustrDeviceName->Length);
-
-    /* Create a win device name (FIXME: virtual devices!) */
-    swprintf(pGraphicsDevice->szWinDeviceName, L"\\\\.\\DISPLAY%d", 
(int)giDevNum);
-
-    /* Allocate a buffer for the strings */
-    cj = pustrDiplayDrivers->Length + pustrDescription->Length + sizeof(WCHAR);
-    pwsz = ExAllocatePoolWithTag(PagedPool, cj, GDITAG_DRVSUP);
-    if (!pwsz)
-    {
-        ERR("Could not allocate string buffer\n");
-        ASSERT(FALSE); // FIXME
-        ExFreePoolWithTag(pGraphicsDevice, GDITAG_GDEVICE);
-        return NULL;
-    }
-
-    /* Copy display driver names */
-    pGraphicsDevice->pDiplayDrivers = pwsz;
-    RtlCopyMemory(pGraphicsDevice->pDiplayDrivers,
-                  pustrDiplayDrivers->Buffer,
-                  pustrDiplayDrivers->Length);
-
-    /* Copy description */
-    pGraphicsDevice->pwszDescription = pwsz + pustrDiplayDrivers->Length / 
sizeof(WCHAR);
-    RtlCopyMemory(pGraphicsDevice->pwszDescription,
-                  pustrDescription->Buffer,
-                  pustrDescription->Length);
-    pGraphicsDevice->pwszDescription[pustrDescription->Length/sizeof(WCHAR)] = 
0;
-
-    /* Initialize the pdevmodeInfo list and default index  */
-    pGraphicsDevice->pdevmodeInfo = NULL;
-    pGraphicsDevice->iDefaultMode = 0;
-    pGraphicsDevice->iCurrentMode = 0;
-
-    // FIXME: initialize state flags
-    pGraphicsDevice->StateFlags = 0;
+    ASSERT(pGraphicsDevice->pdevmodeInfo == NULL);
+    ASSERT(pGraphicsDevice->pDevModeList == NULL);
+
+    pwsz = pGraphicsDevice->pDiplayDrivers;
 
     /* Loop through the driver names
      * This is a REG_MULTI_SZ string */
@@ -138,7 +61,7 @@
         }
 
         /* Get the mode list from the driver */
-        pdminfo = LDEVOBJ_pdmiGetModes(pldev, pDeviceObject);
+        pdminfo = LDEVOBJ_pdmiGetModes(pldev, pGraphicsDevice->DeviceObject);
         if (!pdminfo)
         {
             ERR("Could not get mode list for '%ls'\n", pwsz);
@@ -170,8 +93,7 @@
     if (!pGraphicsDevice->pdevmodeInfo || cModes == 0)
     {
         ERR("No devmodes\n");
-        ExFreePoolWithTag(pGraphicsDevice, GDITAG_GDEVICE);
-        return NULL;
+        return FALSE;
     }
 
     /* Allocate an index buffer */
@@ -182,8 +104,7 @@
     if (!pGraphicsDevice->pDevModeList)
     {
         ERR("No devmode list\n");
-        ExFreePoolWithTag(pGraphicsDevice, GDITAG_GDEVICE);
-        return NULL;
+        return FALSE;
     }
 
     TRACE("Looking for mode %lux%lux%lu(%lu Hz)\n",
@@ -232,7 +153,106 @@
             pGraphicsDevice->pDevModeList[i].pdm = pdm;
             i++;
         }
-     }
+    }
+    return TRUE;
+}
+
+PGRAPHICS_DEVICE
+NTAPI
+EngpRegisterGraphicsDevice(
+    _In_ PUNICODE_STRING pustrDeviceName,
+    _In_ PUNICODE_STRING pustrDiplayDrivers,
+    _In_ PUNICODE_STRING pustrDescription,
+    _In_ PDEVMODEW pdmDefault)
+{
+    PGRAPHICS_DEVICE pGraphicsDevice;
+    PDEVICE_OBJECT pDeviceObject;
+    PFILE_OBJECT pFileObject;
+    NTSTATUS Status;
+    PWSTR pwsz;
+    ULONG cj;
+    SIZE_T cjWritten;
+    BOOL bEnable = TRUE;
+
+    TRACE("EngpRegisterGraphicsDevice(%wZ)\n", pustrDeviceName);
+
+    /* Allocate a GRAPHICS_DEVICE structure */
+    pGraphicsDevice = ExAllocatePoolWithTag(PagedPool,
+                                            sizeof(GRAPHICS_DEVICE),
+                                            GDITAG_GDEVICE);
+    if (!pGraphicsDevice)
+    {
+        ERR("ExAllocatePoolWithTag failed\n");
+        return NULL;
+    }
+
+    /* Try to open the driver */
+    Status = IoGetDeviceObjectPointer(pustrDeviceName,
+                                      FILE_READ_DATA | FILE_WRITE_DATA,
+                                      &pFileObject,
+                                      &pDeviceObject);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("Could not open driver %wZ, 0x%lx\n", pustrDeviceName, Status);
+        ExFreePoolWithTag(pGraphicsDevice, GDITAG_GDEVICE);
+        return NULL;
+    }
+
+    /* Enable the device */
+    EngFileWrite(pFileObject, &bEnable, sizeof(BOOL), &cjWritten);
+
+    /* Copy the device and file object pointers */
+    pGraphicsDevice->DeviceObject = pDeviceObject;
+    pGraphicsDevice->FileObject = pFileObject;
+
+    /* Copy device name */
+    RtlStringCbCopyNW(pGraphicsDevice->szNtDeviceName,
+                     sizeof(pGraphicsDevice->szNtDeviceName),
+                     pustrDeviceName->Buffer,
+                     pustrDeviceName->Length);
+
+    /* Create a win device name (FIXME: virtual devices!) */
+    swprintf(pGraphicsDevice->szWinDeviceName, L"\\\\.\\DISPLAY%d", 
(int)giDevNum);
+
+    /* Allocate a buffer for the strings */
+    cj = pustrDiplayDrivers->Length + pustrDescription->Length + sizeof(WCHAR);
+    pwsz = ExAllocatePoolWithTag(PagedPool, cj, GDITAG_DRVSUP);
+    if (!pwsz)
+    {
+        ERR("Could not allocate string buffer\n");
+        ASSERT(FALSE); // FIXME
+        ExFreePoolWithTag(pGraphicsDevice, GDITAG_GDEVICE);
+        return NULL;
+    }
+
+    /* Copy display driver names */
+    pGraphicsDevice->pDiplayDrivers = pwsz;
+    RtlCopyMemory(pGraphicsDevice->pDiplayDrivers,
+                  pustrDiplayDrivers->Buffer,
+                  pustrDiplayDrivers->Length);
+
+    /* Copy description */
+    pGraphicsDevice->pwszDescription = pwsz + pustrDiplayDrivers->Length / 
sizeof(WCHAR);
+    RtlCopyMemory(pGraphicsDevice->pwszDescription,
+                  pustrDescription->Buffer,
+                  pustrDescription->Length);
+    pGraphicsDevice->pwszDescription[pustrDescription->Length/sizeof(WCHAR)] = 
0;
+
+    /* Initialize the pdevmodeInfo list and default index  */
+    pGraphicsDevice->pdevmodeInfo = NULL;
+    pGraphicsDevice->iDefaultMode = 0;
+    pGraphicsDevice->iCurrentMode = 0;
+
+    // FIXME: initialize state flags
+    pGraphicsDevice->StateFlags = 0;
+
+    /* Create the mode list */
+    pGraphicsDevice->pDevModeList = NULL;
+    if (!EngpPopulateDeviceModeList(pGraphicsDevice, pdmDefault))
+    {
+        ExFreePoolWithTag(pGraphicsDevice, GDITAG_GDEVICE);
+        return NULL;
+    }
 
     /* Lock loader */
     EngAcquireSemaphore(ghsemGraphicsDeviceList);
@@ -250,11 +270,10 @@
 
     /* Unlock loader */
     EngReleaseSemaphore(ghsemGraphicsDeviceList);
-    TRACE("Prepared %lu modes for %ls\n", cModes, 
pGraphicsDevice->pwszDescription);
+    TRACE("Prepared %lu modes for %ls\n", pGraphicsDevice->cDevModes, 
pGraphicsDevice->pwszDescription);
 
     return pGraphicsDevice;
 }
-
 
 PGRAPHICS_DEVICE
 NTAPI

Modified: branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/device.h
URL: 
http://svn.reactos.org/svn/reactos/branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/device.h?rev=73069&r1=73068&r2=73069&view=diff
==============================================================================
--- branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/device.h  [iso-8859-1] 
(original)
+++ branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/device.h  [iso-8859-1] 
Sat Oct 29 18:25:32 2016
@@ -2,6 +2,11 @@
 #pragma once
 
 #define TAG_GDEV 'gdev'
+
+VOID
+NTAPI
+PDEVOBJ_vRefreshModeList(
+    PPDEVOBJ ppdev);
 
 extern PGRAPHICS_DEVICE gpPrimaryGraphicsDevice;
 extern PGRAPHICS_DEVICE gpVgaGraphicsDevice;
@@ -29,6 +34,11 @@
     _In_ PUNICODE_STRING pustrDescription,
     _In_ PDEVMODEW pdmDefault);
 
+BOOLEAN
+EngpPopulateDeviceModeList(
+    _Inout_ PGRAPHICS_DEVICE pGraphicsDevice,
+    _In_ PDEVMODEW pdmDefault);
+
 INIT_FUNCTION
 NTSTATUS
 NTAPI

Modified: branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/pdevobj.c
URL: 
http://svn.reactos.org/svn/reactos/branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/pdevobj.c?rev=73069&r1=73068&r2=73069&view=diff
==============================================================================
--- branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/pdevobj.c [iso-8859-1] 
(original)
+++ branches/ros-branch-0_4_3/reactos/win32ss/gdi/eng/pdevobj.c [iso-8859-1] 
Sat Oct 29 18:25:32 2016
@@ -249,6 +249,45 @@
 
     DPRINT("PDEVOBJ_pSurface() returning %p\n", ppdev->pSurface);
     return ppdev->pSurface;
+}
+
+VOID
+NTAPI
+PDEVOBJ_vRefreshModeList(
+    PPDEVOBJ ppdev)
+{
+    PGRAPHICS_DEVICE pGraphicsDevice;
+    PDEVMODEINFO pdminfo, pdmiNext;
+    DEVMODEW dmDefault;
+
+    /* Lock the PDEV */
+    EngAcquireSemaphore(ppdev->hsemDevLock);
+
+    pGraphicsDevice = ppdev->pGraphicsDevice;
+
+    /* Remember our default mode */
+    dmDefault = 
*pGraphicsDevice->pDevModeList[pGraphicsDevice->iDefaultMode].pdm;
+
+    /* Clear out the modes */
+    for (pdminfo = pGraphicsDevice->pdevmodeInfo;
+         pdminfo;
+         pdminfo = pdmiNext)
+    {
+        pdmiNext = pdminfo->pdmiNext;
+        ExFreePoolWithTag(pdminfo, GDITAG_DEVMODE);
+    }
+    pGraphicsDevice->pdevmodeInfo = NULL;
+    ExFreePoolWithTag(pGraphicsDevice->pDevModeList, GDITAG_GDEVICE);
+    pGraphicsDevice->pDevModeList = NULL;
+
+    /* Now re-populate the list */
+    if (!EngpPopulateDeviceModeList(pGraphicsDevice, &dmDefault))
+    {
+        DPRINT1("FIXME: EngpPopulateDeviceModeList failed, we just destroyed a 
perfectly good mode list\n");
+    }
+
+    /* Unlock PDEV */
+    EngReleaseSemaphore(ppdev->hsemDevLock);
 }
 
 PDEVMODEW

Modified: branches/ros-branch-0_4_3/reactos/win32ss/user/ntuser/display.c
URL: 
http://svn.reactos.org/svn/reactos/branches/ros-branch-0_4_3/reactos/win32ss/user/ntuser/display.c?rev=73069&r1=73068&r2=73069&view=diff
==============================================================================
--- branches/ros-branch-0_4_3/reactos/win32ss/user/ntuser/display.c     
[iso-8859-1] (original)
+++ branches/ros-branch-0_4_3/reactos/win32ss/user/ntuser/display.c     
[iso-8859-1] Sat Oct 29 18:25:32 2016
@@ -463,19 +463,27 @@
     PGRAPHICS_DEVICE pGraphicsDevice;
     PDEVMODEENTRY pdmentry;
     ULONG i, iFoundMode;
+    PPDEVOBJ ppdev;
 
     TRACE("Enter UserEnumDisplaySettings('%wZ', %lu)\n",
           pustrDevice, iModeNum);
 
     /* Ask GDI for the GRAPHICS_DEVICE */
     pGraphicsDevice = EngpFindGraphicsDevice(pustrDevice, 0, 0);
-
-    if (!pGraphicsDevice)
+    ppdev = EngpGetPDEV(pustrDevice);
+
+    if (!pGraphicsDevice || !ppdev)
     {
         /* No device found */
         ERR("No device found!\n");
         return STATUS_INVALID_PARAMETER_1;
     }
+
+    /* let's politely ask the driver for an updated mode list,
+       just in case there's something new in there (vbox) */
+
+    PDEVOBJ_vRefreshModeList(ppdev);
+    PDEVOBJ_vRelease(ppdev);
 
     iFoundMode = 0;
     for (i = 0; i < pGraphicsDevice->cDevModes; i++)


Reply via email to