//TODO: from gre\pdevobj.hxx
#ifndef DRIVER_NOT_CAPABLE_DDRAW
#define DRIVER_NOT_CAPABLE_DDRAW      2
#endif
#ifndef DRIVER_NOT_CAPABLE_D3D
#define DRIVER_NOT_CAPABLE_D3D        4
#endif

#ifndef W32PID
#define W32PID ULONG
#endif

//
// The functions index which dxg.sys exports to win32k.sys
//
NTSTATUS
DxDdStartupDxGraphics(
    ULONG          cjEng,
    DRVENABLEDATA *pdedEng,
    ULONG          cjDxg,
    DRVENABLEDATA *pdedDxg,
    DWORD         *pdwDirectContext,
    PEPROCESS      pepSession
    );

NTSTATUS
DxDdCleanupDxGraphics(
    VOID
    );

typedef NTSTATUS (*PFN_StartupDxGraphics)(ULONG,DRVENABLEDATA*,ULONG,DRVENABLEDATA*,DWORD*,PEPROCESS);
typedef NTSTATUS (*PFN_CleanupDxGraphics)(VOID);

#define INDEX_DxDxgGenericThunk                     0
#define INDEX_DxD3dContextCreate                    1
#define INDEX_DxD3dContextDestroy                   2
#define INDEX_DxD3dContextDestroyAll                3
#define INDEX_DxD3dValidateTextureStageState        4
#define INDEX_DxD3dDrawPrimitives2                  5
#define INDEX_DxDdGetDriverState                    6
#define INDEX_DxDdAddAttachedSurface                7
#define INDEX_DxDdAlphaBlt                          8
#define INDEX_DxDdAttachSurface                     9
#define INDEX_DxDdBeginMoCompFrame                 10
#define INDEX_DxDdBlt                              11
#define INDEX_DxDdCanCreateSurface                 12
#define INDEX_DxDdCanCreateD3DBuffer               13
#define INDEX_DxDdColorControl                     14
#define INDEX_DxDdCreateDirectDrawObject           15
#define INDEX_DxDdCreateSurface                    16
#define INDEX_DxDdCreateD3DBuffer                  17
#define INDEX_DxDdCreateMoComp                     18
#define INDEX_DxDdCreateSurfaceObject              19
#define INDEX_DxDdDeleteDirectDrawObject           20
#define INDEX_DxDdDeleteSurfaceObject              21
#define INDEX_DxDdDestroyMoComp                    22
#define INDEX_DxDdDestroySurface                   23
#define INDEX_DxDdDestroyD3DBuffer                 24
#define INDEX_DxDdEndMoCompFrame                   25
#define INDEX_DxDdFlip                             26
#define INDEX_DxDdFlipToGDISurface                 27
#define INDEX_DxDdGetAvailDriverMemory             28
#define INDEX_DxDdGetBltStatus                     29
#define INDEX_DxDdGetDC                            30
#define INDEX_DxDdGetDriverInfo                    31
#define INDEX_DxDdGetDxHandle                      32
#define INDEX_DxDdGetFlipStatus                    33
#define INDEX_DxDdGetInternalMoCompInfo            34
#define INDEX_DxDdGetMoCompBuffInfo                35
#define INDEX_DxDdGetMoCompGuids                   36
#define INDEX_DxDdGetMoCompFormats                 37
#define INDEX_DxDdGetScanLine                      38
#define INDEX_DxDdLock                             39
#define INDEX_DxDdLockD3D                          40
#define INDEX_DxDdQueryDirectDrawObject            41
#define INDEX_DxDdQueryMoCompStatus                42
#define INDEX_DxDdReenableDirectDrawObject         43
#define INDEX_DxDdReleaseDC                        44
#define INDEX_DxDdRenderMoComp                     45
#define INDEX_DxDdResetVisrgn                      46
#define INDEX_DxDdSetColorKey                      47
#define INDEX_DxDdSetExclusiveMode                 48
#define INDEX_DxDdSetGammaRamp                     49
#define INDEX_DxDdCreateSurfaceEx                  50
#define INDEX_DxDdSetOverlayPosition               51
#define INDEX_DxDdUnattachSurface                  52
#define INDEX_DxDdUnlock                           53
#define INDEX_DxDdUnlockD3D                        54
#define INDEX_DxDdUpdateOverlay                    55
#define INDEX_DxDdWaitForVerticalBlank             56
#define INDEX_DxDvpCanCreateVideoPort              57
#define INDEX_DxDvpColorControl                    58
#define INDEX_DxDvpCreateVideoPort                 59
#define INDEX_DxDvpDestroyVideoPort                60
#define INDEX_DxDvpFlipVideoPort                   61
#define INDEX_DxDvpGetVideoPortBandwidth           62
#define INDEX_DxDvpGetVideoPortField               63
#define INDEX_DxDvpGetVideoPortFlipStatus          64
#define INDEX_DxDvpGetVideoPortInputFormats        65
#define INDEX_DxDvpGetVideoPortLine                66
#define INDEX_DxDvpGetVideoPortOutputFormats       67
#define INDEX_DxDvpGetVideoPortConnectInfo         68
#define INDEX_DxDvpGetVideoSignalStatus            69
#define INDEX_DxDvpUpdateVideoPort                 70
#define INDEX_DxDvpWaitForVideoPortSync            71
#define INDEX_DxDvpAcquireNotification             72
#define INDEX_DxDvpReleaseNotification             73
#define INDEX_DxDdHeapVidMemAllocAligned           74
#define INDEX_DxDdHeapVidMemFree                   75
#define INDEX_DxDdEnableDirectDraw                 76
#define INDEX_DxDdDisableDirectDraw                77
#define INDEX_DxDdSuspendDirectDraw                78 
#define INDEX_DxDdResumeDirectDraw                 79
#define INDEX_DxDdDynamicModeChange                80
#define INDEX_DxDdCloseProcess                     81
#define INDEX_DxDdGetDirectDrawBounds              82
#define INDEX_DxDdEnableDirectDrawRedirection      83
#define INDEX_DxDdAllocPrivateUserMem              84
#define INDEX_DxDdFreePrivateUserMem               85
#define INDEX_DxDdLockDirectDrawSurface            86
#define INDEX_DxDdUnlockDirectDrawSurface          87
#define INDEX_DxDdSetAccelLevel                    88
#define INDEX_DxDdGetSurfaceLock                   89
#define INDEX_DxDdEnumLockedSurfaceRect            90
#define INDEX_DxDdIoctl                            91

//
// Prototype definition
//

DWORD  APIENTRY DxDxgGenericThunk(
    IN     ULONG_PTR ulIndex,
    IN     ULONG_PTR ulHandle,
    IN OUT SIZE_T   *pdwSizeOfPtr1,
    IN OUT PVOID     pvPtr1,
    IN OUT SIZE_T   *pdwSizeOfPtr2,
    IN OUT PVOID     pvPtr2);

DWORD APIENTRY DxDdAddAttachedSurface(
    IN     HANDLE hSurface,
    IN     HANDLE hSurfaceAttached,
    IN OUT PDD_ADDATTACHEDSURFACEDATA puAddAttachedSurfaceData);

BOOL APIENTRY DxDdAttachSurface(
    IN     HANDLE hSurfaceFrom,
    IN     HANDLE hSurfaceTo);

