Laziz Опубликовано 3 декабря, 2012 Поделиться Опубликовано 3 декабря, 2012 Ребята помогите разобраться с ошибкой пожалуйстаИзучаю АПИ функции, а именно "VirtualQueryEx", с помощью него ищу байтов в процессе.Код выдает ошибку "Переполнение в результате выполнение арифметической операции"то есть переменная "blockAddress" выходит за рамки чегота. (предпологаю за рамки (IntPtr), потому что ошибку выдает после того как переменная "blockAddress" накапливает 3.956.862.976 цифр)В чем ошибка?public static void FinderReplacer(IntPtr pHandle,byte[] find, byte[] paste, long Pws64) { IntPtr handle = pHandle; try { long blockAddress = 0; while(blockAddress<(blockAddress+Pws64-find.Length)) { MEMORY_BASIC_INFORMATION mbi; VirtualQueryEx(handle,(IntPtr)blockAddress, out mbi,(uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION))); // Ощибка в этой строке. if (mbi.AllocationProtect == (uint)AllocationProtect.PAGE_READWRITE || mbi.AllocationProtect == (uint)AllocationProtect.PAGE_EXECUTE_READWRITE) { byte[] region=new byte[mbi.RegionSize.ToInt32()]; IntPtr realReaded; ReadProcessMemory(handle, (IntPtr)blockAddress, region,(uint) region.Length, out realReaded); for (int i = 0; i <= region.Length-find.Length; i++) { ........... ........... ........... } } blockAddress += mbi.RegionSize.ToInt64(); // Продолжаем дальше искать, если не нашли нужный байт } } catch (Exception ex) { MessageBox.Show(ex.Message+"\n\n"+ex.StackTrace); }}Добавлено:Если изменит условие "while" while(blockAddress <= 0x7FFFFFFF)то ошибку переполнение не выдает но, нужный байт не находит Ссылка на комментарий Поделиться на другие сайты Поделиться
CHEATERCE Опубликовано 3 декабря, 2012 Поделиться Опубликовано 3 декабря, 2012 Сделай так VirtualQueryEx(handle, (IntPtr)startMem, ref mbi, Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION))); Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 3 декабря, 2012 Автор Поделиться Опубликовано 3 декабря, 2012 Сделай такVirtualQueryEx(handle, (IntPtr)startMem, ref mbi, Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));одно и то же Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 3 декабря, 2012 Поделиться Опубликовано 3 декабря, 2012 A pointer to the base address of the region of pages to be queried. This value is rounded down to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function.If lpAddress specifies an address above the highest memory address accessible to the process, the function fails with ERROR_INVALID_PARAMETER.LPCVOID == A pointer to a constant of any type.IntPtr имеет размер 4 или 8 байт, в зависимости от архитектуры и значения поля IntPtr.Size. Или попробуй 8-байтовый размер задать, или просто в описании функции поменяй тип на что-нибудь пошире. Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 4 декабря, 2012 Автор Поделиться Опубликовано 4 декабря, 2012 A pointer to the base address of the region of pages to be queried. This value is rounded down to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function.If lpAddress specifies an address above the highest memory address accessible to the process, the function fails with ERROR_INVALID_PARAMETER.LPCVOID == A pointer to a constant of any type.IntPtr имеет размер 4 или 8 байт, в зависимости от архитектуры и значения поля IntPtr.Size. Или попробуй 8-байтовый размер задать, или просто в описании функции поменяй тип на что-нибудь пошире.Ура заработала, СпасибоПрицепил GetSystemInfo и убрал условие if (mbi.AllocationProtect == (uint)AllocationProtect.PAGE_READWRITE || mbi.AllocationProtect == (uint)AllocationProtect.PAGE_EXECUTE_READWRITE)а то нужном участке памяти дает false Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения