定义 C 宏并将内存地址设置为用 C 和 C++ 编写的结构成员
Posted
技术标签:
【中文标题】定义 C 宏并将内存地址设置为用 C 和 C++ 编写的结构成员【英文标题】:Defining a C macro and setting a memory address into structure member written in c and c++ 【发布时间】:2014-02-28 21:14:37 【问题描述】:我在下面这个宏中的 hook_t->addr 的地址有问题:
宏:
#define HOOK1(library, funcname, hkaddr ) L###library, #funcname, (void *)&hkaddr, \
&New_##funcname, (void **) &Old_##funcname
结构:(11个元素)
typedef struct _hook_t
const wchar_t *library;
const char *funcname;
// instead of a library/funcname combination, an address can be given
// as well (this address has more priority than library/funcname)
void *addr;
// pointer to the new function
void *new_func;
// "function" which jumps over the trampoline and executes the original
// function call
void **old_func;
// allow hook recursion on this hook?
// (see comments @ hook_create_pre_trampoline)
int allow_hook_recursion;
// this hook has been performed
int is_hooked;
unsigned char tramp[128];
unsigned char pre_tramp[150];
unsigned char store_exc[128];
unsigned char hook_data[32];
hook_t;
数据类型:
hook_t
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() 时,hook_t->addr (address)... 它的 13D21814。
应该是 6D93A064。
为什么是错误的地址 13D21814 ???我不明白。我已经在键盘上敲了大约 6 个小时,试图用 Visual Studio 和 ollydbg 解决这个问题。
我不明白。
有人可以帮我解决这个问题吗?
谢谢。
【问题讨论】:
您应该将其归结为一个简短、完整、可编译的示例来显示问题。从您在“我创建一个 pD3D 设备......”的描述开始,我对您的代码真正在做什么感到非常迷茫。例如,我不知道这是什么意思:“此时 VTable[ PR ] 在全局中。” PR 是一个为零的枚举 那么,hook_t->addr = &VTable[PR]
,对吧?
是的,它应该是这样的,但是 hook_t->addr 总是有错误的地址。 VTable[ PR ] 总是有正确的地址。我不明白。
它就像宏和全局变量不接受我来自 VTable[ PR ] 的地址
【参考方案1】:
VTable[ PR ] 包含一个指向 Present() 函数的指针,在你正在使用的宏中:
(void *)&hkaddr
你试图钩住指针的地址,而你应该钩住它指向的地址。
本质上你是在挂钩&VTable[PR]
而不是VTable[PR]
,只需删除运算符的“&”地址
【讨论】:
以上是关于定义 C 宏并将内存地址设置为用 C 和 C++ 编写的结构成员的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用 C++/CLI (.NET Winforms/WPF) 为用本机 C 和 C++ 编写的应用程序提供 GUI