DWORD APIENTRY DxDdBlt(
    IN     HANDLE hSurfaceDest,
    IN     HANDLE hSurfaceSrc,
    IN OUT PDD_BLTDATA puBltData);

DWORD APIENTRY DxDdCanCreateSurface(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_CANCREATESURFACEDATA puCanCreateSurfaceData);

DWORD APIENTRY DxDdColorControl(
    IN     HANDLE hSurface,
    IN OUT PDD_COLORCONTROLDATA puColorControlData);

HANDLE APIENTRY DxDdCreateDirectDrawObject(
    IN     HDC hdc);

DWORD  APIENTRY DxDdCreateSurface(
    IN     HANDLE  hDirectDraw,
    IN     HANDLE* hSurface,
    IN OUT DDSURFACEDESC* puSurfaceDescription,
    IN OUT DD_SURFACE_GLOBAL* puSurfaceGlobalData,
    IN OUT DD_SURFACE_LOCAL* puSurfaceLocalData,
    IN OUT DD_SURFACE_MORE* puSurfaceMoreData,
    IN OUT DD_CREATESURFACEDATA* puCreateSurfaceData,
       OUT HANDLE* puhSurface);

HANDLE APIENTRY DxDdCreateSurfaceObject(
    IN     HANDLE hDirectDrawLocal,
    IN     HANDLE hSurface,
    IN     PDD_SURFACE_LOCAL puSurfaceLocal,
    IN     PDD_SURFACE_MORE puSurfaceMore,
    IN     PDD_SURFACE_GLOBAL puSurfaceGlobal,
    IN     BOOL bComplete);

BOOL APIENTRY DxDdDeleteSurfaceObject(
    IN     HANDLE hSurface);

BOOL APIENTRY DxDdDeleteDirectDrawObject(
    IN     HANDLE hDirectDrawLocal);

DWORD APIENTRY DxDdDestroySurface(
    IN     HANDLE hSurface,
    IN     BOOL bRealDestroy);

DWORD APIENTRY DxDdFlip(
    IN     HANDLE hSurfaceCurrent,
    IN     HANDLE hSurfaceTarget,
    IN     HANDLE hSurfaceCurrentLeft,
    IN     HANDLE hSurfaceTargetLeft,
    IN OUT PDD_FLIPDATA puFlipData);

DWORD APIENTRY DxDdGetAvailDriverMemory(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_GETAVAILDRIVERMEMORYDATA puGetAvailDriverMemoryData);

DWORD APIENTRY DxDdGetBltStatus(
    IN     HANDLE hSurface,
    IN OUT PDD_GETBLTSTATUSDATA puGetBltStatusData);

HDC APIENTRY DxDdGetDC(
    IN     HANDLE hSurface,
    IN     PALETTEENTRY* puColorTable);

DWORD APIENTRY DxDdGetDriverInfo(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_GETDRIVERINFODATA puGetDriverInfoData);

DWORD APIENTRY DxDdGetFlipStatus(
    IN     HANDLE hSurface,
    IN OUT PDD_GETFLIPSTATUSDATA puGetFlipStatusData);

DWORD APIENTRY DxDdGetScanLine(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_GETSCANLINEDATA puGetScanLineData);

DWORD APIENTRY DxDdSetExclusiveMode(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_SETEXCLUSIVEMODEDATA puSetExclusiveModeData);

DWORD APIENTRY DxDdFlipToGDISurface(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_FLIPTOGDISURFACEDATA puFlipToGDISurfaceData);

DWORD APIENTRY DxDdLock(
    IN     HANDLE hSurface,
    IN OUT PDD_LOCKDATA puLockData,
    IN HDC hdcClip);

BOOL APIENTRY DxDdQueryDirectDrawObject(
    IN     HANDLE,
    IN OUT PDD_HALINFO,
    IN OUT DWORD*,
    IN OUT LPD3DNTHAL_CALLBACKS,
    IN OUT LPD3DNTHAL_GLOBALDRIVERDATA,
    IN OUT PDD_D3DBUFCALLBACKS,
    IN OUT LPDDSURFACEDESC,
    IN OUT DWORD*,
    IN OUT VIDEOMEMORY*,
    IN OUT DWORD*,
    IN OUT DWORD*);
 
BOOL APIENTRY DxDdReenableDirectDrawObject(
    IN     HANDLE hDirectDrawLocal,
    IN OUT BOOL* pubNewMode);

BOOL APIENTRY DxDdReleaseDC(
    IN     HANDLE hSurface);

BOOL APIENTRY DxDdResetVisrgn(
    IN     HANDLE hSurface,
    IN HWND hwnd);

DWORD APIENTRY DxDdSetColorKey(
    IN     HANDLE hSurface,
    IN OUT PDD_SETCOLORKEYDATA puSetColorKeyData);

DWORD APIENTRY DxDdSetOverlayPosition(
    IN     HANDLE hSurfaceSource,
    IN     HANDLE hSurfaceDestination,
    IN OUT PDD_SETOVERLAYPOSITIONDATA puSetOverlayPositionData);

VOID  APIENTRY DxDdUnattachSurface(
    IN     HANDLE hSurface,
    IN     HANDLE hSurfaceAttached);

DWORD APIENTRY DxDdUnlock(
    IN     HANDLE hSurface,
    IN OUT PDD_UNLOCKDATA puUnlockData);

DWORD APIENTRY DxDdUpdateOverlay(
    IN     HANDLE hSurfaceDestination,
    IN     HANDLE hSurfaceSource,
    IN OUT PDD_UPDATEOVERLAYDATA puUpdateOverlayData);

DWORD APIENTRY DxDdWaitForVerticalBlank(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData);

HANDLE APIENTRY DxDdGetDxHandle(
    IN     HANDLE hDirectDraw,
    IN     HANDLE hSurface,
    IN     BOOL bRelease);

BOOL APIENTRY DxDdSetGammaRamp(
    IN     HANDLE hDirectDraw,
    IN     HDC hdc,
    IN     LPVOID lpGammaRamp);

DWORD APIENTRY DxDdLockD3D(
    IN     HANDLE hSurface,
    IN OUT PDD_LOCKDATA puLockData);

DWORD APIENTRY DxDdUnlockD3D(
    IN     HANDLE hSurface,
    IN OUT PDD_UNLOCKDATA puUnlockData);

DWORD APIENTRY DxDdCreateD3DBuffer(
    IN     HANDLE hDirectDraw,
    IN OUT HANDLE* hSurface,
    IN OUT DDSURFACEDESC* puSurfaceDescription,
    IN OUT DD_SURFACE_GLOBAL* puSurfaceGlobalData,
    IN OUT DD_SURFACE_LOCAL* puSurfaceLocalData,
    IN OUT DD_SURFACE_MORE* puSurfaceMoreData,
    IN OUT DD_CREATESURFACEDATA* puCreateSurfaceData,
    IN OUT HANDLE* puhSurface);

DWORD APIENTRY DxDdCanCreateD3DBuffer(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_CANCREATESURFACEDATA puCanCreateSurfaceData);

DWORD APIENTRY DxDdDestroyD3DBuffer(
    IN     HANDLE hSurface);

DWORD APIENTRY DxD3dContextCreate(
    IN     HANDLE hDirectDrawLocal,
    IN     HANDLE hSurfColor,
    IN     HANDLE hSurfZ,
    IN OUT D3DNTHAL_CONTEXTCREATEI *pdcci);

