Skip to content

Commit 49ea72d

Browse files
committed
[WIN32K]
- Check if required driver functions are available in LDEVOBJ_bLoadDriver - Unload the image in EngLoadImageEx instead of in LDEVOBJ_bLoadDriver - Implement PDEVOBJ_vDestroyPDEV and call if from PDEVOBJ_vRelease - Check for failure in PDEVOBJ_bEnablePDEV - Implement PDEVOBJ_CreatePDEV, which does the common PDEV creation tasks for display and font drivers svn path=/branches/GSoC_2011/GdiFontDriver/; revision=56003
1 parent a9e68ce commit 49ea72d

File tree

2 files changed

+182
-103
lines changed

2 files changed

+182
-103
lines changed

subsystems/win32/win32k/eng/ldevobj.c

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,6 @@ LDEVOBJ_bLoadDriver(
250250
if (!pfnEnableDriver(GDI_ENGINE_VERSION, sizeof(ded), &ded))
251251
{
252252
DPRINT1("DrvEnableDriver failed\n");
253-
254-
/* Unload the image. */
255-
LDEVOBJ_vUnloadImage(pldev);
256253
return FALSE;
257254
}
258255

@@ -265,6 +262,44 @@ LDEVOBJ_bLoadDriver(
265262
pldev->apfn[ded.pdrvfn[i].iFunc] = ded.pdrvfn[i].pfn;
266263
}
267264

265+
/* Check if the neccessary functions are there */
266+
if ((!pldev->pfn.EnablePDEV) ||
267+
(!pldev->pfn.CompletePDEV) ||
268+
(!pldev->pfn.UnloadFontFile))
269+
{
270+
DPRINT1("Missing function for gdi driver\n");
271+
return FALSE;
272+
}
273+
274+
if (pldev->ldevtype == LDEV_DEVICE_DISPLAY)
275+
{
276+
if ((!pldev->pfn.AssertMode) ||
277+
(!pldev->pfn.EnableSurface) ||
278+
(!pldev->pfn.DisableSurface) ||
279+
(!pldev->pfn.DisableDriver) ||
280+
(!pldev->pfn.DisablePDEV) ||
281+
(!pldev->pfn.GetModes))
282+
{
283+
DPRINT1("Missing function for display driver\n");
284+
return FALSE;
285+
}
286+
}
287+
else if (pldev->ldevtype == LDEV_FONT)
288+
{
289+
if ((!pldev->pfn.LoadFontFile) ||
290+
(!pldev->pfn.QueryAdvanceWidths) || // ?
291+
(!pldev->pfn.QueryFont) ||
292+
(!pldev->pfn.QueryFontCaps) || // ?
293+
(!pldev->pfn.QueryFontData) ||
294+
(!pldev->pfn.QueryFontFile) ||
295+
(!pldev->pfn.QueryFontTree) ||
296+
(!pldev->pfn.UnloadFontFile))
297+
{
298+
DPRINT1("Missing function for font driver\n");
299+
return FALSE;
300+
}
301+
}
302+
268303
/* Return success. */
269304
return TRUE;
270305
}
@@ -356,10 +391,7 @@ EngLoadImageEx(
356391
RtlAppendUnicodeToString(&strDriverName, pwsz);
357392

358393
/* MSDN says "The driver must include this suffix in the pwszDriver string."
359-
But in fact it's optional.
360-
361-
ms win32k EngLoadImageEx loading .sys file without append .dll
362-
*/
394+
But in fact it's optional. */
363395
if ( (_wcsnicmp(pwszDriverName + cwcLength - 4, L".dll", 4) != 0) &&
364396
(_wcsnicmp(pwszDriverName + cwcLength - 4, L".sys", 4) != 0) )
365397
{
@@ -399,9 +431,9 @@ EngLoadImageEx(
399431
/* Load the image */
400432
if (!LDEVOBJ_bLoadImage(pldev, &strDriverName))
401433
{
434+
DPRINT1("LDEVOBJ_bLoadImage failed\n");
402435
LDEVOBJ_vFreeLDEV(pldev);
403436
pldev = NULL;
404-
DPRINT1("LDEVOBJ_bLoadImage failed\n");
405437
goto leave;
406438
}
407439

@@ -412,6 +444,9 @@ EngLoadImageEx(
412444
if (!LDEVOBJ_bLoadDriver(pldev))
413445
{
414446
DPRINT1("LDEVOBJ_bLoadDriver failed\n");
447+
448+
/* Unload the image. */
449+
LDEVOBJ_vUnloadImage(pldev);
415450
LDEVOBJ_vFreeLDEV(pldev);
416451
pldev = NULL;
417452
goto leave;

0 commit comments

Comments
 (0)