C# Переполнение на win 8/win 10 x64 (IntPtr To Int32). Как бороться?

247
15 мая 2018, 12:00

Читаю память с 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()];//Не подходит, так как сильно огромный массив получается
        }
READ ALSO
как получить координаты элемента UserControl

как получить координаты элемента UserControl

как получить координаты элемента UserControl (то есть на usercontrol есть два эллипса и нужно получить координаты одного из них) относительно холста...

216
Рандомный выбор + / -

Рандомный выбор + / -

Как рандомно выбрать + и - для вычисления ?

268
c# deserialize part of json

c# deserialize part of json

Есть нижеследущий JSON

273
Как восстановить привязку?

Как восстановить привязку?

TreeView заполняется программно при помощи ObservableCollectionПривязка устанавливается в том числе и на открытие-закрытие Items TreeView, что бы открывать...

272