У меня есть метод MemRead
, который читает память и возвращает байтовый массив
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, ref byte lpBuffer, int dwSize, out int lpNumberOfBytesRead);
public static Span<byte> MemRead(this Process process, IntPtr address, int size)
{
if (process == null)
throw new ArgumentException("Process is null");
Span<byte> buffer = new byte[size];
bool success = NativeMethods.ReadProcessMemory(process.Handle, address, ref MemoryMarshal.GetReference(buffer), size, out int lpNumberOfBytesRead);
if (!success)
throw new Exception("ReadProcessMemory failed");
if (lpNumberOfBytesRead < size)
throw new Exception($"ReadProcessMemory failed : {lpNumberOfBytesRead} bytes read out of {size}");
return buffer;
}
И у меня есть методы MemReadInt32
, MemReadBool
, ..., которые вызывают MemRead
и выполняют преобразование
public static int MemReadInt32(this Process process, IntPtr address)
{
return BitConverter.ToInt32(MemRead(process, address, 4));
}
Теперь я хочу выделить буфер в стеке вместо кучи, поэтому я изменяю эту строку
Span<byte> buffer = new byte[size];
на
Span<byte> buffer = stackalloc byte[size];
Компилятор выдает ошибку, потому что выделенный массив стека не может быть открыт за пределами области объявления. Имеет смысл, что это предотвращает потенциальное продвижение в кучу.
Но тогда я вынужден поместить код преобразования в тот же метод, что и код чтения. И код чтения будет повторяться для каждого MemReadInt32
, MemReadBool
, ...
Как можно избежать повторения кода ReadMem
и при этом получить распределение в стеке?