2015-01-05 2 views
1

Я искал _vsnprintf и узнал, что он доступен в файлах ntdll.dll и msvcrt.dll.Как определить, какая DLL Windows используется для вызова функции?

я могу использовать 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?

ответ

2

dumpbin /imports скажет вам. Кроме того, удобно depends utility.

+0

Спасибо, что указали программу 'dumpbin'. Вывод показал, что '_vsnprintf' вызывается только из msvcrt.dll. Мне пришлось использовать его с VS2010. Доступно ли это с VS2013? –

+0

Если вы имеете в виду 'dumpbin', доступный с VS2013, то да. 'dumpbin' - это просто небольшая программа-оболочка, которая вызывает' link/dump'. –

1

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

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

Спасибо за ваш ответ. Я проверю перечисленные функции WinAPI. С точкой 3 это предложение для примера кода, который я использовал? Я не уверен, что вы имеете в виду, отслеживая «HMODULE». –

+0

@HughMcMaster: Да, это было предложение для примера кода. В основном у вас есть дополнительная глобальная переменная вместе с указателем функции, который содержит либо имя модуля, либо дескриптор модуля, используемого (успешно), для получения указателя функции. – Necrolis