[ros-diffs] [greatlrd] 33274: fixed NtUserEnumDisplaySettings bug inside IntEnumDisplaySettings DWORD DisplayNumber was not init before it was use. GetDisplayNumberFromDeviceName did not allown pdevice with NULL value or string lenght is 0 thuse have been fixed.

greatlrd at svn.reactos.org greatlrd at svn.reactos.org
Sun May 4 19:58:44 CEST 2008


Author: greatlrd
Date: Sun May  4 12:58:43 2008
New Revision: 33274

URL: http://svn.reactos.org/svn/reactos?rev=33274&view=rev
Log:
fixed NtUserEnumDisplaySettings bug inside IntEnumDisplaySettings  DWORD DisplayNumber was not init before it was use.
GetDisplayNumberFromDeviceName did not allown pdevice with NULL value or string lenght is 0 thuse have been fixed. 


Modified:
    trunk/reactos/subsystems/win32/win32k/objects/dc.c

Modified: trunk/reactos/subsystems/win32/win32k/objects/dc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/objects/dc.c?rev=33274&r1=33273&r2=33274&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/dc.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/dc.c [iso-8859-1] Sun May  4 12:58:43 2008
@@ -2717,8 +2717,17 @@
   if (DisplayNumber == NULL)
     return STATUS_INVALID_PARAMETER_2;
 
-  if (pDeviceName && pDeviceName->Length <= DisplayString.Length)
-    return STATUS_OBJECT_NAME_INVALID;
+ DPRINT1("GetDisplayNumberFromDeviceName Pass 1 seh  \n");
+
+  if ((pDeviceName != NULL) && (pDeviceName->Length != 0))
+  {
+    if (pDeviceName->Length <= DisplayString.Length)
+    {
+      DPRINT1("GetDisplayNumberFromDeviceName FAIL pDeviceName : %wZ  \n",pDeviceName);
+      DPRINT1("GetDisplayNumberFromDeviceName FAIL pDeviceName->Length : %d  \n",pDeviceName->Length);
+      return STATUS_OBJECT_NAME_INVALID;
+    }
+  }
 
   if (pDeviceName == NULL || pDeviceName->Length == 0)
   {
@@ -2757,7 +2766,7 @@
         Number = Number * 10 + Char - L'0';
       else if (Char != L'\0')
         return STATUS_OBJECT_NAME_INVALID;
-    }
+      }
 
     *DisplayNumber = Number - 1;
   }
@@ -2783,13 +2792,15 @@
   static UNICODE_STRING CachedDeviceName;
   PDEVMODEW CachedMode = NULL;
   DEVMODEW DevMode;
-  ULONG DisplayNumber;
+  ULONG DisplayNumber = 0;
 
   if (!NT_SUCCESS(GetDisplayNumberFromDeviceName(pDeviceName, &DisplayNumber)))
   {
     SetLastWin32Error(STATUS_NO_SUCH_DEVICE);
     return FALSE;
   }
+
+  DPRINT1("IntEnumDisplaySettings Pass 1 seh  \n");
 
   DPRINT("DevMode->dmSize = %d\n", pDevMode->dmSize);
   DPRINT("DevMode->dmExtraSize = %d\n", pDevMode->dmDriverExtra);
@@ -2801,13 +2812,17 @@
     return FALSE;
   }
 
+  DPRINT1("IntEnumDisplaySettings Pass 2 seh  \n");
+
   if (iModeNum == ENUM_CURRENT_SETTINGS)
   {
+    DPRINT1("IntEnumDisplaySettings  ENUM_CURRENT_SETTINGS  \n");
     CachedMode = &PrimarySurface.DMW;
     ASSERT(CachedMode->dmSize > 0);
   }
   else if (iModeNum == ENUM_REGISTRY_SETTINGS)
   {
+    DPRINT1("IntEnumDisplaySettings  ENUM_REGISTRY_SETTINGS  \n");
     RtlZeroMemory(&DevMode, sizeof (DevMode));
     DevMode.dmSize = sizeof (DevMode);
     DevMode.dmDriverExtra = 0;
@@ -2821,9 +2836,13 @@
     /* FIXME: Maybe look for the matching devmode supplied by the
      *        driver so we can provide driver private/extra data?
      */
+
+    DPRINT1("IntEnumDisplaySettings Pass 3 seh  \n");
   }
   else
   {
+    DPRINT1("IntEnumDisplaySettings  NO FLAGs  \n");
+
     BOOL IsCachedDevice = (CachedDevModes != NULL);
 
     if (CachedDevModes &&
@@ -2840,6 +2859,8 @@
       LPWSTR CurrentName;
       DRVENABLEDATA DrvEnableData;
 
+      DPRINT1("IntEnumDisplaySettings iModeNum  \n");
+
       /* Free resources from last driver cache */
       if (IsCachedDevice == FALSE && CachedDeviceName.Buffer != NULL)
       {
@@ -2854,11 +2875,15 @@
         return FALSE;
       }
 
+      DPRINT1("IntEnumDisplaySettings Pass 4 seh  \n");
+
       if (!IntPrepareDriverIfNeeded())
       {
         DPRINT1("IntPrepareDriverIfNeeded failed\n");
         return FALSE;
       }
+
+      DPRINT1("IntEnumDisplaySettings Pass 5 seh  \n");
 
       /*
        * DriverFileNames may be a list of drivers in REG_SZ_MULTI format,
@@ -2940,6 +2965,9 @@
             SetLastWin32Error(STATUS_NO_MEMORY);
             return FALSE;
           }
+
+          DPRINT1("IntEnumDisplaySettings Pass 6 seh  \n");
+
           if (CachedDevModes != NULL)
           {
             RtlCopyMemory(NewBuffer, CachedDevModes, SizeUsed);
@@ -2978,12 +3006,19 @@
     }
 
     /* return cached info */
+
+
+     DPRINT1("IntEnumDisplaySettings return cached info  \n");
+
     CachedMode = CachedDevModes;
     if (CachedMode >= CachedDevModesEnd)
     {
       SetLastWin32Error(STATUS_NO_MORE_ENTRIES);
       return FALSE;
     }
+
+    DPRINT1("IntEnumDisplaySettings Pass 7 seh  \n");
+
     while (iModeNum-- > 0 && CachedMode < CachedDevModesEnd)
     {
       assert(CachedMode->dmSize > 0);
@@ -2994,9 +3029,13 @@
       SetLastWin32Error(STATUS_NO_MORE_ENTRIES);
       return FALSE;
     }
+
+    DPRINT1("IntEnumDisplaySettings Pass 8 seh  \n");
   }
 
   ASSERT(CachedMode != NULL);
+
+  DPRINT1("IntEnumDisplaySettings Pass 9 seh  \n");
 
   RtlCopyMemory(pDevMode, CachedMode, min(pDevMode->dmSize, CachedMode->dmSize));
   RtlZeroMemory(pDevMode + pDevMode->dmSize, pDevMode->dmDriverExtra);



More information about the Ros-diffs mailing list