mirror of
https://github.com/reactos/reactos.git
synced 2026-05-31 16:31:07 +08:00
[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:
committed by
hpoussin
parent
333f3382f6
commit
75f4be53df
@@ -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");
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user