gpt4 book ai didi

c++ - IDirect3DDevice9::EndScene Hook 有时会在参数 IDirect3DDevice9 中得到 NULL

转载 作者:行者123 更新时间:2023-11-28 06:46:02 24 4
gpt4 key购买 nike

我为函数 IDirect3DDevice9::EndScene 制作了一个蹦床钩子(Hook)。如果要跳转到的 EndScene 函数,我修改了 start 的代码是这样的:

__declspec(naked) HRESULT EndScene_Hook(IDirect3DDevice9* device)
{
ScreenCapture::Capture(device);

__asm
{
PUSH 0x14
MOV EAX, 0x718E6478
JMP address
}
}

问题是有时 device 为 NULL,这是为什么呢?如果我添加一个像这样的小条件:

if(device != NULL)
ScreenCapture::Capture(device);

一切正常,没有错误。

此函数接收 device 为 NULL 的原因可能是什么?这是对象 IDirect3DDevice9 的成员函数,不应该像这样调用它 EndScene(NULL) 因为它总是从它的对象调用(例如 pDevice->EndScene()).

最佳答案

使用 __declspec(naked) 告诉编译器不要为该函数发出序言或尾声。在序言中,编译器通常会发出必要的指令,以便稍后能够访问在堆栈上传递的函数的参数。由于您的代码引用了参数 device ,因此编译器发出的用于访问此参数的代码不起作用,并最终访问了内存中不可预测的值。一种更可能的可能性是最终访问调用它的函数的第一个参数,这就是为什么它有时看起来可以工作的原因。但是,您不能依赖于此。

你真的应该完全用汇编写一个像这样的函数。如果您想要 Hook 64 位代码,您将需要这样做。

关于c++ - IDirect3DDevice9::EndScene Hook 有时会在参数 IDirect3DDevice9 中得到 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24969485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com