[WIN32SS] Preparation to load internal drivers (ie entry point in win32k)

- Change LDEVOBJ_bEnableDriver to directly take the entry point
  (pGdiDriverInfo not required anymore)
- Add LDEVOBJ_pLoadInternal to load and start an internal driver
This commit is contained in:
Hervé Poussineau
2022-01-09 11:02:27 +01:00
committed by hpoussin
parent 333f3382f6
commit 75f4be53df
2 changed files with 52 additions and 6 deletions

View File

@@ -194,18 +194,16 @@ LDEVOBJ_vUnloadImage(
static
BOOL
LDEVOBJ_bEnableDriver(
_Inout_ PLDEVOBJ pldev)
_Inout_ PLDEVOBJ pldev,
_In_ PFN_DrvEnableDriver pfnEnableDriver)
{
PFN_DrvEnableDriver pfnEnableDriver;
DRVENABLEDATA ded;
ULONG i;
/* Make sure we have a driver info */
ASSERT(pldev && pldev->pGdiDriverInfo != NULL);
ASSERT(pldev);
/* Call the drivers DrvEnableDriver function */
RtlZeroMemory(&ded, sizeof(ded));
pfnEnableDriver = pldev->pGdiDriverInfo->EntryPoint;
if (!pfnEnableDriver(GDI_ENGINE_VERSION, sizeof(ded), &ded))
{
ERR("DrvEnableDriver failed\n");
@@ -325,6 +323,49 @@ LDEVOBJ_pvFindImageProcAddress(
return pvProcAdress;
}
PLDEVOBJ
LDEVOBJ_pLoadInternal(
_In_ PFN_DrvEnableDriver pfnEnableDriver,
_In_ ULONG ldevtype)
{
PLDEVOBJ pldev;
TRACE("LDEVOBJ_pLoadInternal(%lu)\n", ldevtype);
/* Lock loader */
EngAcquireSemaphore(ghsemLDEVList);
/* Allocate a new LDEVOBJ */
pldev = LDEVOBJ_AllocLDEV(ldevtype);
if (!pldev)
{
ERR("Could not allocate LDEV\n");
goto leave;
}
/* Load the driver */
if (!LDEVOBJ_bEnableDriver(pldev, pfnEnableDriver))
{
ERR("LDEVOBJ_bEnableDriver failed\n");
LDEVOBJ_vFreeLDEV(pldev);
pldev = NULL;
goto leave;
}
/* Insert the LDEV into the global list */
InsertHeadList(&gleLdevListHead, &pldev->leLink);
/* Increase ref count */
pldev->cRefs++;
leave:
/* Unlock loader */
EngReleaseSemaphore(ghsemLDEVList);
TRACE("LDEVOBJ_pLoadInternal returning %p\n", pldev);
return pldev;
}
PLDEVOBJ
NTAPI
LDEVOBJ_pLoadDriver(
@@ -423,7 +464,7 @@ LDEVOBJ_pLoadDriver(
if (ldevtype != LDEV_IMAGE)
{
/* Load the driver */
if (!LDEVOBJ_bEnableDriver(pldev))
if (!LDEVOBJ_bEnableDriver(pldev, pldev->pGdiDriverInfo->EntryPoint))
{
ERR("LDEVOBJ_bEnableDriver failed\n");

View File

@@ -46,6 +46,11 @@ LDEVOBJ_ulGetDriverModes(
_In_ HANDLE hDriver,
_Out_ PDEVMODEW *ppdm);
PLDEVOBJ
LDEVOBJ_pLoadInternal(
_In_ PFN_DrvEnableDriver pfnEnableDriver,
_In_ ULONG ldevtype);
PLDEVOBJ
APIENTRY
LDEVOBJ_pLoadDriver(