.NET 3.x Получить список модулей - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Существует функция:
        public int DllImageAddress(string dllname)
        {
            ProcessModuleCollection modules = this.MyProcess[0].Modules;
 
            foreach (ProcessModule procmodule in modules)
            {
                if (dllname == procmodule.ModuleName)
                {
                    return (int)procmodule.BaseAddress;
                }
            }
            return -1;
        }
Когда программа работает на 32 битной системе, адрес нужного модуля получаю успешно. Если запустить программу на 64 битной системе, функция почему то не видит модулей 32 битных. Как обойти данное ограничение?

Решение задачи: «.NET 3.x Получить список модулей»

textual
Листинг программы
[DllImport("psapi.dll", SetLastError = true)]
public static extern bool EnumProcessModules(IntPtr hProcess,
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U4)] [In][Out] uint[] lphModule, uint cb, [MarshalAs(UnmanagedType.U4)] out uint lpcbNeeded);
 
// и далее в коде:        
        Process[] pc = Process.GetProcessesByName("communicator");
 
        foreach (Process p in pc)
        {
        // Setting up the variable for the second argument for EnumProcessModules
        IntPtr[] hMods = new IntPtr[1024];
 
        GCHandle gch = GCHandle.Alloc(hMods, GCHandleType.Pinned); // Don't forget to free this later
        IntPtr pModules = gch.AddrOfPinnedObject();
 
        // Setting up the rest of the parameters for EnumProcessModules
        uint uiSize = (uint)(Marshal.SizeOf(typeof(IntPtr)) * (hMods.Length));
        uint cbNeeded = 0;
 
        if (EnumProcessModules(p.Handle, pModules, uiSize, out cbNeeded) == 1)
        {
            Int32 uiTotalNumberofModules = (Int32)(cbNeeded / (Marshal.SizeOf(typeof(IntPtr))));
 
            for (int i = 0; i < (int)uiTotalNumberofModules; i++)
            {
            StringBuilder strbld = new StringBuilder(1024);
 
            GetModuleFileNameEx(p.Handle, hMods[i], strbld, (uint)(strbld.Capacity));
            Console.WriteLine("File Path: " + strbld.ToString());
            Console.WriteLine();
            }
            Console.WriteLine("Number of Modules: " + uiTotalNumberofModules);
            Console.WriteLine();
        }
 
        // Must free the GCHandle object
        gch.Free();
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5