我无法获取给定程序的所有列出的dll文件的句柄。 我想获得列出的dll文件的所有句柄。 最重要的是WebKit.dll,但其句柄为零。
请帮帮我。
这是我的代码:
Process[] process = Process.GetProcessesByName("program");
Process process1 = process[0];
ProcessModuleCollection modules = process1.Modules;
ProcessModule dllBaseAdress = null;
foreach (ProcessModule m in modules)
{
// LIST ALL DLL OF THE PROGRAM PROCESS:
if (m.ModuleName != "WebKit.dll1")
{
dllBaseAdress = m;
string DLL_file_name = m.ModuleName;
IntPtr DLL_file = GetModuleHandle(DLL_file_name);
Console.WriteLine("GetModuleHandle: " + DLL_file.ToInt32() + ", DLL Name: " + m.ModuleName + "\n");
//break;
}
}
IntPtr WebKit_dll = GetModuleHandle("WebKit.dll");
Console.WriteLine("GetModuleHandle: " + WebKit_dll.ToInt32());
IntPtr dllPtr = dllBaseAdress.BaseAddress;
Console.WriteLine("\nDLL BaseAdress.BaseAddress: " + dllPtr + " ");
答案 0 :(得分:0)
这不是一个完整的答案,而是一个起点。如果我有时间,我会在稍后回来添加更多细节。
您希望有一个程序枚举由某个任意第二个进程加载的所有DLL模块。 GetModuleHandle不能用于此目的,因为它只检索当前正在执行的进程的句柄:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms683199%28v=vs.85%29.aspx GetModuleHandle函数 检索指定的模块句柄 模块。该模块必须已由调用进程加载。
为了从C#实现这一点,似乎需要在Win32 API函数NtQuerySystemInformation上进行P / Invoke。
我发现此引用似乎显示了所需的所有相关功能和结构:http://forum.sysinternals.com/topic18892.html