c - 如何从 Win32 中的 func ptr 获取模块句柄?

标签 c winapi

我正在研究虚拟机的 native 调用绑定(bind),其中一项功能是能够在运行时按名称查找标准 libc 函数。在 Windows 上,这变得有点麻烦,因为我需要获取进程中当前加载的 msvcrt 模块的句柄。通常这是 msvcrt.dll,但也可能是其他变体(msvcr100.dll 等),如果使用具有不同名称的变体,则对 GetModuleHandle("msvcrt") 的调用可能会失败。

我希望能够做的是反向查找,从 libc(我有很多)中获取一个函数指针,并获得提供它的模块的句柄。基本上是这样的:

HANDLE hlibc = ReverseGetModuleHandle(fprintf); // Any func from libc should do the trick
void *vfunc = GetProcAddress(hlibc);

在 win32 API 中是否有这样的东西,而无需手动遍历进程句柄和符号表?相反,如果我过度思考这个问题,是否有更简单的方法在 win32 上按名称查找 libc 函数?

最佳答案

获取模块句柄的记录方法是使用 GetModuleHandleEx .

HMODULE hModule = NULL;

if(GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
       GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, // behave like GetModuleHandle
       (LPCTSTR)address, &hModule))
{
    // hModule should now refer to the module containing the target address.
}

关于c - 如何从 Win32 中的 func ptr 获取模块句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6734095/

相关文章:

c - 使用 fread 将数据存储到 char 缓冲区中

c - 这个 C 库函数的用法有什么问题?

c - 防止线程特定数据被覆盖 C

winapi - 如何使用 sendmessage 发送 win32 中具有计时器过程的 wm_timer

winapi - 如何在 Windows 7 上以编程方式自定义文件夹

c - 用复杂的构建过程夹板整个程序

html - 如何在 C 中解码 HTML 实体?

linux - 有没有人能够创建 PE COFF 和 ELF 的混合体?

delphi - 什么解释了这种奇怪的 PeekMessage 行为(尝试处理完整的消​​息队列,过滤特定消息)?

delphi - 在 Delphi/Win32 中将图像放入组合框(右侧边缘)内