DWORD APIENTRY DxD3dContextDestroy(
    IN     LPD3DNTHAL_CONTEXTDESTROYDATA);

DWORD APIENTRY DxD3dContextDestroyAll(
       OUT LPD3DNTHAL_CONTEXTDESTROYALLDATA pdcdad);

DWORD APIENTRY DxD3dValidateTextureStageState(
    IN OUT LPD3DNTHAL_VALIDATETEXTURESTAGESTATEDATA pData);

DWORD APIENTRY DxD3dDrawPrimitives2(
    IN     HANDLE hCmdBuf,
    IN     HANDLE hVBuf,
    IN OUT LPD3DNTHAL_DRAWPRIMITIVES2DATA pded,
    IN OUT FLATPTR* pfpVidMemCmd,
    IN OUT DWORD* pdwSizeCmd,
    IN OUT FLATPTR* pfpVidMemVtx,
    IN OUT DWORD* pdwSizeVtx);

DWORD APIENTRY DxDdGetDriverState(
    IN OUT PDD_GETDRIVERSTATEDATA pdata);

DWORD APIENTRY DxDdCreateSurfaceEx(
    IN     HANDLE hDirectDraw,
    IN     HANDLE hSurface,
    IN     DWORD dwSurfaceHandle);

DWORD APIENTRY DxDdGetMoCompGuids(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_GETMOCOMPGUIDSDATA puGetMoCompGuidsData);

DWORD APIENTRY DxDdGetMoCompFormats(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_GETMOCOMPFORMATSDATA puGetMoCompFormatsData);

DWORD APIENTRY DxDdGetMoCompBuffInfo(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_GETMOCOMPCOMPBUFFDATA puGetBuffData);

DWORD APIENTRY DxDdGetInternalMoCompInfo(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_GETINTERNALMOCOMPDATA puGetInternalData);

HANDLE APIENTRY DxDdCreateMoComp(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_CREATEMOCOMPDATA puCreateMoCompData);

DWORD APIENTRY DxDdDestroyMoComp(
    IN     HANDLE hMoComp,
    IN OUT PDD_DESTROYMOCOMPDATA puDestroyMoCompData);

DWORD APIENTRY DxDdBeginMoCompFrame(
    IN     HANDLE hMoComp,
    IN OUT PDD_BEGINMOCOMPFRAMEDATA puBeginFrameData);

DWORD APIENTRY DxDdEndMoCompFrame(
    IN     HANDLE hMoComp,
    IN OUT PDD_ENDMOCOMPFRAMEDATA  puEndFrameData);

DWORD APIENTRY DxDdRenderMoComp(
    IN     HANDLE hMoComp,
    IN OUT PDD_RENDERMOCOMPDATA puRenderMoCompData);

DWORD APIENTRY DxDdQueryMoCompStatus(
    IN OUT HANDLE hMoComp,
    IN OUT PDD_QUERYMOCOMPSTATUSDATA puQueryMoCompStatusData);

DWORD APIENTRY DxDdAlphaBlt(
    IN     HANDLE hSurfaceDest,
    IN     HANDLE hSurfaceSrc,
    IN OUT PDD_BLTDATA puBltData);

DWORD APIENTRY DxDvpCanCreateVideoPort(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_CANCREATEVPORTDATA puCanCreateVPortData);

DWORD APIENTRY DxDvpColorControl(
    IN     HANDLE hVideoPort,
    IN OUT PDD_VPORTCOLORDATA puVPortColorData);

HANDLE APIENTRY DxDvpCreateVideoPort(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_CREATEVPORTDATA puCreateVPortData);

DWORD  APIENTRY DxDvpDestroyVideoPort(
    IN     HANDLE hVideoPort,
    IN OUT PDD_DESTROYVPORTDATA puDestroyVPortData);

DWORD  APIENTRY DxDvpFlipVideoPort(
    IN     HANDLE hVideoPort,
    IN     HANDLE hDDSurfaceCurrent,
    IN     HANDLE hDDSurfaceTarget,
    IN OUT PDD_FLIPVPORTDATA puFlipVPortData);

DWORD  APIENTRY DxDvpGetVideoPortBandwidth(
    IN     HANDLE hVideoPort,
    IN OUT PDD_GETVPORTBANDWIDTHDATA puGetVPortBandwidthData);

DWORD  APIENTRY DxDvpGetVideoPortField(
    IN     HANDLE hVideoPort,
    IN OUT PDD_GETVPORTFIELDDATA puGetVPortFieldData);

DWORD  APIENTRY DxDvpGetVideoPortFlipStatus(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_GETVPORTFLIPSTATUSDATA puGetVPortFlipStatusData);

DWORD  APIENTRY DxDvpGetVideoPortInputFormats(
    IN     HANDLE hVideoPort,
    IN OUT PDD_GETVPORTINPUTFORMATDATA puGetVPortInputFormatData);

DWORD  APIENTRY DxDvpGetVideoPortLine(
    IN     HANDLE hVideoPort,
    IN OUT PDD_GETVPORTLINEDATA puGetVPortLineData);

DWORD  APIENTRY DxDvpGetVideoPortOutputFormats(
    IN     HANDLE hVideoPort,
    IN OUT PDD_GETVPORTOUTPUTFORMATDATA puGetVPortOutputFormatData);

DWORD  APIENTRY DxDvpGetVideoPortConnectInfo(
    IN     HANDLE hDirectDraw,
    IN OUT PDD_GETVPORTCONNECTDATA puGetVPortConnectData);

DWORD  APIENTRY DxDvpGetVideoSignalStatus(
    IN     HANDLE hVideoPort,
    IN OUT PDD_GETVPORTSIGNALDATA puGetVPortSignalData);

DWORD  APIENTRY DxDvpUpdateVideoPort(
    IN     HANDLE hVideoPort,
    IN     HANDLE* phSurfaceVideo,
    IN     HANDLE* phSurfaceVbi,
    IN OUT PDD_UPDATEVPORTDATA puUpdateVPortData);

DWORD  APIENTRY DxDvpWaitForVideoPortSync(
    IN     HANDLE hVideoPort,
    IN OUT PDD_WAITFORVPORTSYNCDATA puWaitForVPortSyncData);

DWORD  APIENTRY DxDvpAcquireNotification(
    IN     HANDLE hVideoPort,
    IN OUT HANDLE* phEvent,
    IN     LPDDVIDEOPORTNOTIFY pNotify);

DWORD  APIENTRY DxDvpReleaseNotification(
    IN     HANDLE hVideoPort,
    IN     HANDLE hEvent);

FLATPTR WINAPI DxDdHeapVidMemAllocAligned( 
                LPVIDMEM lpVidMem,
                DWORD dwWidth, 
                DWORD dwHeight, 
                LPSURFACEALIGNMENT lpAlignment , 
                LPLONG lpNewPitch );

VOID    WINAPI DxDdHeapVidMemFree( LPVMEMHEAP pvmh, FLATPTR ptr );

//
// Private for win32k.sys
//
BOOL DxDdEnableDirectDraw(
    HDEV hdev,
    BOOL bEnableDriver
    );

VOID DxDdDisableDirectDraw(
    HDEV hdev,
    BOOL bDisableDriver
    );

VOID DxDdSuspendDirectDraw(
    HDEV    hdev,
    ULONG   fl
    );

VOID DxDdResumeDirectDraw(
    HDEV    hdev,
    ULONG   fl
    );

