gpt4 book ai didi

C++:获取 native dll依赖项而无需在进程中加载​​它

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:45 24 4
gpt4 key购买 nike

我需要以编程方式获取 DLL 的依赖项列表。以下是我尝试解决此任务的方式:

BSTR GetDllDependencies(const wchar_t* dllPath)
{
std::wstring dependencies;

struct LibDeleter
{
typedef HMODULE pointer;
void operator()(HMODULE hMod) { FreeLibrary(hMod); }
};

auto hModRaw = LoadLibraryExW(dllPath, NULL, DONT_RESOLVE_DLL_REFERENCES); //(*)nullptr nere
auto hMod = std::unique_ptr<HMODULE, LibDeleter>();

auto imageBase = (DWORD_PTR)hMod.get();

auto header = ImageNtHeader(hMod.get());
auto importRVA = header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
auto importTable = (PIMAGE_IMPORT_DESCRIPTOR)(DWORD_PTR)(importRVA + imageBase);

while (importRVA && importTable->OriginalFirstThunk)
{
auto importedModuleName = (char*)(DWORD_PTR)(importTable->Name + imageBase);
dependencies
.append(importedModuleName, importedModuleName + std::strlen(importedModuleName))
.append(L",");

importTable++;
}

auto result = SysAllocString(dependencies.c_str());

return result;
}

它有效。但是,如您所见,它将 DLL 加载到进程中。我在这个地方遇到了一个问题:如果进程已经加载了同名的 DLL,则 LoadLibraryEx 返回 nullptr

nullptr

我不确定是否允许将两个同名(但位置不同)的 DLL 加载到同一个进程中?我相信是的。那为什么LoadLibraryEx返回nullptr呢?是否可以在不加载 DLL 的情况下以某种方式获取 DLL 依赖项?

最佳答案

您会发现 Matt Pietrek 的这篇文章很有趣。特别是,请查看 “PE 文件导入” 段落中的 IMAGE_IMPORT_DESCRIPTOR 数组。

Peering Inside the PE: A Tour of the Win32 Portable Executable File Format

关于C++:获取 native dll依赖项而无需在进程中加载​​它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45420985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com