1

私は調べていて_vsnprintf、ntdll.dll と msvcrt.dll で利用できることを知りました。

と を使用GetModuleHandleGetProcAddressて にアクセスできます_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;
}

_vsnprintf一般的な呼び出しについて、Windows がntdll.dll と msvcrt.dll のどちらを使用しているかを確認するにはどうすればよいですか?

4

2 に答える 2

2

dumpbin /imports教えてくれます。また、便利なdependsユーティリティ.

于 2015-01-05T06:57:25.393 に答える
1

実用的に行うには、2 つの主要なオプション オプションがあります。

  1. 静的インポートの場合は、IAT を調べて、インポート元のモジュールを調べることができます。
  2. 動的に実行している場合 (つまり、 を使用している場合GetProcAddress)、 と を使用VirtualQueryGetModuleFileNameて、モジュールの元を見つけることができます。GetModuleBaseNameモジュール名を調べるためのものもあります。
  3. HMODULE上記の例で成功した場合は、使用済みを追跡しGetProcAddressてください。
于 2015-01-05T07:04:02.807 に答える