csrsrv.dll上的GetModuleHandleEx失败

时间:2013-09-16 12:13:47

标签: c++ winapi

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

1 个答案:

答案 0 :(得分:1)

GetModuleHandleEx()未加载DLL。从链接的参考页面:

  

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

调用时csrsrv.dll必须不在内存中且ntdll.dll将在内存中,并且调用成功。

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