#define DXG_SR_DDRAW_CHILDREN    0x0001
#define DXG_SR_DDRAW_MODECHANGE  0x0002

VOID DxDdDynamicModeChange(
    HDEV    hdevOld,
    HDEV    hdevNew,
    ULONG   fl
    );

#define DXG_MODECHANGE_TRANSFER  0x0001

VOID DxDdCloseProcess(
    W32PID  W32Pid
    );

BOOL DxDdGetDirectDrawBounds(
    HDEV    hdev,
    RECT*   prcBounds
    );

BOOL DxDdEnableDirectDrawRedirection(
    HDEV hdev,
    BOOL bEnable
    );

PVOID DxDdAllocPrivateUserMem(
    PDD_SURFACE_LOCAL pSurfaceLocal,
    SIZE_T cj,
    ULONG tag
    );

VOID DxDdFreePrivateUserMem(
    PDD_SURFACE_LOCAL pSurfaceLocal,
    PVOID pv
    );

HRESULT DxDdIoctl(
    ULONG ulIoctl,
    PVOID pBuffer,
    ULONG ulBufferSize
    );

PDD_SURFACE_LOCAL DxDdLockDirectDrawSurface(
    HANDLE hSurface
    );

BOOL DxDdUnlockDirectDrawSurface(
    PDD_SURFACE_LOCAL pSurface
    );

VOID DxDdSetAccelLevel(
    HDEV  hdev,
    DWORD dwAccelLevel,
    DWORD dwOverride
    );

DWORD DxDdGetSurfaceLock(
    HDEV  hdev
    );

PVOID DxDdEnumLockedSurfaceRect(
    HDEV   hdev,
    PVOID  pvSurface,
    RECTL *pLockedRect
    ); 

typedef DWORD (APIENTRY *PFN_DxDxgGenericThunk)(IN ULONG_PTR,IN ULONG_PTR,
                                                IN OUT SIZE_T *,IN OUT PVOID,
                                                IN OUT SIZE_T *,IN OUT PVOID);
typedef DWORD (APIENTRY *PFN_DxDdAddAttachedSurface)(IN HANDLE,IN HANDLE,IN OUT PDD_ADDATTACHEDSURFACEDATA);
typedef BOOL  (APIENTRY *PFN_DxDdAttachSurface)(IN HANDLE,IN HANDLE);
typedef DWORD (APIENTRY *PFN_DxDdBlt)(IN HANDLE,IN HANDLE,IN OUT PDD_BLTDATA);
typedef DWORD (APIENTRY *PFN_DxDdCanCreateSurface)(IN HANDLE,IN OUT PDD_CANCREATESURFACEDATA);
typedef DWORD (APIENTRY *PFN_DxDdColorControl)(IN HANDLE,IN OUT PDD_COLORCONTROLDATA);
typedef HANDLE (APIENTRY *PFN_DxDdCreateDirectDrawObject)(IN HDC);
typedef DWORD (APIENTRY *PFN_DxDdCreateSurface)(IN HANDLE,IN HANDLE*,IN OUT DDSURFACEDESC*,
                                                IN OUT DD_SURFACE_GLOBAL*,IN OUT DD_SURFACE_LOCAL*,
                                                IN OUT DD_SURFACE_MORE*,IN OUT DD_CREATESURFACEDATA*,
                                                OUT HANDLE*);
typedef HANDLE (APIENTRY *PFN_DxDdCreateSurfaceObject)(IN HANDLE,IN HANDLE,IN PDD_SURFACE_LOCAL,
                                                       IN PDD_SURFACE_MORE,IN PDD_SURFACE_GLOBAL, 
                                                       IN BOOL);
typedef BOOL (APIENTRY *PFN_DxDdDeleteSurfaceObject)(IN HANDLE);
typedef BOOL (APIENTRY *PFN_DxDdDeleteDirectDrawObject)(IN HANDLE);
typedef DWORD (APIENTRY *PFN_DxDdDestroySurface)(IN HANDLE,IN BOOL);
typedef DWORD (APIENTRY *PFN_DxDdFlip)(IN HANDLE,IN HANDLE,IN HANDLE,IN HANDLE,IN OUT PDD_FLIPDATA);
typedef DWORD (APIENTRY *PFN_DxDdGetAvailDriverMemory)(IN HANDLE,IN OUT PDD_GETAVAILDRIVERMEMORYDATA);
typedef DWORD (APIENTRY *PFN_DxDdGetBltStatus)(IN HANDLE,IN OUT PDD_GETBLTSTATUSDATA);
typedef HDC   (APIENTRY *PFN_DxDdGetDC)(IN HANDLE,IN PALETTEENTRY*);
typedef DWORD (APIENTRY *PFN_DxDdGetDriverInfo)(IN HANDLE,IN OUT PDD_GETDRIVERINFODATA);
typedef DWORD (APIENTRY *PFN_DxDdGetFlipStatus)(IN HANDLE,IN OUT PDD_GETFLIPSTATUSDATA);
typedef DWORD (APIENTRY *PFN_DxDdGetScanLine)(IN HANDLE,IN OUT PDD_GETSCANLINEDATA);
typedef DWORD (APIENTRY *PFN_DxDdSetExclusiveMode)(IN HANDLE,IN OUT PDD_SETEXCLUSIVEMODEDATA);
typedef DWORD (APIENTRY *PFN_DxDdFlipToGDISurface)(IN HANDLE,IN OUT PDD_FLIPTOGDISURFACEDATA);
typedef DWORD (APIENTRY *PFN_DxDdLock)(IN HANDLE,IN OUT PDD_LOCKDATA,IN HDC);
typedef BOOL  (APIENTRY *PFN_DxDdQueryDirectDrawObject)(IN HANDLE,IN OUT PDD_HALINFO,IN OUT DWORD*,
                                                        IN OUT LPD3DNTHAL_CALLBACKS,
                                                        IN OUT LPD3DNTHAL_GLOBALDRIVERDATA,
                                                        IN OUT PDD_D3DBUFCALLBACKS,
                                                        IN OUT LPDDSURFACEDESC,
                                                        IN OUT DWORD*, IN OUT VIDEOMEMORY*,
                                                        IN OUT DWORD*, IN OUT DWORD*);
typedef BOOL  (APIENTRY *PFN_DxDdReenableDirectDrawObject)(IN HANDLE,IN OUT BOOL*);
typedef BOOL  (APIENTRY *PFN_DxDdReleaseDC)(IN HANDLE);
typedef BOOL  (APIENTRY *PFN_DxDdResetVisrgn)(IN HANDLE,IN HWND);
typedef DWORD (APIENTRY *PFN_DxDdSetColorKey)(IN HANDLE,IN OUT PDD_SETCOLORKEYDATA);
typedef DWORD (APIENTRY *PFN_DxDdSetOverlayPosition)(IN HANDLE,IN HANDLE,IN OUT PDD_SETOVERLAYPOSITIONDATA);
typedef VOID  (APIENTRY *PFN_DxDdUnattachSurface)(IN HANDLE,IN HANDLE);
typedef DWORD (APIENTRY *PFN_DxDdUnlock)(IN HANDLE,IN OUT PDD_UNLOCKDATA);
typedef DWORD (APIENTRY *PFN_DxDdUpdateOverlay)(IN HANDLE,IN HANDLE,IN OUT PDD_UPDATEOVERLAYDATA);
typedef DWORD (APIENTRY *PFN_DxDdWaitForVerticalBlank)(IN HANDLE,IN OUT PDD_WAITFORVERTICALBLANKDATA);
typedef HANDLE (APIENTRY *PFN_DxDdGetDxHandle)(IN HANDLE,IN HANDLE,IN BOOL);
typedef BOOL  (APIENTRY *PFN_DxDdSetGammaRamp)(IN HANDLE,IN HDC,IN LPVOID);
typedef DWORD (APIENTRY *PFN_DxDdLockD3D)(IN HANDLE,IN OUT PDD_LOCKDATA);
typedef DWORD (APIENTRY *PFN_DxDdUnlockD3D)(IN HANDLE,IN OUT PDD_UNLOCKDATA);
typedef DWORD (APIENTRY *PFN_DxDdCreateD3DBuffer)(IN HANDLE,IN OUT HANDLE*,
                                                  IN OUT DDSURFACEDESC*,IN OUT DD_SURFACE_GLOBAL*,
                                                  IN OUT DD_SURFACE_LOCAL*,IN OUT DD_SURFACE_MORE*,
                                                  IN OUT DD_CREATESURFACEDATA*,IN OUT HANDLE*);
