Как определить, какая DLL-библиотека Windows используется для вызова функции?

Я смотрел в _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 _vsnprintf из ntdll.dll или msvcrt.dll?

1

Решение

dumpbin /imports скажу тебе. Кроме того, удобный depends полезность.

2

Другие решения

Чтобы сделать это прагматично, у вас есть два основных варианта:

  1. Если это статический импорт, вы можете записать IAT и проверить модули, из которых он импортирован.
  2. Если вы делаете это динамически (например: GetProcAddress), ты можешь использовать VirtualQuery а также GetModuleFileName чтобы узнать модуль, из которого. Существует также GetModuleBaseName для поиска имени модуля.
  3. Просто следите за HMODULE используется, когда у вас есть успешный GetProcAddress в тебе пример выше.
1

По вопросам рекламы [email protected]