2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Native driver for dxg implementation
5 * FILE: win32ss/reactx/dxg/main.c
6 * PROGRAMER: Magnus olsen (magnus@greatlord.com)
8 * 15/10-2007 Magnus Olsen
12 #include "dxg_driver.h"
14 LONG gcDummyPageRefCnt
= 0;
15 HSEMAPHORE ghsemDummyPage
= NULL
;
16 VOID
*gpDummyPage
= NULL
;
17 PEPROCESS gpepSession
= NULL
;
18 PLARGE_INTEGER gpLockShortDelay
= NULL
;
20 DXENG_FUNCTIONS gpEngFuncs
;
22 const ULONG gcDxgFuncs
= DXG_INDEX_DxDdIoctl
+ 1;
26 DriverEntry(IN PVOID Context1
,
34 DxDdStartupDxGraphics (ULONG SizeEngDrv
,
35 PDRVENABLEDATA pDxEngDrv
,
37 PDRVENABLEDATA pDxgDrv
,
38 PULONG DirectDrawContext
,
46 /* Test see if the data is vaild we got from win32k.sys */
47 if ((SizeEngDrv
!= sizeof(DRVENABLEDATA
)) ||
48 (SizeDxgDrv
!= sizeof(DRVENABLEDATA
)))
50 return STATUS_BUFFER_TOO_SMALL
;
53 /* rest static value */
55 gcDummyPageRefCnt
= 0;
56 ghsemDummyPage
= NULL
;
59 * Setup internal driver functions list we got from dxg driver functions list
61 pDxgDrv
->iDriverVersion
= 0x80000; /* Note 12/1-2004 : DirectX 8 ? */
62 pDxgDrv
->c
= gcDxgFuncs
;
63 pDxgDrv
->pdrvfn
= gaDxgFuncs
;
65 /* check how many driver functions and fail if the value does not match */
66 if (pDxEngDrv
->c
!= DXENG_INDEX_DxEngLoadImage
+ 1)
68 return STATUS_INTERNAL_ERROR
;
72 * Check if all drv functions are sorted right
73 * and if it really are exported
76 peng_funcs
= (PFN
*)&gpEngFuncs
;
78 for (i
= 1; i
< DXENG_INDEX_DxEngLoadImage
+ 1; i
++)
80 drv_func
= &pDxEngDrv
->pdrvfn
[i
];
82 if ((drv_func
->iFunc
!= i
) ||
83 (drv_func
->pfn
== NULL
))
85 return STATUS_INTERNAL_ERROR
;
88 peng_funcs
[i
] = drv_func
->pfn
;
91 /* Note 12/1-2004 : Why is this set to 0x618 */
92 *DirectDrawContext
= 0x618;
96 ghsemDummyPage
= EngCreateSemaphore();
101 return STATUS_SUCCESS
;
109 EngDeleteSemaphore(ghsemDummyPage
);
113 return STATUS_NO_MEMORY
;
118 DxDdCleanupDxGraphics(VOID
)
122 if (ghsemDummyPage
!= 0 )
124 if (gpDummyPage
!= 0 )
126 ExFreePoolWithTag(gpDummyPage
,0);
128 gcDummyPageRefCnt
= 0;
130 EngDeleteSemaphore(ghsemDummyPage
);