windows 将uint8_t* 作为参数传递给原始函数指针

nvbavucw  于 2023-04-13  发布在  Windows
关注(0)|答案(2)|浏览(223)

我有一个问题,我想把一个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位int?

7uhlpewt

7uhlpewt1#

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

#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));
}

Online Demo

vzgqcmou

vzgqcmou2#

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

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

相关问题