我一直在研究_vsnprintf
,并了解到它在ntdll.dll和msvcrt.dll中可用。
我可以使用GetModuleHandle
和GetProcAddress
访问_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的_vsnprintf
?
答案 0 :(得分:2)
dumpbin /imports
会告诉你。另外,方便的depends
utility。
答案 1 :(得分:1)
为了实用,你有两个主要选项:
GetProcAddress
),则可以使用VirtualQuery
和GetModuleFileName
查找其来自的模块。查找模块名称还有GetModuleBaseName
。HMODULE
时使用的GetProcAddress
。