定义 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++/C 语言独立内存分配

C++基础---C语言部分4

C++中怎样写宏定义

C++| C++ 入门教程 C++初识

我可以使用 C++/CLI (.NET Winforms/WPF) 为用本机 C 和 C++ 编写的应用程序提供 GUI

一个小项目 --- C++实现内存泄漏检查器