首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VMT CreateDevice()在用于DirectX9挂钩的注入DLL中返回D3DERR_INVALIDCALL

VMT CreateDevice()在用于DirectX9挂钩的注入DLL中返回D3DERR_INVALIDCALL
EN

Stack Overflow用户
提问于 2019-03-17 04:42:50
回答 1查看 488关注 0票数 0

我想要修改一个DirectX应用程序的行为(即我想实现一个类似于OrfeasZ [https://github.com/OrfeasZ/Statman/releases]的Statman应用程序的程序,作为Hitman 2的屏幕信息),方法是将代码(作为DLL)注入到其中并挂钩DirectX DeviceInterface VMT。

由于关于如何为DirectX11应用程序做这件事的资源非常有限,我首先想通过创建一个获取任何DirectX9应用程序的DeviceInterface指针的程序来学习如何在DX9中做到这一点。我在DLL的DllMain()函数中编写了这段代码(这几乎是这个线程Hooking DirectX EndScene from an injected DLL的第三个答案的1:1复制/粘贴):

代码语言:javascript
复制
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);

当我将动态链接库注入到一个DirectX9应用程序中(我已经在“文明V”和“全面战争:幕府2”中尝试过了),它会打开一个窗口,所以它实际上能够从游戏中的d3d9.dll中获取Direct3DCreate9函数,但pD3D->CreateDevice()总是返回`D3DERR_INVALIDCALL。我真的不知道这是什么原因,特别是这个程序的其余部分运行得无懈可击。有没有人知道遗漏了/错了什么?

EN

回答 1

Stack Overflow用户

发布于 2019-03-18 16:21:50

D3DERR_INVALIDCALL

方法调用无效。例如,一个方法的参数可能不是有效的指针。

根据错误信息,此问题可能是由IDirect3D9::CreateDevice方法的无效参数导致的。你需要初始化指针:

代码语言:javascript
复制
   IDirect3DDevice9 *pReturnedDeviceInterface = NULL;

还要检查hWnd是否是有效的窗口句柄和d3ddm.Format等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55201315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档