typedef DWORD (APIENTRY *PFN_DxDdCanCreateD3DBuffer)(IN HANDLE,IN OUT PDD_CANCREATESURFACEDATA);
typedef DWORD (APIENTRY *PFN_DxDdDestroyD3DBuffer)(IN HANDLE);
typedef DWORD (APIENTRY *PFN_DxD3dContextCreate)(IN HANDLE,IN HANDLE,IN HANDLE,IN OUT D3DNTHAL_CONTEXTCREATEI*);
typedef DWORD (APIENTRY *PFN_DxD3dContextDestroy)(IN LPD3DNTHAL_CONTEXTDESTROYDATA);
typedef DWORD (APIENTRY *PFN_DxD3dContextDestroyAll)(OUT LPD3DNTHAL_CONTEXTDESTROYALLDATA);
typedef DWORD (APIENTRY *PFN_DxD3dValidateTextureStageState)(IN OUT LPD3DNTHAL_VALIDATETEXTURESTAGESTATEDATA);
typedef DWORD (APIENTRY *PFN_DxD3dDrawPrimitives2)(IN HANDLE,IN HANDLE,IN OUT LPD3DNTHAL_DRAWPRIMITIVES2DATA pded,
                                                   IN OUT FLATPTR*,IN OUT DWORD*,IN OUT FLATPTR*,IN OUT DWORD*);
typedef DWORD (APIENTRY *PFN_DxDdGetDriverState)(IN OUT PDD_GETDRIVERSTATEDATA);
typedef DWORD (APIENTRY *PFN_DxDdCreateSurfaceEx)(IN HANDLE,IN HANDLE,IN DWORD);
typedef DWORD (APIENTRY *PFN_DxDdGetMoCompGuids)(IN HANDLE,IN OUT PDD_GETMOCOMPGUIDSDATA);
typedef DWORD (APIENTRY *PFN_DxDdGetMoCompFormats)(IN HANDLE,IN OUT PDD_GETMOCOMPFORMATSDATA);
typedef DWORD (APIENTRY *PFN_DxDdGetMoCompBuffInfo)(IN HANDLE,IN OUT PDD_GETMOCOMPCOMPBUFFDATA);
typedef DWORD (APIENTRY *PFN_DxDdGetInternalMoCompInfo)(IN HANDLE,IN OUT PDD_GETINTERNALMOCOMPDATA);
typedef HANDLE (APIENTRY *PFN_DxDdCreateMoComp)(IN HANDLE,IN OUT PDD_CREATEMOCOMPDATA);
typedef DWORD (APIENTRY *PFN_DxDdDestroyMoComp)(IN HANDLE,IN OUT PDD_DESTROYMOCOMPDATA);
typedef DWORD (APIENTRY *PFN_DxDdBeginMoCompFrame)(IN HANDLE,IN OUT PDD_BEGINMOCOMPFRAMEDATA);
typedef DWORD (APIENTRY *PFN_DxDdEndMoCompFrame)(IN HANDLE,IN OUT PDD_ENDMOCOMPFRAMEDATA);
typedef DWORD (APIENTRY *PFN_DxDdRenderMoComp)(IN HANDLE,IN OUT PDD_RENDERMOCOMPDATA);
typedef DWORD (APIENTRY *PFN_DxDdQueryMoCompStatus)(IN OUT HANDLE,IN OUT PDD_QUERYMOCOMPSTATUSDATA);
typedef DWORD (APIENTRY *PFN_DxDdAlphaBlt)(IN HANDLE,IN HANDLE,IN OUT PDD_BLTDATA);
typedef DWORD (APIENTRY *PFN_DxDvpCanCreateVideoPort)(IN HANDLE,IN OUT PDD_CANCREATEVPORTDATA);
typedef DWORD (APIENTRY *PFN_DxDvpColorControl)(IN HANDLE,IN OUT PDD_VPORTCOLORDATA);
typedef HANDLE (APIENTRY *PFN_DxDvpCreateVideoPort)(IN HANDLE,IN OUT PDD_CREATEVPORTDATA);
typedef DWORD (APIENTRY *PFN_DxDvpDestroyVideoPort)(IN HANDLE,IN OUT PDD_DESTROYVPORTDATA);
typedef DWORD (APIENTRY *PFN_DxDvpFlipVideoPort)(IN HANDLE,IN HANDLE,IN HANDLE,IN OUT PDD_FLIPVPORTDATA);
typedef DWORD (APIENTRY *PFN_DxDvpGetVideoPortBandwidth)(IN HANDLE,IN OUT PDD_GETVPORTBANDWIDTHDATA);
typedef DWORD (APIENTRY *PFN_DxDvpGetVideoPortField)(IN HANDLE,IN OUT PDD_GETVPORTFIELDDATA);
typedef DWORD (APIENTRY *PFN_DxDvpGetVideoPortFlipStatus)(IN HANDLE,IN OUT PDD_GETVPORTFLIPSTATUSDATA);
typedef DWORD (APIENTRY *PFN_DxDvpGetVideoPortInputFormats)(IN HANDLE,IN OUT PDD_GETVPORTINPUTFORMATDATA);
typedef DWORD (APIENTRY *PFN_DxDvpGetVideoPortLine)(IN HANDLE,IN OUT PDD_GETVPORTLINEDATA);
typedef DWORD (APIENTRY *PFN_DxDvpGetVideoPortOutputFormats)(IN HANDLE,IN OUT PDD_GETVPORTOUTPUTFORMATDATA);
typedef DWORD (APIENTRY *PFN_DxDvpGetVideoPortConnectInfo)(IN HANDLE,IN OUT PDD_GETVPORTCONNECTDATA);
typedef DWORD (APIENTRY *PFN_DxDvpGetVideoSignalStatus)(IN HANDLE,IN OUT PDD_GETVPORTSIGNALDATA);
typedef DWORD (APIENTRY *PFN_DxDvpUpdateVideoPort)(IN HANDLE,IN HANDLE*,IN HANDLE*,IN OUT PDD_UPDATEVPORTDATA);
typedef DWORD (APIENTRY *PFN_DxDvpWaitForVideoPortSync)(IN HANDLE,IN OUT PDD_WAITFORVPORTSYNCDATA);
typedef DWORD (APIENTRY *PFN_DxDvpAcquireNotification)(IN HANDLE,IN OUT HANDLE*,IN OUT LPDDVIDEOPORTNOTIFY pNotify);
typedef DWORD (APIENTRY *PFN_DxDvpReleaseNotification)(IN HANDLE,IN HANDLE);
typedef DWORD (APIENTRY *PFN_DxDdGetMoCompGuids)(IN HANDLE,IN OUT PDD_GETMOCOMPGUIDSDATA);
typedef DWORD (APIENTRY *PFN_DxDdGetMoCompFormats)(IN HANDLE,IN OUT PDD_GETMOCOMPFORMATSDATA);
typedef DWORD (APIENTRY *PFN_DxDdGetMoCompBuffInfo)(IN HANDLE,IN OUT PDD_GETMOCOMPCOMPBUFFDATA);
typedef FLATPTR (WINAPI *PFN_DxDdHeapVidMemAllocAligned)(LPVIDMEM,DWORD,DWORD,LPSURFACEALIGNMENT,LPLONG);
typedef VOID    (WINAPI *PFN_DxDdHeapVidMemFree)(LPVMEMHEAP,FLATPTR);
typedef BOOL  (*PFN_DxDdEnableDirectDraw)(HDEV,BOOL);
typedef VOID  (*PFN_DxDdDisableDirectDraw)(HDEV,BOOL);
typedef VOID  (*PFN_DxDdSuspendDirectDraw)(HDEV,ULONG);
typedef VOID  (*PFN_DxDdResumeDirectDraw)(HDEV,ULONG);
typedef VOID  (*PFN_DxDdDynamicModeChange)(HDEV,HDEV,ULONG);
typedef VOID  (*PFN_DxDdCloseProcess)(W32PID);
typedef BOOL  (*PFN_DxDdGetDirectDrawBounds)(HDEV,RECT*);
typedef BOOL  (*PFN_DxDdEnableDirectDrawRedirection)(HDEV,BOOL);
typedef PVOID (*PFN_DxDdAllocPrivateUserMem)(PDD_SURFACE_LOCAL,SIZE_T,ULONG);
typedef VOID  (*PFN_DxDdFreePrivateUserMem)(PDD_SURFACE_LOCAL,PVOID);
typedef PDD_SURFACE_LOCAL (*PFN_DxDdLockDirectDrawSurface)(HANDLE);
typedef BOOL  (*PFN_DxDdUnlockDirectDrawSurface)(PDD_SURFACE_LOCAL);
typedef VOID  (*PFN_DxDdSetAccelLevel)(HDEV,DWORD,DWORD);
typedef DWORD (*PFN_DxDdGetSurfaceLock)(HDEV);
typedef PVOID (*PFN_DxDdEnumLockedSurfaceRect)(HDEV,PVOID,RECTL*);
typedef HRESULT (*PFN_DxDdIoctl)(ULONG,PVOID,ULONG);

