[WIN32K]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 23 Oct 2010 21:59:21 +0000 (21:59 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 23 Oct 2010 21:59:21 +0000 (21:59 +0000)
- Remove a wrong ASSERT
- Improve EngLoadImageEx to correctly handle the path and optional dll extension.
- Get rid of EngLoadDriver

svn path=/branches/reactos-yarotows/; revision=49245

subsystems/win32/win32k/eng/device.c
subsystems/win32/win32k/eng/ldevobj.c
subsystems/win32/win32k/eng/pdevobj.c
subsystems/win32/win32k/eng/surface.c
subsystems/win32/win32k/include/ldevobj.h

index a823b44..98efbc0 100644 (file)
@@ -122,7 +122,7 @@ EngpRegisterGraphicsDevice(
     {
         DPRINT1("trying driver: %ls\n", pwsz);
         /* Try to load the display driver */
-        pldev = EngLoadDriver(pwsz, LDEV_DEVICE_DISPLAY);
+        pldev = EngLoadImageEx(pwsz, LDEV_DEVICE_DISPLAY);
         if (!pldev)
         {
             DPRINT1("Could not load driver: '%ls'\n", pwsz);
index 6bd2618..9e322cc 100644 (file)
@@ -185,8 +185,9 @@ LDEVOBJ_bLoadImage(
 
     if (!NT_SUCCESS(Status))
     {
-        DPRINT1("Failed to load a GDI driver: '%S'\n", pstrPathName->Buffer);
-        ASSERT(FALSE);
+        DPRINT1("Failed to load a GDI driver: '%S', Status = 0x%lx\n", 
+                pstrPathName->Buffer, Status);
+
         /* Free the allocated memory */
         ExFreePoolWithTag(pDriverInfo, TAG_LDEV);
         return FALSE;
@@ -322,13 +323,47 @@ EngLoadImageEx(
     LPWSTR pwszDriverName,
     ULONG ldevtype)
 {
+    WCHAR acwBuffer[MAX_PATH];
     PLDEVOBJ pldev;
     UNICODE_STRING strDriverName;
+    ULONG cwcLength;
+    LPWSTR pwsz;
 
     DPRINT("EngLoadImageEx(%ls, %ld)\n", pwszDriverName, ldevtype);
+    ASSERT(pwszDriverName);
+
+    /* Initialize buffer for the the driver name */
+    RtlInitEmptyUnicodeString(&strDriverName, acwBuffer, sizeof(acwBuffer));
 
-    /* Initialize the driver name */
-    RtlInitUnicodeString(&strDriverName, pwszDriverName);
+    /* Start path with systemroot */
+    RtlAppendUnicodeToString(&strDriverName, L"\\SystemRoot\\System32\\");
+
+    /* Get Length of given string */
+    cwcLength = wcslen(pwszDriverName);
+
+    /* Check if we have a system32 path given */
+    pwsz = pwszDriverName + cwcLength;
+    while (pwsz > pwszDriverName)
+    {
+        if (_wcsnicmp(pwsz, L"\\system32\\", 10) == 0)
+        {
+            /* Driver name starts after system32 */
+            pwsz += 10;
+            break;
+        }
+        pwsz--;
+    }
+
+    /* Append the driver name */
+    RtlAppendUnicodeToString(&strDriverName, pwsz);
+
+    /* MSDN says "The driver must include this suffix in the pwszDriver string."
+       But in fact it's optional. */
+    if (_wcsnicmp(pwszDriverName + cwcLength - 4, L".dll", 4) != 0)
+    {
+        /* Append the .dll suffix */
+        RtlAppendUnicodeToString(&strDriverName, L".dll");
+    }
 
     /* Lock loader */
     EngAcquireSemaphore(ghsemLDEVList);
@@ -339,7 +374,7 @@ EngLoadImageEx(
         /* Check if the ldev is associated with a file */
         if (pldev->pGdiDriverInfo)
         {
-            /* Check for match */
+            /* Check for match (case insensative) */
             if (RtlEqualUnicodeString(&pldev->pGdiDriverInfo->DriverName, &strDriverName, 1))
             {
                 /* Image found in LDEV list */
@@ -399,25 +434,6 @@ leave:
     return pldev;
 }
 
-PLDEVOBJ
-APIENTRY
-EngLoadDriver(
-    LPWSTR pwszDriverName,
-    ULONG ldevtype)
-{
-    WCHAR acwBuffer[MAX_PATH];
-    PLDEVOBJ pldev;
-
-    ASSERT(pwszDriverName);
-    DPRINT("EngLoadDriver(%ls, %ld)\n", pwszDriverName, ldevtype);
-
-    /* Create a full file name */ // FIXME: do better than that
-    swprintf(acwBuffer, L"\\SystemRoot\\System32\\%ls.dll", pwszDriverName);
-
-    pldev = EngLoadImageEx(acwBuffer, ldevtype);
-
-    return pldev;
-}
 
 /** Exported functions ********************************************************/
 
index a904b4f..f56c058 100644 (file)
@@ -261,7 +261,7 @@ EngpCreatePDEV(
     }
 
     /* Try to get a diplay driver */
-    ppdev->pldev = EngLoadDriver(pdm->dmDeviceName, LDEV_DEVICE_DISPLAY);
+    ppdev->pldev = EngLoadImageEx(pdm->dmDeviceName, LDEV_DEVICE_DISPLAY);
     if (!ppdev->pldev)
     {
         DPRINT1("Could not load display driver '%ls'\n",
index 815f670..622b99d 100644 (file)
@@ -173,7 +173,7 @@ SURFACE_AllocSurface(
         pso->iType = iType;
         pso->iUniq = InterlockedIncrement((PLONG)&giUniqueSurface);
 
-        /* Assign a default palette amd increment its reference count */
+        /* Assign a default palette and increment its reference count */
         psurf->ppal = appalSurfaceDefault[iFormat];
         GDIOBJ_IncrementShareCount(&psurf->ppal->BaseObject);
     }
index 6bff0fe..40070db 100644 (file)
@@ -69,7 +69,7 @@ InitLDEVImpl();
 
 PLDEVOBJ
 APIENTRY
-EngLoadDriver(
+EngLoadImageEx(
     LPWSTR pwszDriverName,
     ULONG ldevtype);