Помогите с хуком.

Статус
В этой теме нельзя размещать новые ответы.

Apolo11

Известный
Автор темы
54
9
Хукаю функцию CreateDevice. Хочу проинициализировать собейтовский класс proxyIDirect3DDevice9.

Что я делаю не так?

Код:
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 исполняется. Но когда происходит возвращение, краш.
 

SR_team

like pancake
BH Team
4,707
6,347
__asm pushad

if ( hRes == D3D_OK )
*ppReturnedDeviceInterface = new proxyIDirect3DDevice9( *ppReturnedDeviceInterface );

__asm popad
вот это мне не нравится, но не факт, что оно не правильное.

В какой момент хукаешь? Надо это сделать до создания девайса, иначе это бесполезная затея
 

deropleat

Известный
105
56
Привет, @Apolo11 !
Заменяй вот этот код:
HRESULT __stdcall myCreateDevice ( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, [и до] return hRes; }

На данный код:
C++:
HRESULT __stdcall proxyIDirect3D9::CreateDevice ( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow,
                                                  DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters,
                                                  IDirect3DDevice9 **ppReturnedDeviceInterface )
{
    HRESULT hRes;

    ulFullScreenRefreshRate = pPresentationParameters->FullScreen_RefreshRateInHz;

    hRes = origIDirect3D9->CreateDevice( Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters,
                                         ppReturnedDeviceInterface );

    if ( hRes == D3D_OK )
        *ppReturnedDeviceInterface = new proxyIDirect3DDevice9( *ppReturnedDeviceInterface );
    return hRes;
}
 
  • Нравится
Реакции: FedericoZ
Статус
В этой теме нельзя размещать новые ответы.