//
// The functions definiton which import from win32k.sys
//
// Functions for global win32k.sys status.
//

#define INDEX_DxEngUnused                         0
#define INDEX_DxEngIsTermSrv                      1
#define INDEX_DxEngScreenAccessCheck              2
#define INDEX_DxEngRedrawDesktop                  3
#define INDEX_DxEngDispUniq                       4
#define INDEX_DxEngIncDispUniq                    5
#define INDEX_DxEngVisRgnUniq                     6
#define INDEX_DxEngLockShareSem                   7
#define INDEX_DxEngUnlockShareSem                 8
#define INDEX_DxEngEnumerateHdev                  9
#define INDEX_DxEngLockHdev                      10
#define INDEX_DxEngUnlockHdev                    11
#define INDEX_DxEngIsHdevLockedByCurrentThread   12
#define INDEX_DxEngReferenceHdev                 13
#define INDEX_DxEngUnreferenceHdev               14
#define INDEX_DxEngGetDeviceGammaRamp            15
#define INDEX_DxEngSetDeviceGammaRamp            16
#define INDEX_DxEngSpTearDownSprites             17
#define INDEX_DxEngSpUnTearDownSprites           18
#define INDEX_DxEngSpSpritesVisible              19
#define INDEX_DxEngGetHdevData                   20
#define INDEX_DxEngSetHdevData                   21
#define INDEX_DxEngCreateMemoryDC                22
#define INDEX_DxEngGetDesktopDC                  23
#define INDEX_DxEngDeleteDC                      24
#define INDEX_DxEngCleanDC                       25
#define INDEX_DxEngSetDCOwner                    26
#define INDEX_DxEngLockDC                        27
#define INDEX_DxEngUnlockDC                      28
#define INDEX_DxEngSetDCState                    29
#define INDEX_DxEngGetDCState                    30
#define INDEX_DxEngSelectBitmap                  31
#define INDEX_DxEngSetBitmapOwner                32
#define INDEX_DxEngDeleteSurface                 33
#define INDEX_DxEngGetSurfaceData                34
#define INDEX_DxEngAltLockSurface                35
#define INDEX_DxEngUploadPaletteEntryToSurface   36
#define INDEX_DxEngMarkSurfaceAsDirectDraw       37
#define INDEX_DxEngSelectPaletteToSurface        38
#define INDEX_DxEngSyncPaletteTableWithDevice    39
#define INDEX_DxEngSetPaletteState               40
#define INDEX_DxEngGetRedirectionBitmap          41
#define INDEX_DxEngLoadImage                     42

#define INDEX_WIN32K_TABLE_SIZE                  43

// DxEngSetHdevData()

#define HDEV_SURFACEHANDLE         0  // Get only
#define HDEV_MINIPORTHANDLE        1  // Get only
#define HDEV_DITHERFORMAT          2  // Get only
#define HDEV_GCAPS                 3
#define HDEV_GCAPS2                4
#define HDEV_FUNCTIONTABLE         5  // Get only
#define HDEV_DHPDEV                6  // Get only
#define HDEV_DXDATA                7
#define HDEV_DXLOCKS               8
#define HDEV_CAPSOVERRIDE          9  // Get only
#define HDEV_DISABLED             10
#define HDEV_DDML                 11  // Get only
#define HDEV_DISPLAY              12  // Get only
#define HDEV_PARENTHDEV           13  // Get only
#define HDEV_DELETED              14  // Get only
#define HDEV_PALMANAGED           15  // Get only
#define HDEV_LDEV                 16  // Get only
#define HDEV_GRAPHICSDEVICE       17  // Get only
#define HDEV_CLONE                18  // Get only

// DxEngGetDCState()

#define DCSTATE_FULLSCREEN         1
#define DCSTATE_VISRGNCOMPLEX      2 // Get only
#define DCSTATE_HDEV               3 // Get only

// DxEngGetSurfaceData()

#define SURF_HOOKFLAGS              1
#define SURF_IS_DIRECTDRAW_SURFACE  2
#define SURF_DD_SURFACE_HANDLE      3

// DxEngSetPaletteState()

#define PALSTATE_DIBSECTION        1

#ifdef DXG_BUILD // ONLY TRUE WHEN BUILD DXG.SYS.

//
// Stub routines to call Win32k.sys
//

extern DRVFN *gpEngFuncs;

