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);