Читаю память с 32-х битного приложения. Всё отлично работает на win 7 32bit/64bit, на xp. На некоторых версиях ОС (win 8/win 10 x64) возникает ошибка при вызове этой функции:
[DllImport("kernel32.dll", SetLastError = true)]
private static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);
На некоторых машинах с win 8 64 bit/win 10 64 bit вылетает exeption:
Source: mscorlib TargetSite: Int32 op_Explicit(IntPtr) exeptMessage: Переполнение в результате выполнения арифметической операции.
Какая-то проблема с конвертацией IntPtr в Int32. Пробовал сборки делать: Any CPU, 64 bit - все также.
Аналогичная проблема в следующем примере:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength);
[StructLayout(LayoutKind.Sequential)]
public struct MEMORY_BASIC_INFORMATION
{
public IntPtr BaseAddress;
public IntPtr AllocationBase;
public uint AllocationProtect;
public IntPtr RegionSize;
public uint State;
public uint Protect;
public uint Type;
}
static void Main(string[] args)
{
MEMORY_BASIC_INFORMATION mbi = new MEMORY_BASIC_INFORMATION();
IntPtr BaseAddress = new IntPtr();
Int32 offset = 0;
IntPtr hProcess = OpenProcess(ProcessAccessFlags.All, false, pid);
VirtualQueryEx(hProcess, BaseAddress + offset, out mbi, (uint)Marshal.SizeOf(mbi));
byte[] buffer = new byte[(int)mbi.RegionSize]; //Также вызывает ошибку переполнение
byte[] buffer2 = new byte[mbi.RegionSize.ToInt32()];//Переполнение
byte[] buffer3 = new byte[mbi.RegionSize.ToInt64()];//Не подходит, так как сильно огромный массив получается
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости