DirectX9 CreateDevice () возвращает D3DERR_INVALIDCALL во внедренной DLL для перехвата VMT - PullRequest
0 голосов
/ 16 марта 2019

Я хочу изменить поведение DirectX-приложения (а именно реализовать программу, аналогичную Statman-Application от OrfeasZ [https://github.com/OrfeasZ/Statman/releases] как Onscreen-Info для Hitman 2), вводя код (как DLL)в него и подключив DirectX DeviceInterface VMT.

Поскольку ресурсов для этого для приложений DirectX11 очень мало, я сначала хотел узнать, как это сделать в DX9, создав программу, которая получает указатель DeviceInterface любого приложения DirectX9.Я написал этот код в функции DllMain() моей DLL (которая представляет собой почти 1: 1 копию / вставку третьего ответа в этой теме Подключение DirectX EndScene из внедренной DLL ):

HMODULE hDLL = GetModuleHandleA("d3d9");
LPDIRECT3D9(__stdcall*pDirect3DCreate9)(UINT) = (LPDIRECT3D9(__stdcall*)(UINT))GetProcAddress(hDLL, "Direct3DCreate9");

LPDIRECT3D9 pD3D = pDirect3DCreate9(D3D_SDK_VERSION);

D3DDISPLAYMODE d3ddm;
HRESULT hRes = pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;

//WNDPROC TempWndProc;
WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC, WndProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,TEXT("1"),NULL };
RegisterClassEx(&wc);
HWND hWnd = CreateWindow(TEXT("1"), NULL, WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, GetDesktopWindow(), NULL, wc.hInstance, NULL);

ShowWindow(hWnd, SW_SHOW);

IDirect3DDevice9 * ppReturnedDeviceInterface;
hRes = pD3D->CreateDevice(
    D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    hWnd,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    &d3dpp, &ppReturnedDeviceInterface);

pD3D->Release();
DestroyWindow(hWnd);

if (pD3D == NULL) {
    //printf ("WARNING: D3D FAILED");
    return false;
}
unsigned long* pInterface = (unsigned long*)*((unsigned long*)ppReturnedDeviceInterface);

Когда я внедряю DLL в DirectX9-приложение (я пробовал это с Civilization V и Total War: Shogun 2), он открывает окно, поэтому он действительно может получить функцию Direct3DCreate9 из d3d9.dll внутри игры, но pD3D->CreateDevice() всегда возвращает `D3DERR_INVALIDCALL.Я действительно не понимаю, что может быть причиной этого, тем более что остальная часть этой программы работает безупречно.Кто-нибудь имеет представление о том, что отсутствует / неправильно?

1 Ответ

0 голосов
/ 18 марта 2019

D3DERR_INVALIDCALL

Недопустимый вызов метода.Например, параметр метода может быть недопустимым указателем.

На основании информации об ошибке эта проблема может быть вызвана неверным параметром метода IDirect3D9 :: CreateDevice.Вам нужно инициализировать указатель:

   IDirect3DDevice9 *pReturnedDeviceInterface = NULL;

Также проверьте, является ли hWnd допустимым дескриптором окна и d3ddm.Format и т. Д.

...