C++ 如何确定函数调用使用的是哪个Windows DLL?

C++ 如何确定函数调用使用的是哪个Windows DLL?,c++,windows,dll,msvcrt,ntdll,C++,Windows,Dll,Msvcrt,Ntdll,我一直在研究\u vsnprintf,了解到它在ntdll.dll和msvcrt.dll中可用 我可以使用GetModuleHandle和GetProcAddress访问\u vsnprintf,例如: static int(__cdecl *p__vsnprintf)(char *str, size_t count, const char *format, va_list valist); static void init(const char *dll) { HMODULE hmo

我一直在研究
\u vsnprintf
,了解到它在ntdll.dll和msvcrt.dll中可用

我可以使用
GetModuleHandle
GetProcAddress
访问
\u vsnprintf
,例如:

static int(__cdecl *p__vsnprintf)(char *str, size_t count, const char *format, va_list valist);

static void init(const char *dll)
{
    HMODULE hmod = GetModuleHandleA(dll);
    if (hmod)
    {
        printf("*** Testing %s ***\n", dll);

        p__vsnprintf = (void *)GetProcAddress(hmod, "_vsnprintf");
        if (p__vsnprintf) test__vsnprintf();
        else printf("_vsnprintf not found in %s.\n", dll);
    }
    else printf("*** Unable to load %s ***\n", dll);

    printf("\n");
}

int main(void)
{
    init("ntdll.dll"); /* ntdll _vsnprintf */
    init("msvcrt.dll"); /* msvcrt _vsnprintf */

    printf("*** Testing normal function call ***\n");
    test_vsnprintf(); /* _vsnprintf in ??? */

    return 0;
}

对于泛型调用,我如何判断Windows是否正在使用ntdll.dll或msvcrt.dll中的
\u vsnprintf

dumpbin/imports
将告诉您。此外,方便。

要实用,您有两个主要选项:

  • 如果是静态导入,您可以对IAT进行探测并检查其导入的模块
  • 如果您是动态执行的(即:使用
    GetProcAddress
    ),则可以使用和从中查找模块。还有一个用于查找模块名称的方法
  • 在上面的示例中,当您成功地获得了
    GetProcAddress
    时,只需跟踪所使用的
    HMODULE

  • 感谢您指出
    dumpbin
    程序。输出显示仅从msvcrt.dll调用
    \u vsnprintf
    。我必须在VS2010中使用它。VS2013是否提供此功能?如果您的意思是VS2013是否提供
    dumpbin
    ,答案是肯定的
    dumpbin
    只是一个调用
    link/dump
    的小包装程序。谢谢您的回答。我将查看您列出的WinAPI函数。关于第3点,这是对我使用的代码示例的建议吗?我不知道你跟踪
    HMODULE
    @HughMcMaster是什么意思:是的,这是对示例代码的一个建议。基本上,您还有一个附加的全局变量和函数指针,它保存用于(成功)获取函数指针的模块的模块名或句柄。