ToInt32+IntPtr = OverflowException - C#

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

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

Здрасте! моя ос Win7 64bit скопипастил код на просторах интернета который демонстрирует работу сканера памяти приведу часть кода
 protected struct MEMORY_BASIC_INFORMATION
        {
            public IntPtr BaseAddress;     // Указатель на базовый адрес региона страниц.
            public IntPtr AllocationBase;  // Указатель на базовый адрес диапазона страниц, выделенных VirtualAlloc функции. Страница, на которую указывает BaseAddress элемента, содержащаяся в данном диапазоне распределения.
            public uint AllocationProtect; // Опция Защита памяти, когда область была первоначально выделено. Этот элемент может быть одним из постоянных защиты памяти или 0, если абонент не имеет доступа.
            public uint RegionSize;        // Размер области, начиная с базового адреса, в которой все страницы имеют идентичные атрибуты, в байтах.
            public uint State;
            public uint Protect;
            public uint Type;
        }
 public void MemInfo(IntPtr pHandle)                                                          // В место того что бы каждый раз читать ReadProcessMemory, создадим свою карту памяти.
                                                                                                     // Свалим все, в одну кучу(MemReg) и будем в нем искать свою сигнатуру 
        {                                                                                            // Функция VirtualQueryEx возвращает информацию о диапазоне страниц, виртуального адресного пространства указанного процесса.
            IntPtr Addy = new IntPtr();                                                              // hProcess: THandle;                      //дескриптор процесса
            while (true)                                                                             // lpAddress: Pointer;                     //адрес начала региона памяти 
            {                                                                                        // var lpBuffer: TMemoryBasicInformation;  //буфер для получения информации
                MEMORY_BASIC_INFORMATION MemInfo = new MEMORY_BASIC_INFORMATION();                   // dwLength: DWORD                         //размер буфера
                int MemDump = VirtualQueryEx(pHandle, Addy, out  MemInfo, Marshal.SizeOf(MemInfo));  // Вызовим VirtualQueryEx, получим базовый адрес процесса и размер региона в структуру MEMORY_BASIC_INFORMATION
                if (MemDump == 0) break;                                                             // Выход из цыкла 
                if ((MemInfo.State & 0x1000) != 0 && (MemInfo.Protect & 0x100) == 0)                 // Если флаг региона  0x1000, 0x100 известные флаги (MEM_COMMIT, MEM_RESERVE, MEM_FREE, MEM_PRIVATE, MEM_MAPPED, or MEM_IMAGE).
                    MemReg.Add(MemInfo);                                                             // Добавим в MemReg 
                
                Addy = new IntPtr(MemInfo.BaseAddress.ToInt32() + MemInfo.RegionSize);

            }
        }
процесс что я читаю 32 битный. В начале, все идет хорошо, пока не достигает значения MemInfo.BaseAddress.ToInt32() = 2147418112 MemInfo.RegionSize = 2147123200 по идее если эти два значения сложить то они не должны переполнять IntPtr. или я что то не понимаю P/S пользовался всеми доступными поисковыми системы, даже китайской

Решение задачи: «ToInt32+IntPtr = OverflowException»

textual
Листинг программы
        var s = new sigScan();
        s.MemInfo(Process.GetCurrentProcess().Handle);

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


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

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

9   голосов , оценка 4 из 5