|
|
/******************************Module*Header**********************************\
* * ******************* * * GDI SAMPLE CODE * * ******************* * * Module Name: thunks.c * * This module contains the routines for dynamically loading the newly * added GDI exported APIs in the NT5.0 environment. By dynamic loading * we enable the usage of the same binary on NT4.0. * * All the functions in this module should only be called on NT5.0. If called * on NT4.0 in debug builds they will bugcheck. * * Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved. * Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved. * \*****************************************************************************/
#include "precomp.h"
#include "gdi.h"
#include "directx.h"
#include "log.h"
#include "heap.h"
typedef BOOL (*_EngAlphaBlend)(IN SURFOBJ *psoDest, IN SURFOBJ *psoSrc, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN RECTL *prclDest, IN RECTL *prclSrc, IN BLENDOBJ *pBlendObj);
typedef BOOL (*_EngGradientFill)(IN SURFOBJ *psoDest, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN TRIVERTEX *pVertex, IN ULONG nVertex, IN PVOID pMesh, IN ULONG nMesh, IN RECTL *prclExtents, IN POINTL *pptlDitherOrg, IN ULONG ulMode);
typedef BOOL (*_EngTransparentBlt)(IN SURFOBJ *psoDst, IN SURFOBJ *psoSrc, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN RECTL *prclDst, IN RECTL *prclSrc, IN ULONG iTransparentColor, IN ULONG ulReserved);
typedef PVOID (*_EngMapFile)(IN LPWSTR pwsz, IN ULONG cjSize, IN ULONG_PTR *piFile);
typedef BOOL (*_EngUnmapFile)(IN ULONG_PTR iFile);
typedef BOOL (*_EngQuerySystemAttribute)(ENG_SYSTEM_ATTRIBUTE CapNum, PDWORD pCapability);
typedef ULONG (*_EngDitherColor)(HDEV hDev, ULONG iMode, ULONG rgb, ULONG *pul);
typedef BOOL (*_EngModifySurface)(HSURF hsurf, HDEV hdev, FLONG flHooks, FLONG flSurface, DHSURF dhSurf, VOID* pvScan0, LONG lDelta, VOID* pvReserved);
typedef BOOL (*_EngQueryDeviceAttribute)(HDEV hdev, ENG_DEVICE_ATTRIBUTE devAttr, VOID *pvIn, ULONG ulInSize, VOID *pvOut, ULONG ulOutSize);
typedef FLATPTR (*_HeapVidMemAllocAligned)(LPVIDMEM lpVidMem, DWORD dwWidth, DWORD dwHeight, LPSURFACEALIGNMENT lpAlignment, LPLONG lpNewPitch);
typedef void (*_VidMemFree)(LPVMEMHEAP pvmh, FLATPTR ptr);
typedef ULONG (*_EngHangNotification)(HDEV hdev, PVOID Reserved);
static _EngAlphaBlend pfnEngAlphaBlend = 0; static _EngGradientFill pfnEngGradientFill = 0; static _EngTransparentBlt pfnEngTransparentBlt = 0; static _EngMapFile pfnEngMapFile = 0; static _EngUnmapFile pfnEngUnmapFile = 0; static _EngQuerySystemAttribute pfnEngQuerySystemAttribute = 0; static _EngDitherColor pfnEngDitherColor = 0; static _EngModifySurface pfnEngModifySurface = 0; static _EngQueryDeviceAttribute pfnEngQueryDeviceAttribute = 0; static _HeapVidMemAllocAligned pfnHeapVidMemAllocAligned = 0; static _VidMemFree pfnVidMemFree = 0; static _EngHangNotification pfnEngHangNotification = 0;
#define LOADTHUNKFUNC(x)\
pfn##x = (_##x)EngFindImageProcAddress(0,#x);\ ASSERTDD(pfn##x != 0, #x"thunk NULL");\ if(pfn##x == 0)\ return FALSE;
//-----------------------------------------------------------------------------
//
// void bEnableThunks
//
//-----------------------------------------------------------------------------
BOOL bEnableThunks() { ASSERTDD(g_bOnNT40 == FALSE, "bEnableThunks: called on NT4.0");
LOADTHUNKFUNC(EngAlphaBlend); LOADTHUNKFUNC(EngGradientFill); LOADTHUNKFUNC(EngTransparentBlt); LOADTHUNKFUNC(EngMapFile); LOADTHUNKFUNC(EngUnmapFile); LOADTHUNKFUNC(EngQuerySystemAttribute); LOADTHUNKFUNC(EngDitherColor); LOADTHUNKFUNC(EngModifySurface); LOADTHUNKFUNC(EngQueryDeviceAttribute); LOADTHUNKFUNC(HeapVidMemAllocAligned); LOADTHUNKFUNC(VidMemFree); pfnEngHangNotification = (_EngHangNotification)EngFindImageProcAddress(0,"EngHangNotification");
return TRUE; }
//-----------------------------------------------------------------------------
//
// BOOL THUNK_EngAlphaBlend
//
//-----------------------------------------------------------------------------
BOOL THUNK_EngAlphaBlend(IN SURFOBJ *psoDest, IN SURFOBJ *psoSrc, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN RECTL *prclDest, IN RECTL *prclSrc, IN BLENDOBJ *pBlendObj) { ASSERTDD(g_bOnNT40 == FALSE, "EngAlphaBlend called on NT4.0");
return (*pfnEngAlphaBlend)(psoDest, psoSrc, pco, pxlo, prclDest, prclSrc, pBlendObj); }
//-----------------------------------------------------------------------------
//
// BOOL THUNK_EngGradientFill
//
//-----------------------------------------------------------------------------
BOOL THUNK_EngGradientFill(IN SURFOBJ *psoDest, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN TRIVERTEX *pVertex, IN ULONG nVertex, IN PVOID pMesh, IN ULONG nMesh, IN RECTL *prclExtents, IN POINTL *pptlDitherOrg, IN ULONG ulMode) { ASSERTDD(g_bOnNT40 == FALSE, "EngGradientFill called on NT4.0");
return (*pfnEngGradientFill)(psoDest, pco, pxlo, pVertex, nVertex, pMesh, nMesh, prclExtents, pptlDitherOrg, ulMode); }
//-----------------------------------------------------------------------------
//
// BOOL THUNK_EngTransparentBlt
//
//-----------------------------------------------------------------------------
BOOL THUNK_EngTransparentBlt(IN SURFOBJ *psoDst, IN SURFOBJ *psoSrc, IN CLIPOBJ *pco, IN XLATEOBJ *pxlo, IN RECTL *prclDst, IN RECTL *prclSrc, IN ULONG iTransparentColor, IN ULONG ulReserved) { ASSERTDD(g_bOnNT40 == FALSE, "EngTransparentBlt called on NT4.0");
return (*pfnEngTransparentBlt)(psoDst, psoSrc, pco, pxlo, prclDst, prclSrc, iTransparentColor, ulReserved); }
//-----------------------------------------------------------------------------
//
// PVOID THUNK_EngMapFile
//
//-----------------------------------------------------------------------------
PVOID THUNK_EngMapFile(IN LPWSTR pwsz, IN ULONG cjSize, IN ULONG_PTR *piFile) { ASSERTDD(g_bOnNT40 == FALSE, "EngMapFile called on NT4.0"); return (*pfnEngMapFile)(pwsz,cjSize,piFile); }
//-----------------------------------------------------------------------------
//
// BOOL THUNK_EngUnmapFile
//
//-----------------------------------------------------------------------------
BOOL THUNK_EngUnmapFile(IN ULONG_PTR iFile) { ASSERTDD(g_bOnNT40 == FALSE, "EngUnmapFile called on NT4.0"); return (*pfnEngUnmapFile)(iFile); }
//-----------------------------------------------------------------------------
//
// BOOL THUNK_EngQuerySystemAttribute
//
//-----------------------------------------------------------------------------
BOOL THUNK_EngQuerySystemAttribute(ENG_SYSTEM_ATTRIBUTE CapNum, PDWORD pCapability) { ASSERTDD(g_bOnNT40 == 0, "EngQuerySystemAttribute called on NT4.0"); return (*pfnEngQuerySystemAttribute)(CapNum,pCapability); }
//-----------------------------------------------------------------------------
//
// ULONG THUNK_EngDitherColor
//
//-----------------------------------------------------------------------------
ULONG THUNK_EngDitherColor(HDEV hDev, ULONG iMode, ULONG rgb, ULONG *pul) { ASSERTDD(g_bOnNT40 == FALSE, "EngDitherColor called on NT4.0"); return (*pfnEngDitherColor)(hDev, iMode, rgb, pul); }
//-----------------------------------------------------------------------------
//
// BOOL THUNK_EngModifySurface
//
//-----------------------------------------------------------------------------
BOOL THUNK_EngModifySurface(HSURF hsurf, HDEV hdev, FLONG flHooks, FLONG flSurface, DHSURF dhSurf, VOID* pvScan0, LONG lDelta, VOID* pvReserved) { ASSERTDD(g_bOnNT40 == FALSE, "EngModifySurface called on NT4.0"); return (*pfnEngModifySurface)(hsurf, hdev, flHooks, flSurface, dhSurf, pvScan0, lDelta, pvReserved); }
//-----------------------------------------------------------------------------
//
// BOOL THUNK_EngQueryDeviceAttribute
//
//-----------------------------------------------------------------------------
BOOL THUNK_EngQueryDeviceAttribute(HDEV hdev, ENG_DEVICE_ATTRIBUTE devAttr, VOID *pvIn, ULONG ulInSize, VOID *pvOut, ULONG ulOutSize) { ASSERTDD(g_bOnNT40 == FALSE, "EngQueryDeviceAttribute called on NT4.0"); return (*pfnEngQueryDeviceAttribute)(hdev, devAttr, pvIn, ulInSize, pvOut, ulOutSize); }
//-----------------------------------------------------------------------------
//
// FLATPTR THUNK_HeapVidMemAllocAligned
//
//-----------------------------------------------------------------------------
FLATPTR THUNK_HeapVidMemAllocAligned(LPVIDMEM lpVidMem, DWORD dwWidth, DWORD dwHeight, LPSURFACEALIGNMENT lpAlignment, LPLONG lpNewPitch) { ASSERTDD(g_bOnNT40 == FALSE, "HeapVidMemAllocAligned called on NT4.0"); return (*pfnHeapVidMemAllocAligned)(lpVidMem, dwWidth, dwHeight, lpAlignment, lpNewPitch); }
//-----------------------------------------------------------------------------
//
// void THUNK_VidMemFree
//
//-----------------------------------------------------------------------------
void THUNK_VidMemFree(LPVMEMHEAP pvmh, FLATPTR ptr) { ASSERTDD(g_bOnNT40 == FALSE, "VidMemFree called on NT4.0"); (*pfnVidMemFree)(pvmh,ptr); }
//-----------------------------------------------------------------------------
//
// ULONG THUNK_EngHangNotifiation
//
//-----------------------------------------------------------------------------
ULONG THUNK_EngHangNotification(HDEV hdev, PVOID Reserved) { return (pfnEngHangNotification != NULL) ? (*pfnEngHangNotification)(hdev, Reserved) : EHN_ERROR; }
|