如何获取所有dll文件的所有句柄?

时间:2015-03-24 00:37:35

标签: c# dll

我无法获取给定程序的所有列出的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 + " ");

1 个答案:

答案 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