Как использовать C# stackallo c и сохранять ту же структуру кода? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть метод 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 и при этом получить распределение в стеке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...