[WIN32K] Add some missing parameter checks. Fixes all but 4 tests in win32knt:NtUserE...
[reactos.git] / reactos / win32ss / user / ntuser / display.c
index 7b6a753..85781e4 100644 (file)
@@ -10,6 +10,7 @@
 DBG_DEFAULT_CHANNEL(UserDisplay);
 
 BOOL gbBaseVideo = 0;
+static PPROCESSINFO gpFullscreen = NULL;
 
 static const PWCHAR KEY_VIDEO = L"\\Registry\\Machine\\HARDWARE\\DEVICEMAP\\VIDEO";
 
@@ -571,8 +572,28 @@ NtUserEnumDisplaySettings(
     TRACE("Enter NtUserEnumDisplaySettings(%wZ, %lu, %p, 0x%lx)\n",
           pustrDevice, iModeNum, lpDevMode, dwFlags);
 
+    _SEH2_TRY
+    {
+        ProbeForWrite(lpDevMode, sizeof(DEVMODEW), 1);
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        _SEH2_YIELD(return _SEH2_GetExceptionCode());
+    }
+    _SEH2_END
+
+    if (lpDevMode->dmSize != sizeof(DEVMODEW))
+    {
+        return STATUS_BUFFER_TOO_SMALL;
+    }
+
     if (pustrDevice)
     {
+       if (pustrDevice->Buffer == NULL || pustrDevice->Length == 0)
+       {
+           Status = STATUS_INVALID_PARAMETER_1;
+       }
+
         /* Initialize destination string */
         RtlInitEmptyUnicodeString(&ustrDevice, awcDevice, sizeof(awcDevice));
 
@@ -646,9 +667,25 @@ NtUserEnumDisplaySettings(
         }
         _SEH2_END;
     }
+    else
+    {
+        if (Status == STATUS_UNSUCCESSFUL)
+        {
+            Status = STATUS_INVALID_PARAMETER_1;
+        }
+    }
 
     return Status;
 }
+VOID
+UserUpdateFullscreen(
+    DWORD flags)
+{
+    if (flags & CDS_FULLSCREEN)
+        gpFullscreen = gptiCurrent->ppi;
+    else
+        gpFullscreen = NULL;
+}
 
 LONG
 APIENTRY
@@ -774,6 +811,8 @@ UserChangeDisplaySettings(
             goto leave;
         }
 
+        UserUpdateFullscreen(flags);
+
         /* Update the system metrics */
         InitMetrics();
 
@@ -809,6 +848,18 @@ leave:
     return lResult;
 }
 
+VOID
+UserDisplayNotifyShutdown(
+    PPROCESSINFO ppiCurrent)
+{
+    if (ppiCurrent == gpFullscreen)
+    {
+        UserChangeDisplaySettings(NULL, NULL, 0, NULL);
+        if (gpFullscreen)
+            ERR("Failed to restore display mode!\n");
+    }
+}
+
 LONG
 APIENTRY
 NtUserChangeDisplaySettings(