[NtUser] Try to fix tests for user32:EnumDisplaySettings
authorDmitry Chapyshev <dmitry@reactos.org>
Sun, 11 Sep 2016 16:13:46 +0000 (16:13 +0000)
committerDmitry Chapyshev <dmitry@reactos.org>
Sun, 11 Sep 2016 16:13:46 +0000 (16:13 +0000)
svn path=/trunk/; revision=72655

reactos/win32ss/user/ntuser/display.c

index e0c32cd..149df74 100644 (file)
@@ -443,7 +443,7 @@ UserEnumCurrentDisplaySettings(
     {
         /* No device found */
         ERR("No PDEV found!\n");
-        return STATUS_UNSUCCESSFUL;
+        return STATUS_INVALID_PARAMETER_1;
     }
 
     *ppdm = ppdev->pdmwDev;
@@ -474,7 +474,7 @@ UserEnumDisplaySettings(
     {
         /* No device found */
         ERR("No device found!\n");
-        return STATUS_UNSUCCESSFUL;
+        return STATUS_INVALID_PARAMETER_1;
     }
 
     iFoundMode = 0;
@@ -571,13 +571,18 @@ NtUserEnumDisplaySettings(
 
     _SEH2_TRY
     {
-        ProbeForWrite(lpDevMode, sizeof(DEVMODEW), 1);
+        ProbeForRead(lpDevMode, sizeof(DEVMODEW), 1);
+
+        cbSize = lpDevMode->dmSize;
+        cbExtra = lpDevMode->dmDriverExtra;
+
+        ProbeForWrite(lpDevMode, cbSize + cbExtra, 1);
     }
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
         _SEH2_YIELD(return _SEH2_GetExceptionCode());
     }
-    _SEH2_END
+    _SEH2_END;
 
     if (lpDevMode->dmSize != sizeof(DEVMODEW))
     {
@@ -586,31 +591,30 @@ NtUserEnumDisplaySettings(
 
     if (pustrDevice)
     {
-       if (pustrDevice->Buffer == NULL || pustrDevice->Length == 0)
-       {
-           Status = STATUS_INVALID_PARAMETER_1;
-       }
-
         /* Initialize destination string */
         RtlInitEmptyUnicodeString(&ustrDevice, awcDevice, sizeof(awcDevice));
 
         _SEH2_TRY
         {
             /* Probe the UNICODE_STRING and the buffer */
-            ProbeForRead(pustrDevice, sizeof(UNICODE_STRING), 1);
-            ProbeForRead(pustrDevice->Buffer, pustrDevice->Length, 1);
+            ProbeForReadUnicodeString(pustrDevice);
+
+            if (!pustrDevice->Length || !pustrDevice->Buffer)
+                ExRaiseStatus(STATUS_NO_MEMORY);
+
+            ProbeForRead(pustrDevice->Buffer, pustrDevice->Length, sizeof(UCHAR));
 
             /* Copy the string */
             RtlCopyUnicodeString(&ustrDevice, pustrDevice);
         }
         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
         {
-            _SEH2_YIELD(return _SEH2_GetExceptionCode());
+            _SEH2_YIELD(return STATUS_INVALID_PARAMETER_1);
         }
-        _SEH2_END
+        _SEH2_END;
 
         pustrDevice = &ustrDevice;
-   }
+    }
 
     /* Acquire global USER lock */
     UserEnterShared();
@@ -642,11 +646,6 @@ NtUserEnumDisplaySettings(
         /* Copy some information back */
         _SEH2_TRY
         {
-            ProbeForRead(lpDevMode, sizeof(DEVMODEW), 1);
-            cbSize = lpDevMode->dmSize;
-            cbExtra = lpDevMode->dmDriverExtra;
-
-            ProbeForWrite(lpDevMode, cbSize + cbExtra, 1);
             /* Output what we got */
             RtlCopyMemory(lpDevMode, pdm, min(cbSize, pdm->dmSize));
 
@@ -664,13 +663,6 @@ NtUserEnumDisplaySettings(
         }
         _SEH2_END;
     }
-    else
-    {
-        if (Status == STATUS_UNSUCCESSFUL)
-        {
-            Status = STATUS_INVALID_PARAMETER_1;
-        }
-    }
 
     return Status;
 }