传递uint8_t*作为原始函数指针的参数



我有一个问题,我想传递一个uint8_t[]数组作为参数函数指针定义为' typedef void (dangerousC)(void);另外,我正在使用Windows API头文件。

假设变量raw是由GetProcAddress()返回的函数指针。还假设编译器不知道foo()的参数。

下面是完整的代码:

#include <iostream>
#include <Windows.h>
typedef void (*dangerousC)(char*);
void foo(int a) {
std::cout << a << std::endl;
}
int main() {
auto raw = (FARPROC) foo;
auto* b = new uint8_t[4];
b[0] = 74;
b[1] = 35;
b[2] = 0;
b[3] = 0;
std::cout << *(int*)b << std::endl;
auto func = (dangerousC)raw;
func(reinterpret_cast<char *>(*b));
delete[] b;
}

当我调用带有参数reinterpret_cast<char *>(*b)的函数指针时,我只得到一个字符,这在对指针解引用时是合理的。

但我也尝试了一个指针,它不打印我想要的结果,即9034。

我怎么能使函数打印9034和完全解释字节数组为32位整型?

foo()期望一个int,但是你传递给它的是一个char*。因此,您需要传入一个char*,其是您想要的整数,而不是指向整数的实际指针。

#include <iostream>
#include <Windows.h>
typedef void (*dangerousC)(char*);
void foo(int a) {
std::cout << a << std::endl;
}
int main() {
auto raw = (FARPROC) foo;
uint8_t b[4];
b[0] = 74;
b[1] = 35;
b[2] = 0;
b[3] = 0;
int32_t i = *reinterpret_cast<int32_t*>(b);
std::cout << i << std::endl;
auto func = reinterpret_cast<dangerousC>(raw);
func(reinterpret_cast<char*>(i));
}

在线演示

通常是这样做的,正如我从你的评论中正确理解的那样,你处理字节流

int n;
std::memcpy(&n, b, sizeof(n));
func(b);

相关内容

  • 没有找到相关文章

最新更新