diff --git a/subsystems/win32/win32k/eng/device.c b/subsystems/win32/win32k/eng/device.c index a823b449a5f..98efbc052c3 100644 --- a/subsystems/win32/win32k/eng/device.c +++ b/subsystems/win32/win32k/eng/device.c @@ -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); diff --git a/subsystems/win32/win32k/eng/ldevobj.c b/subsystems/win32/win32k/eng/ldevobj.c index 6bd2618bc1f..9e322cc75b6 100644 --- a/subsystems/win32/win32k/eng/ldevobj.c +++ b/subsystems/win32/win32k/eng/ldevobj.c @@ -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 the driver name */ - RtlInitUnicodeString(&strDriverName, pwszDriverName); + /* Initialize buffer for the the driver name */ + RtlInitEmptyUnicodeString(&strDriverName, acwBuffer, sizeof(acwBuffer)); + + /* 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 ********************************************************/ diff --git a/subsystems/win32/win32k/eng/pdevobj.c b/subsystems/win32/win32k/eng/pdevobj.c index a904b4fecc0..f56c058d725 100644 --- a/subsystems/win32/win32k/eng/pdevobj.c +++ b/subsystems/win32/win32k/eng/pdevobj.c @@ -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", diff --git a/subsystems/win32/win32k/eng/surface.c b/subsystems/win32/win32k/eng/surface.c index 815f67063ca..622b99da2d5 100644 --- a/subsystems/win32/win32k/eng/surface.c +++ b/subsystems/win32/win32k/eng/surface.c @@ -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); } diff --git a/subsystems/win32/win32k/include/ldevobj.h b/subsystems/win32/win32k/include/ldevobj.h index 6bff0fec7f8..40070db631c 100644 --- a/subsystems/win32/win32k/include/ldevobj.h +++ b/subsystems/win32/win32k/include/ldevobj.h @@ -69,7 +69,7 @@ InitLDEVImpl(); PLDEVOBJ APIENTRY -EngLoadDriver( +EngLoadImageEx( LPWSTR pwszDriverName, ULONG ldevtype);