首页 > 解决方案 > 如何将 uintptr_t 值设置为非 uintptr_t 函数的地址?

问题描述

void __fastcall func1(void*  ptr, int edxReg) 
{
    int a = 5;
}

我想获取这个函数的地址并将其设置为一个uintptr_t变量:

std::uintptr_t addr = &func1;

但是,我不能这样做,因为它不能从 转换void(__fastcall)(void* , int)uintptr_t.

我尝试使用 C++ 样式转换,但没有运气,它只是给了我一个随机值。

我能做些什么呢?命名的函数func1必须保持原样,它必须是一个void __fastcall有2个参数的,所以不能改变。

标签: c++casting

解决方案


C++ 风格的演员在这里是合适的,特别是reinterpret_cast

使用 reinterpret_cast 只能完成以下转换,除非此类转换会抛弃常量或易变性。
...

  1. 指针可以转换为任何大到足以容纳其类型的所有值的整数类型(例如到 std::uintptr_t)

  2. 任何整数或枚举类型的值都可以转换为指针类型。转换为足够大小的整数并返回相同指针类型的指针保证具有其原始值,否则无法安全地取消引用生成的指针(不能保证相反方向的往返转换;相同的指针可能有多个整数表示)空指针常量 NULL 或整数零不保证产生目标类型的空指针值;为此应使用 static_cast 或隐式转换。

...

因此,例如:

void __fastcall func1(void* ptr, int edxReg) 
{
    int a = 5;
}

std::uintptr_t addr = reinterpret_cast<std::uintptr_t>(&func1);

然后在需要时,您可以将uintptr_tback 转换为适当签名的函数指针,以便调用所指向的函数,例如:

typedef void __fastcall (*funcType)(void*, int);
// or: using funcType = void __fastcall (*)(void*, int);

funcType func = reinterpret_cast<funcType>(addr);
func(somePtr, someEdxRegVal);

推荐阅读