0

私の現在のプロジェクトでは、ntdll.dll と csrsrv.dll からエクスポートされたいくつかの関数が必要です。

ntdll のハンドルと関数へのポインタを取得することに問題はありません。しかし、csrsrv.dll 関数のハンドルを取得しようとすると、エラー コード「ファイルが見つかりません」で失敗します。ファイルへのフルパスを指定しようとしましたが、何も変わりません。

dll関数からのロード関数のコード:

PVOID GetFunctionFromDll(const std::string& _sModuleName,const std::string& _sFnName)
{
    HMODULE hModule = NULL;
    PVOID ptrFn = NULL;

    if(!GetModuleHandleEx(0,_sModuleName.c_str(),&hModule))
    {
        return 0;
    }

    ptrFn = GetProcAddress(hModule, _sFnName.c_str());

    FreeLibrary(hModule); // preventing handle leakage

    return ptrFn;
}

csrsrv.dll で失敗する理由はありますか?

4

1 に答える 1

1

GetModuleHandleEx()DLL をロードしません。リンクされた参照ページから:

指定されたモジュールのモジュール ハンドルを取得し、GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT が指定されていない限り、モジュールの参照カウントをインクリメントします。モジュールは、呼び出しプロセスによってロードされている必要があります。

呼び出しが行われたときに がメモリ内に存在してはcsrsrv.dllならず、 がメモリ内に存在するため、呼び出しはntdll.dll成功します。

関数の外部で使用しLoadLibrary()て、DLL が関数呼び出しを超えてメモリ内に残るようにすることを提案し、によって返されるアドレスGetFunctionFromDll()が有効なままであることを保証します。

于 2013-09-16T12:18:57.677 に答える