CreateHook chPresent;
typedef HRESULT(WINAPI*D3D9CREATEEXPROC)(UINT, IDirect3D9Ex**);
HRESULT WINAPI SMPresent(LPDIRECT3DDEVICE9 SMGamepDevice, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion)
{
chPresent.Unhook();
if (!Create)
{
D3DXCreateLine(SMGamepDevice, &pLine);
D3DXCreateFontW(SMGamepDevice, 13, 0, FW_BOLD, 1, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_MODERN, L"Tahoma", &pFont);
Create = true;
}
if (!pFont || !pLine)
{
pLine->OnLostDevice();
pFont->OnLostDevice();
}
else
{
pLine->OnLostDevice();
pLine->OnResetDevice();
pFont->OnLostDevice();
pFont->OnLostDevice();
}
HRESULT r_Present = SMGamepDevice->Present(pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
chPresent.Rehook();
return r_Present;
}
bool Interace()
{
HMODULE hD3D9 = NULL;
bool bResult = false;
char szPath[256];
SHGetFolderPathA(NULL, CSIDL_SYSTEM, NULL, SHGFP_TYPE_CURRENT, szPath);
strcat_s(szPath, "\\d3d9.dll");
if (hD3D9 = GetModuleHandleA(szPath))
{
D3D9CREATEEXPROC CreateEx = (D3D9CREATEEXPROC)GetProcAddress(hD3D9, "Direct3DCreate9Ex");
if (CreateEx)
{
HRESULT hr = D3D_OK;
LPDIRECT3D9EX d3d9ex = nullptr;
if (SUCCEEDED(hr = CreateEx(D3D_SDK_VERSION, &d3d9ex)))
{
D3DPRESENT_PARAMETERS dp;
ZeroMemory(&dp, sizeof(dp));
dp.Windowed = 1;
dp.SwapEffect = D3DSWAPEFFECT_FLIP;
dp.BackBufferFormat = D3DFMT_A8R8G8B8;
dp.BackBufferCount = 1;
dp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
IDirect3DDevice9Ex *mDevice = nullptr;
if (SUCCEEDED(hr = d3d9ex->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_NULLREF, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING, &dp, NULL, &mDevice)))
{
bResult = true;
UPARAM * vtbl = *(UPARAM**)mDevice;
chPresent.Hook((FARPROC)*(vtbl + 17), (FARPROC)SMPresent);
mDevice->Release();
chPresent.Rehook();
}
d3d9ex->Release();
}
}
}
return bResult;
}