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
NTAPI
PDEVOBJ_pdmMatchDevMode(
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);
+ ppdev = EngpGetPDEV(pustrDevice);
- if (!pGraphicsDevice)
+ 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++)
{