* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* PURPOSE: Native driver for dxg implementation
* FILE: win32ss/reactx/dxg/main.c
* PROGRAMER: Magnus olsen (magnus@greatlord.com)
* REVISION HISTORY:
* 15/10-2007 Magnus Olsen
*/
#include <dxg_int.h>
#include "dxg_driver.h"
LONG gcDummyPageRefCnt = 0;
HSEMAPHORE ghsemDummyPage = NULL;
VOID *gpDummyPage = NULL;
PEPROCESS gpepSession = NULL;
PLARGE_INTEGER gpLockShortDelay = NULL;
DXENG_FUNCTIONS gpEngFuncs;
const ULONG gcDxgFuncs = DXG_INDEX_DxDdIoctl + 1;
NTSTATUS NTAPI
DriverEntry(IN PVOID Context1,
IN PVOID Context2)
{
return 0;
}
NTSTATUS
APIENTRY
DxDdStartupDxGraphics (ULONG SizeEngDrv,
PDRVENABLEDATA pDxEngDrv,
ULONG SizeDxgDrv,
PDRVENABLEDATA pDxgDrv,
PULONG DirectDrawContext,
PEPROCESS Proc )
{
PDRVFN drv_func;
PFN *peng_funcs;
UINT i;
if ((SizeEngDrv != sizeof(DRVENABLEDATA)) ||
(SizeDxgDrv != sizeof(DRVENABLEDATA)))
{
return STATUS_BUFFER_TOO_SMALL;
}
gpDummyPage = NULL;
gcDummyPageRefCnt = 0;
ghsemDummyPage = NULL;
* Setup internal driver functions list we got from dxg driver functions list
*/
pDxgDrv->iDriverVersion = 0x80000;
pDxgDrv->c = gcDxgFuncs;
pDxgDrv->pdrvfn = gaDxgFuncs;
if (pDxEngDrv->c != DXENG_INDEX_DxEngLoadImage + 1)
{
return STATUS_INTERNAL_ERROR;
}
* Check if all drv functions are sorted right
* and if it really are exported
*/
peng_funcs = (PFN*)&gpEngFuncs;
for (i = 1; i < DXENG_INDEX_DxEngLoadImage + 1; i++)
{
drv_func = &pDxEngDrv->pdrvfn[i];
if ((drv_func->iFunc != i) ||
(drv_func->pfn == NULL))
{
return STATUS_INTERNAL_ERROR;
}
peng_funcs[i] = drv_func->pfn;
}
*DirectDrawContext = 0x618;
if (DdHmgCreate())
{
ghsemDummyPage = EngCreateSemaphore();
if (ghsemDummyPage)
{
gpepSession = Proc;
return STATUS_SUCCESS;
}
}
DdHmgDestroy();
if (ghsemDummyPage)
{
EngDeleteSemaphore(ghsemDummyPage);
ghsemDummyPage = 0;
}
return STATUS_NO_MEMORY;
}
NTSTATUS
APIENTRY
DxDdCleanupDxGraphics(VOID)
{
DdHmgDestroy();
if (ghsemDummyPage != 0 )
{
if (gpDummyPage != 0 )
{
ExFreePoolWithTag(gpDummyPage,0);
gpDummyPage = NULL;
gcDummyPageRefCnt = 0;
}
EngDeleteSemaphore(ghsemDummyPage);
ghsemDummyPage = 0;
}
return 0;
}