在我目前的项目中,我需要从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失败了?
答案 0 :(得分:1)
GetModuleHandleEx()
未加载DLL。从链接的参考页面:
检索指定模块的模块句柄,并增加模块的引用计数,除非指定了GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT。 调用过程必须已加载模块。
调用时csrsrv.dll
必须不在内存中且ntdll.dll
将在内存中,并且调用成功。
建议在函数外部使用LoadLibrary()
以确保DLL在函数调用之外保留在内存中,从而保证GetFunctionFromDll()
返回的地址仍然有效。