/*++ Copyright (c) 2001-2002 Microsoft Corporation Module Name: BaseBall2000.cpp Abstract: If you use a video card that supports more than 10 texture formats the app will AV writing passed the end of their SURFACEDESC array. History: 01/04/2001 maonis Created 03/07/2002 robkenny Security changes --*/ #include "precomp.h" #include "d3d.h" IMPLEMENT_SHIM_BEGIN(BaseBall2000) #include "ShimHookMacro.h" APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY_DIRECTX_COMSERVER() APIHOOK_ENUM_END IMPLEMENT_DIRECTX_COMSERVER_HOOKS() typedef HRESULT (*_pfn_IDirect3D3_CreateDevice)(PVOID pThis, REFCLSID rclsid, LPDIRECTDRAWSURFACE4, LPDIRECT3DDEVICE3*, LPUNKNOWN); typedef HRESULT (*_pfn_IDirect3DDevice3_EnumTextureFormats)(PVOID pThis, LPD3DENUMPIXELFORMATSCALLBACK, LPVOID); typedef HRESULT (*_pfn_EnumPixelFormatsCallback)(LPDDPIXELFORMAT lpDDPixFmt, LPVOID lpContext); _pfn_EnumPixelFormatsCallback g_pfnEnumPixelFormatsCallback = NULL; int g_cD3DEnumPixelFormatsCallbacks = 0; /*++ Hook this call so we can make sure that calling methods on the IDirect3DDevice3 interface is hooked. --*/ HRESULT COMHOOK(IDirect3D3, CreateDevice)( PVOID pThis, REFCLSID rclsid, LPDIRECTDRAWSURFACE4 lpDDS, LPDIRECT3DDEVICE3* lplpD3DDevice, LPUNKNOWN /*lpUnkOuter*/ ) { HRESULT hReturn; _pfn_IDirect3D3_CreateDevice pfnOld = ORIGINAL_COM(IDirect3D3, CreateDevice, pThis); if (SUCCEEDED(hReturn = (*pfnOld)( pThis, rclsid, lpDDS, lplpD3DDevice, NULL))) { HookObject( NULL, IID_IDirect3DDevice3, (PVOID*)lplpD3DDevice, NULL, FALSE); } return hReturn; } /*++ Restrict to returning at most 10 texture formats. --*/ HRESULT CALLBACK EnumPixelFormatsCallback( LPDDPIXELFORMAT lpDDPixFmt, LPVOID lpContext ) { // The app only supports up to 10 texture formats. if (++g_cD3DEnumPixelFormatsCallbacks >= 11) { return D3DENUMRET_CANCEL; } else { return g_pfnEnumPixelFormatsCallback(lpDDPixFmt, lpContext); } } /*++ Call our private callback instead. --*/ HRESULT COMHOOK(IDirect3DDevice3, EnumTextureFormats)( PVOID pThis, LPD3DENUMPIXELFORMATSCALLBACK lpd3dEnumPixelProc, LPVOID lpArg ) { DPFN( eDbgLevelError, "it IS getting called"); g_pfnEnumPixelFormatsCallback = lpd3dEnumPixelProc; _pfn_IDirect3DDevice3_EnumTextureFormats EnumTextureFormats = ORIGINAL_COM(IDirect3DDevice3, EnumTextureFormats, pThis); return EnumTextureFormats(pThis, EnumPixelFormatsCallback, lpArg); } /*++ Register hooked functions --*/ HOOK_BEGIN APIHOOK_ENTRY_DIRECTX_COMSERVER() COMHOOK_ENTRY(DirectDraw, IDirect3D3, CreateDevice, 8) COMHOOK_ENTRY(DirectDraw, IDirect3DDevice3, EnumTextureFormats, 8) HOOK_END IMPLEMENT_SHIM_END