Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 定义C宏并将内存地址设置为用C和C+编写的结构成员+;_C++_C_Visual Studio_Dll_Dll Injection - Fatal编程技术网

C++ 定义C宏并将内存地址设置为用C和C+编写的结构成员+;

C++ 定义C宏并将内存地址设置为用C和C+编写的结构成员+;,c++,c,visual-studio,dll,dll-injection,C++,C,Visual Studio,Dll,Dll Injection,我在下面这个宏中的hook\u t->addr地址有问题: 宏: #define HOOK1(library, funcname, hkaddr ) {L###library, #funcname, (void *)&hkaddr, \ &New_##funcname, (void **) &Old_##funcname} 结构:(含11个元素) 数据类型: hook_t 钩子的数组

我在下面这个宏中的hook\u t->addr地址有问题:

宏:

#define HOOK1(library, funcname, hkaddr ) {L###library, #funcname, (void *)&hkaddr, \
                                           &New_##funcname, (void **) &Old_##funcname}
结构:(含11个元素)

数据类型:

hook_t
钩子的数组:

static hook_t g_hooks[] = {

    HOOK1( 0, Present, VTable[ PR ] )

};
现在,我在另外两个功能中创建了一个pD3D设备,并将Present的地址加载到VTable[PR]位置。VTable[PR]位置对当前文件具有全局作用域。使用:(静态DWORD VTable[4]={0};)

当我使用printf()时,我可以得到VTable[PR]的地址6D93A064

现在VTable[PR]处于全球范围内

因此,当我在g_hooks[]数组中调用HOOK1(0,Present,VTable[PR])时。它在VTable[PR]中应该有6D93A064

因此,当它点击宏时:

#define HOOK1(library, funcname, hkaddr ) {L###library, #funcname, (void *)&hkaddr, \
                                           &New_##funcname, (void **) &Old_##funcname}
hkaddr应为6D93A064,应加载到结构位置addr:

typedef struct _hook_t {
    const wchar_t *library;
    const char *funcname;
    void *addr;
因为我使用的数组是hook\t类型

但是当我进入printf()时,钩子->地址。。。它是13D21814

它应该是6D93A064

为什么是错误的地址13D21814???我不明白。我已经在键盘上敲了6个小时的脑袋,试图用VisualStudio和ollydbg解决这个问题

我不明白

有人能帮我解决这个问题吗


谢谢。

VTable[PR]包含指向当前()函数的指针,在您正在使用的宏中:

(void *)&hkaddr
您正在尝试钩住指针的地址,而您应该钩住它所指向的地址


本质上,您是在挂接
&VTable[PR]
而不是
VTable[PR]
,只需删除运算符的“&”地址即可

。您应该将其归结为一个简短、完整、可编译的示例来说明问题。从您在“我创建了一个pD3D设备…”中的描述开始,我对您的代码真正在做什么感到非常困惑。例如,我不知道这意味着什么:“现在VTable[PR]在这个点上是全局的。”PR是一个枚举,它是零,
hook\u t->addr=&VTable[PR]
,对吗?是的,它应该是这样的,但是hook\u t->addr总是有错误的地址。VTable[PR]始终具有正确的地址。我不明白。这就像宏和全局变量不接受VTable[PR]中的我的地址一样
(void *)&hkaddr