Хукаю функцию CreateDevice. Хочу проинициализировать собейтовский класс proxyIDirect3DDevice9.
Что я делаю не так?
Сама функа myCreateDevice исполняется. Но когда происходит возвращение, краш.
Что я делаю не так?
Код:
unsigned long* pD3DVTable;
pDirect3D9 = orig_Direct3DCreate9( D3D_SDK_VERSION );
pD3DVTable = (unsigned long*)*(unsigned long*)pDirect3D9;
orig_CreateDevice = (Prototype_CreateDevice)DetourFunc((PBYTE)pD3DVTable[16], (PBYTE)myCreateDevice, 5);
Код:
HRESULT __stdcall myCreateDevice ( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow,
DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters,
IDirect3DDevice9 **ppReturnedDeviceInterface )
{
HRESULT hRes = orig_CreateDevice( Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters,
ppReturnedDeviceInterface );
__asm pushad
if ( hRes == D3D_OK )
*ppReturnedDeviceInterface = new proxyIDirect3DDevice9( *ppReturnedDeviceInterface );
__asm popad
return hRes;
}
Код:
void *DetourFunc(BYTE *src, const BYTE *dst, const int len)
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
memcpy(jmp, src, len); jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwback, &dwback);
return (jmp-len);
}
Сама функа myCreateDevice исполняется. Но когда происходит возвращение, краш.