typedef BOOL (*PFN_DxEngIsTermSrv)(VOID);
typedef BOOL (*PFN_DxEngScreenAccessCheck)(VOID);
typedef BOOL (*PFN_DxEngRedrawDesktop)(VOID);
typedef ULONG (*PFN_DxEngDispUniq)(VOID);
typedef BOOL (*PFN_DxEngIncDispUniq)(VOID);
typedef ULONG (*PFN_DxEngVisRgnUniq)(VOID);
typedef BOOL (*PFN_DxEngLockShareSem)(VOID);
typedef BOOL (*PFN_DxEngUnlockShareSem)(VOID);
typedef HDEV (*PFN_DxEngEnumerateHdev)(HDEV);
typedef BOOL (*PFN_DxEngLockHdev)(HDEV);
typedef BOOL (*PFN_DxEngUnlockHdev)(HDEV);
typedef BOOL (*PFN_DxEngIsHdevLockedByCurrentThread)(HDEV);
typedef BOOL (*PFN_DxEngReferenceHdev)(HDEV);
typedef BOOL (*PFN_DxEngUnreferenceHdev)(HDEV);
typedef BOOL (*PFN_DxEngGetDeviceGammaRamp)(HDEV,PVOID);
typedef BOOL (*PFN_DxEngSetDeviceGammaRamp)(HDEV,PVOID,BOOL);
typedef BOOL (*PFN_DxEngSpTearDownSprites)(HDEV,RECTL*,BOOL);
typedef BOOL (*PFN_DxEngSpUnTearDownSprites)(HDEV,RECTL*,BOOL);
typedef BOOL (*PFN_DxEngSpSpritesVisible)(HDEV);
typedef ULONG_PTR (*PFN_DxEngGetHdevData)(HDEV,DWORD);
typedef BOOL (*PFN_DxEngSetHdevData)(HDEV,DWORD,ULONG_PTR);
typedef HDC  (*PFN_DxEngCreateMemoryDC)(HDEV);
typedef HDC  (*PFN_DxEngGetDesktopDC)(ULONG,BOOL,BOOL);
typedef BOOL (*PFN_DxEngDeleteDC)(HDC,BOOL);
typedef BOOL (*PFN_DxEngCleanDC)(HDC);
typedef BOOL (*PFN_DxEngSetDCOwner)(HDC,W32PID);
typedef PVOID (*PFN_DxEngLockDC)(HDC);
typedef BOOL (*PFN_DxEngUnlockDC)(PVOID);
typedef BOOL (*PFN_DxEngSetDCState)(HDC,DWORD,ULONG_PTR);
typedef ULONG_PTR (*PFN_DxEngGetDCState)(HDC,DWORD);
typedef HBITMAP (*PFN_DxEngSelectBitmap)(HDC,HBITMAP);
typedef BOOL (*PFN_DxEngSetBitmapOwner)(HBITMAP,W32PID);
typedef BOOL (*PFN_DxEngDeleteSurface)(HSURF hsurf);
typedef ULONG_PTR (*PFN_DxEngGetSurfaceData)(SURFOBJ*,DWORD);
typedef SURFOBJ* (*PFN_DxEngAltLockSurface)(HBITMAP);
typedef BOOL (*PFN_DxEngUploadPaletteEntryToSurface)(HDEV,SURFOBJ*,PALETTEENTRY*,ULONG);
typedef BOOL (*PFN_DxEngMarkSurfaceAsDirectDraw)(SURFOBJ*,HANDLE);
typedef HPALETTE (*PFN_DxEngSelectPaletteToSurface)(SURFOBJ*,HPALETTE);
typedef BOOL (*PFN_DxEngSyncPaletteTableWithDevice)(HPALETTE,HDEV);
typedef BOOL (*PFN_DxEngSetPaletteState)(HPALETTE,DWORD,ULONG_PTR);
typedef HBITMAP (*PFN_DxEngGetRedirectionBitmap)(HWND);
typedef HANDLE (*PFN_DxEngLoadImage)(LPWSTR,BOOL);

#define PPFNGET_DXENG(name)        ((PFN_DxEng##name)((gpEngFuncs[INDEX_DxEng##name]).pfn))
#define CALL_DXENG(name)           (*(PPFNGET_DXENG(name)))

#define DxEngIsTermSrv()           ((BOOL)(CALL_DXENG(IsTermSrv)()))
#define DxEngScreenAccessCheck()   ((BOOL)(CALL_DXENG(ScreenAccessCheck)()))
#define DxEngRedrawDesktop()       ((BOOL)(CALL_DXENG(RedrawDesktop)()))

#define DxEngDispUniq()            ((ULONG)(CALL_DXENG(DxEngDispUniq)()))
#define DxEngIncDispUniq()         ((BOOL)(CALL_DXENG(IncDispUniq)()))
#define DxEngVisRgnUniq()          ((ULONG)(CALL_DXENG(VisRgnUniq)()))

#define DxEngLockShareSem()        ((BOOL)(CALL_DXENG(LockShareSem)()))
#define DxEngUnlockShareSem()      ((BOOL)(CALL_DXENG(UnlockShareSem)()))

#define DxEngEnumerateHdev(hdev)   ((HDEV)(CALL_DXENG(EnumerateHdev)(hdev)))

#define DxEngLockHdev(hdev)        ((BOOL)(CALL_DXENG(LockHdev)(hdev)))
#define DxEngUnlockHdev(hdev)      ((BOOL)(CALL_DXENG(UnlockHdev)(hdev)))

#define DxEngIsHdevLockedByCurrentThread(hdev) \
                                   ((BOOL)(CALL_DXENG(IsHdevLockedByCurrentThread)(hdev)))

#define DxEngReferenceHdev(hdev)   ((BOOL)(CALL_DXENG(ReferenceHdev)(hdev)))
#define DxEngUnreferenceHdev(hdev) ((BOOL)(CALL_DXENG(UnreferenceHdev)(hdev)))

#define DxEngGetHdevData(hdev,dwIndex) \
                                   ((ULONG_PTR)(CALL_DXENG(GetHdevData)(hdev,dwIndex)))
#define DxEngSetHdevData(hdev,dwIndex,pData) \
                                   ((BOOL)(CALL_DXENG(SetHdevData)(hdev,dwIndex,pData)))

#define DxEngCreateMemoryDC(hdev)  ((HDC)(CALL_DXENG(CreateMemoryDC)(hdev)))
#define DxEngGetDesktopDC(ulType,bAltType,bValidate) \
                                   ((HDC)(CALL_DXENG(GetDesktopDC)(ulType,bAltType,bValidate)))
#define DxEngDeleteDC(hdc,bForce)  ((BOOL)(CALL_DXENG(DeleteDC)(hdc,bForce)))
#define DxEngCleanDC(hdc)          ((BOOL)(CALL_DXENG(CleanDC)(hdc)))

#define DxEngSetDCOwner(hdc,pidOwner) \
                                   ((BOOL)(CALL_DXENG(SetDCOwner)(hdc,pidOwner)))

#define DxEngLockDC(hdc)           ((PVOID)(CALL_DXENG(LockDC)(hdc)))
#define DxEngUnlockDC(pvLockedDC)  ((BOOL)(CALL_DXENG(UnlockDC)(pvLockedDC)))

#define DxEngSetDCState(hdc,dwState,ulData) \
                                   ((BOOL)(CALL_DXENG(SetDCState)(hdc,dwState,ulData)))
#define DxEngGetDCState(hdc,dwState) \
                                   ((ULONG_PTR)(CALL_DXENG(GetDCState)(hdc,dwState)))

