GetModuleHandleEx 在 csrsrv.dll 上失败

GetModuleHandleEx fails on csrsrv.dll

本文关键字:失败 dll csrsrv GetModuleHandleEx      更新时间:2023-10-16

在我目前的项目中,我需要一些从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 中失败?

GetModuleHandleEx()

加载 DLL。从链接的参考页面:

检索指定模块的模块

句柄,并递增模块的引用计数,除非指定了GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT。模块必须已由调用进程加载。

进行调用时,csrsrv.dll不得在内存中,并且ntdll.dll将位于内存中,并且调用成功。

建议在函数外部使用LoadLibrary(),以确保 DLL 在函数调用之后保留在内存中,从而保证 GetFunctionFromDll() 返回的地址仍然有效。