private void unloadSelectedModulesToolStripMenuItem_Click(object sender, EventArgs e)
 {
     foreach (ListViewItem i in lvModules.SelectedItems)
     {
         ModuleListViewItem item    = (ModuleListViewItem)i;
         IntPtr             pHandle = PELoader.OpenProcessHandle(ProcessID);
         DllInjector.UnloadDll(pHandle, item.ModuleInfomation.ModuleBaseAddress);
         PELoader.CloseProcessHandle(pHandle);
         PopulateList();
     }
 }
        private void findUnlistedImageSectorsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MEMORY_BASIC_INFORMATION memInfo = new MEMORY_BASIC_INFORMATION();
            int  mem_size       = Marshal.SizeOf(memInfo);
            uint currentAddress = 0;

            IntPtr hProc = PELoader.OpenProcessHandle(ProcessID);

            while (NativeMethods.VirtualQueryEx(hProc, currentAddress, out memInfo, mem_size) != 0)
            {
                if (FoundModules.Contains(memInfo.AllocationBase))
                {
                    currentAddress += memInfo.RegionSize;
                    continue;
                }

                if (memInfo.Protect == 0x1)//memInfo.Type != 0x1000000
                {
                    currentAddress += memInfo.RegionSize;
                    continue;
                }

                IMAGE_DOS_HEADER header = PELoader.StructFromMemory <IMAGE_DOS_HEADER>(hProc, memInfo.AllocationBase);

                if (!FoundModules.Contains(memInfo.BaseAddress))
                {
                    byte[] buffer = new byte[memInfo.RegionSize];
                    NativeMethods.ReadProcessMemory(hProc, memInfo.BaseAddress, buffer, buffer.Length, 0);
                    for (int i = 0; i < buffer.Length - 1; i++)
                    {
                        if (buffer[i] == 'M' && buffer[i + 1] == 'Z')
                        {
                            lvModules.Items.Add(new ModuleListViewItem(ProcessID, memInfo.BaseAddress + i));
                        }
                    }
                    FoundModules.Add(memInfo.BaseAddress);
                }

                /*
                 * if(header.e_magic[0] == 'M' && header.e_magic[1] == 'Z')
                 *  lvModules.Items.Add(new ModuleListViewItem(ProcessID, memInfo.AllocationBase));
                 * FoundModules.Add(memInfo.AllocationBase);
                 */
                currentAddress += memInfo.RegionSize;//0x1000000
            }

            PELoader.CloseProcessHandle(hProc);
        }
        void PopulateList()
        {
            IntPtr pHandle = PELoader.OpenProcessHandle(ProcessID);

            if (pHandle == IntPtr.Zero)
            {
                MessageBox.Show("Failed to load process");
                this.DialogResult = DialogResult.OK;
                return;
            }

            int size = 0;

            if (!NativeMethods.EnumProcessModulesEx(pHandle, null, 0, out size, 0x01))
            {
                MessageBox.Show("Failed to get module count");
                this.DialogResult = DialogResult.OK;
                return;
            }

            lvModules.Items.Clear();
            FoundModules.Clear();

            int ModuleCount = size / Marshal.SizeOf(typeof(IntPtr));

            IntPtr[] modules = new IntPtr[ModuleCount];

            if (!NativeMethods.EnumProcessModulesEx(pHandle, modules, size, out size, 0x01))
            {
                MessageBox.Show("Failed to get modules");
                this.DialogResult = DialogResult.OK;
                return;
            }

            FoundModules.AddRange(modules);

            foreach (IntPtr m in modules)
            {
                lvModules.Items.Add(new ModuleListViewItem(ProcessID, m));
            }

            PELoader.CloseProcessHandle(pHandle);
        }