#define DxEngSelectBitmap(hdc,hbm) ((HBITMAP)(CALL_DXENG(SelectBitmap)(hdc,hbm)))
#define DxEngSetBitmapOwner(hbm,pidOwner) \
                                   ((BOOL)(CALL_DXENG(SetBitmapOwner)(hbm,pidOwner)))
#define DxEngDeleteSurface(hsurf)  ((BOOL)(CALL_DXENG(DeleteSurface)(hsurf)))
#define DxEngGetSurfaceData(pso,dwIndex) \
                                   ((ULONG_PTR)(CALL_DXENG(GetSurfaceData)(pso,dwIndex)))
#define DxEngAltLockSurface(hsurf) ((SURFOBJ*)(CALL_DXENG(AltLockSurface)(hsurf)))
#define DxEngUploadPaletteEntryToSurface(hdev,pso,puColorTable,cColors) \
                                   ((BOOL)(CALL_DXENG(UploadPaletteEntryToSurface)(hdev,pso,puColorTable,cColors)))
#define DxEngMarkSurfaceAsDirectDraw(pso,hDdSurf) \
                                   ((BOOL)(CALL_DXENG(MarkSurfaceAsDirectDraw)(pso,hDdSurf)))
#define DxEngSelectPaletteToSurface(pso,hpal) \
                                   ((HPALETTE)(CALL_DXENG(SelectPaletteToSurface)(pso,hpal)))

#define DxEngGetDeviceGammaRamp(hdev,pv) \
                                   ((BOOL)(CALL_DXENG(GetDeviceGammaRamp)(hdev,pv)))
#define DxEngSetDeviceGammaRamp(hdev,pv,b) \
                                   ((BOOL)(CALL_DXENG(SetDeviceGammaRamp)(hdev,pv,b)))

#define DxEngSpTearDownSprites(hdev,prcl,b) \
                                   ((BOOL)(CALL_DXENG(SpTearDownSprites)(hdev,prcl,b)))
#define DxEngSpUnTearDownSprites(hdev,prcl,b) \
                                   ((BOOL)(CALL_DXENG(SpUnTearDownSprites)(hdev,prcl,b)))
#define DxEngSpSpritesVisible(hdev) \
                                   ((BOOL)(CALL_DXENG(SpSpritesVisible)(hdev)))

#define DxEngSetPaletteState(hpal,dwIndex,ulData) \
                                   ((BOOL)(CALL_DXENG(SetPaletteState)(hpal,dwIndex,ulData)))
#define DxEngSyncPaletteTableWithDevice(hpal,hdev) \
                                   ((BOOL)(CALL_DXENG(SyncPaletteTableWithDevice)(hpal,hdev)))

#define DxEngGetRedirectionBitmap(hWnd) \
                                   ((HBITMAP)(CALL_DXENG(GetRedirectionBitmap)(hWnd)))
#define DxEngLoadImage(pwszDriver, bLoadInSessionSpace) \
                                   ((HANDLE)(CALL_DXENG(LoadImage)(pwszDriver,bLoadInSessionSpace)))

#else // DXG_BUILD

//
// Prototype definitions for function body in win32k.sys
//

BOOL   DxEngIsTermSrv(
       VOID
       );

BOOL   DxEngScreenAccessCheck(
       VOID
       );

BOOL   DxEngRedrawDesktop(
       VOID
       );

ULONG  DxEngDispUniq(
       VOID
       );

BOOL   DxEngIncDispUniq(
       VOID
       );

ULONG  DxEngVisRgnUniq(
       VOID
       );

BOOL   DxEngLockShareSem(
       VOID
       );

BOOL   DxEngUnlockShareSem(
       VOID
       );

HDEV   DxEngEnumerateHdev(
       HDEV hdev
       );

// Functions for control HDEV status.

BOOL   DxEngLockHdev(
       HDEV hdev
       );

BOOL   DxEngUnlockHdev(
       HDEV hdev
       );

BOOL   DxEngIsHdevLockedByCurrentThread(
       HDEV hdev
       );

BOOL   DxEngReferenceHdev(
       HDEV hdev
       );

BOOL   DxEngUnreferenceHdev(
       HDEV hdev
       );

BOOL   DxEngGetDeviceGammaRamp(
       HDEV  hdev,
       PVOID pv
       );

BOOL   DxEngSetDeviceGammaRamp(
       HDEV  hdev,
       PVOID pv,
       BOOL  b
       );

BOOL   DxEngSpTearDownSprites(
       HDEV   hdev,
       RECTL* prcl,
       BOOL   b
       );

BOOL   DxEngSpUnTearDownSprites(
       HDEV   hdev,
       RECTL* prcl,
       BOOL   b
       );

BOOL   DxEngSpSpritesVisible(
       HDEV   hdev
       );

ULONG_PTR DxEngGetHdevData(
          HDEV  hdev,
          DWORD dwIndex
          );

BOOL DxEngSetHdevData(
     HDEV  hdev,
     DWORD dwIndex,
     ULONG_PTR ulData
     );

// Functions for control DC

HDC  DxEngCreateMemoryDC(
     HDEV hdev
     );

HDC  DxEngGetDesktopDC(
     ULONG ulType,
     BOOL  bAltType,
     BOOL bValidate
     );

BOOL DxEngDeleteDC(
     HDC  hdc,
     BOOL bForce
     );

BOOL DxEngCleanDC(
     HDC hdc
     );

BOOL DxEngSetDCOwner(
     HDC    hdc,
     W32PID pidOwner
     );

PVOID DxEngLockDC(
     HDC hdc
     );

BOOL DxEngUnlockDC(
     PVOID pvLockedDC
     );

BOOL DxEngSetDCState(
     HDC   hdc,
     DWORD dwState,
     ULONG_PTR ulData
     );

ULONG_PTR DxEngGetDCState(
     HDC   hdc,
     DWORD dwState
     );

// Functions for control Bitmap/Surface

HBITMAP DxEngSelectBitmap(
        HDC     hdc,
        HBITMAP hbm
        );

BOOL DxEngSetBitmapOwner(
     HBITMAP hbm,
     W32PID  pidOwner
     );

BOOL DxEngDeleteSurface(
     HSURF hsurf
     );

ULONG_PTR DxEngGetSurfaceData(
     SURFOBJ* pso,
     DWORD dwIndex);

SURFOBJ *DxEngAltLockSurface(
     HBITMAP hSurf);

BOOL DxEngUploadPaletteEntryToSurface(
     HDEV     hdev,
     SURFOBJ* pso,
     PALETTEENTRY* puColorTable,
     ULONG         cColors
     );

BOOL DxEngMarkSurfaceAsDirectDraw(
     SURFOBJ* pso,
     HANDLE   hDdSurf
     );

HPALETTE DxEngSelectPaletteToSurface(
         SURFOBJ* pso,
         HPALETTE hpal
         );

// Functions for control palette

BOOL DxEngSyncPaletteTableWithDevice(
     HPALETTE hpal,
     HDEV     hdev
     );

BOOL DxEngSetPaletteState(
     HPALETTE  hpal,
     DWORD     dwIndex,
     ULONG_PTR ulData
     );

#define PALSTATE_DIBSECTION        1

// Functions for window handle

HBITMAP DxEngGetRedirectionBitmap(
        HWND hWnd
        );

// Functions to load image file

HANDLE DxEngLoadImage(
       LPWSTR pwszDriver,
       BOOL   bLoadInSessionSpace
       );

#endif // DXG_BUILD