ToInt32+IntPtr = OverflowException - C#
Формулировка задачи:
Здрасте! моя ос Win7 64bit
скопипастил код на просторах интернета который демонстрирует работу сканера памяти
приведу часть кода
процесс что я читаю 32 битный.
В начале, все идет хорошо, пока не достигает значения
MemInfo.BaseAddress.ToInt32() = 2147418112
MemInfo.RegionSize = 2147123200
по идее если эти два значения сложить то они не должны переполнять IntPtr. или я что то не понимаю
P/S пользовался всеми доступными поисковыми системы, даже китайской
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); } }
Решение задачи: «ToInt32+IntPtr = OverflowException»
textual
Листинг программы
var s = new sigScan(); s.MemInfo(Process.GetCurrentProcess().Handle);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д