You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
4.1 KiB
206 lines
4.1 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Ultima9.cpp
|
|
|
|
Abstract:
|
|
|
|
Clean up bad ddraw CreateSurface caps.
|
|
|
|
Notes:
|
|
|
|
This is an app specific shim.
|
|
|
|
History:
|
|
|
|
03/04/2000 linstev Created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
IMPLEMENT_SHIM_BEGIN(Ultima9)
|
|
#include "ShimHookMacro.h"
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_ENTRY_DIRECTX_COMSERVER()
|
|
APIHOOK_ENUM_END
|
|
|
|
IMPLEMENT_DIRECTX_COMSERVER_HOOKS()
|
|
|
|
VOID FixCaps(LPDDSURFACEDESC lpDDSurfaceDesc)
|
|
{
|
|
if (lpDDSurfaceDesc->dwFlags & DDSD_CAPS)
|
|
{
|
|
if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_COMPLEX) &&
|
|
(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_MIPMAP))
|
|
{
|
|
lpDDSurfaceDesc->ddsCaps.dwCaps |= DDSCAPS_TEXTURE;
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID FixCaps2(LPDDSURFACEDESC2 lpDDSurfaceDesc)
|
|
{
|
|
if (lpDDSurfaceDesc->dwFlags & DDSD_CAPS)
|
|
{
|
|
if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_COMPLEX) &&
|
|
(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_MIPMAP))
|
|
{
|
|
lpDDSurfaceDesc->ddsCaps.dwCaps |= DDSCAPS_TEXTURE;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*++
|
|
|
|
Hook create surface and fix parameters
|
|
|
|
--*/
|
|
|
|
HRESULT
|
|
COMHOOK(IDirectDraw, CreateSurface)(
|
|
PVOID pThis,
|
|
LPDDSURFACEDESC lpDDSurfaceDesc,
|
|
LPDIRECTDRAWSURFACE* lplpDDSurface,
|
|
IUnknown* pUnkOuter
|
|
)
|
|
{
|
|
FixCaps(lpDDSurfaceDesc);
|
|
|
|
_pfn_IDirectDraw_CreateSurface pfnOld =
|
|
ORIGINAL_COM(IDirectDraw, CreateSurface, pThis);
|
|
|
|
HRESULT hRet = (*pfnOld)(
|
|
pThis,
|
|
lpDDSurfaceDesc,
|
|
lplpDDSurface,
|
|
pUnkOuter);
|
|
|
|
return hRet;
|
|
}
|
|
|
|
/*++
|
|
|
|
Hook create surface and fix parameters
|
|
|
|
--*/
|
|
|
|
HRESULT
|
|
COMHOOK(IDirectDraw2, CreateSurface)(
|
|
PVOID pThis,
|
|
LPDDSURFACEDESC lpDDSurfaceDesc,
|
|
LPDIRECTDRAWSURFACE* lplpDDSurface,
|
|
IUnknown* pUnkOuter
|
|
)
|
|
{
|
|
FixCaps(lpDDSurfaceDesc);
|
|
|
|
_pfn_IDirectDraw2_CreateSurface pfnOld =
|
|
ORIGINAL_COM(IDirectDraw2, CreateSurface, pThis);
|
|
|
|
HRESULT hRet = (*pfnOld)(
|
|
pThis,
|
|
lpDDSurfaceDesc,
|
|
lplpDDSurface,
|
|
pUnkOuter);
|
|
|
|
return hRet;
|
|
}
|
|
|
|
/*++
|
|
|
|
Hook create surface and fix parameters
|
|
|
|
--*/
|
|
|
|
HRESULT
|
|
COMHOOK(IDirectDraw4, CreateSurface)(
|
|
PVOID pThis,
|
|
LPDDSURFACEDESC2 lpDDSurfaceDesc,
|
|
LPDIRECTDRAWSURFACE* lplpDDSurface,
|
|
IUnknown* pUnkOuter
|
|
)
|
|
{
|
|
FixCaps2(lpDDSurfaceDesc);
|
|
|
|
_pfn_IDirectDraw4_CreateSurface pfnOld =
|
|
ORIGINAL_COM(IDirectDraw4, CreateSurface, pThis);
|
|
|
|
Retry:
|
|
HRESULT hRet = (*pfnOld)(
|
|
pThis,
|
|
lpDDSurfaceDesc,
|
|
lplpDDSurface,
|
|
pUnkOuter);
|
|
|
|
if ((hRet == DDERR_INVALIDCAPS) && (lpDDSurfaceDesc->ddsCaps.dwCaps2))
|
|
{
|
|
lpDDSurfaceDesc->ddsCaps.dwCaps2 = 0;
|
|
lpDDSurfaceDesc->ddsCaps.dwCaps3 = 0;
|
|
lpDDSurfaceDesc->ddsCaps.dwCaps4 = 0;
|
|
goto Retry;
|
|
}
|
|
|
|
return hRet;
|
|
}
|
|
|
|
/*++
|
|
|
|
Hook create surface and fix parameters
|
|
|
|
--*/
|
|
|
|
HRESULT
|
|
COMHOOK(IDirectDraw7, CreateSurface)(
|
|
PVOID pThis,
|
|
LPDDSURFACEDESC2 lpDDSurfaceDesc,
|
|
LPDIRECTDRAWSURFACE* lplpDDSurface,
|
|
IUnknown* pUnkOuter
|
|
)
|
|
{
|
|
FixCaps2(lpDDSurfaceDesc);
|
|
|
|
_pfn_IDirectDraw7_CreateSurface pfnOld =
|
|
ORIGINAL_COM(IDirectDraw7, CreateSurface, pThis);
|
|
|
|
Retry:
|
|
HRESULT hRet = (*pfnOld)(
|
|
pThis,
|
|
lpDDSurfaceDesc,
|
|
lplpDDSurface,
|
|
pUnkOuter);
|
|
|
|
if ((hRet == DDERR_INVALIDCAPS) && (lpDDSurfaceDesc->ddsCaps.dwCaps2))
|
|
{
|
|
lpDDSurfaceDesc->ddsCaps.dwCaps2 = 0;
|
|
lpDDSurfaceDesc->ddsCaps.dwCaps3 = 0;
|
|
lpDDSurfaceDesc->ddsCaps.dwCaps4 = 0;
|
|
goto Retry;
|
|
}
|
|
|
|
return hRet;
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
HOOK_BEGIN
|
|
|
|
APIHOOK_ENTRY_DIRECTX_COMSERVER()
|
|
COMHOOK_ENTRY(DirectDraw, IDirectDraw, CreateSurface, 6)
|
|
COMHOOK_ENTRY(DirectDraw, IDirectDraw2, CreateSurface, 6)
|
|
COMHOOK_ENTRY(DirectDraw, IDirectDraw4, CreateSurface, 6)
|
|
COMHOOK_ENTRY(DirectDraw, IDirectDraw7, CreateSurface, 6)
|
|
|
|
HOOK_END
|
|
|
|
|
|
IMPLEMENT_SHIM_END
|
|
|