Считывание объекта с помощью ReadProcessMemory C#

Увидел в чужом коде такое:

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [MarshalAs(UnmanagedType.AsAny)] [Out] object lpBuffer, int dwSize, out int lpNumberOfBytesRead);

Большее всего меня заинтересовал третий аргумент. Попробовал повторить:

[DllImport("kernel32.dll")]
extern public static bool ReadProcessMemory(nint hProcess, nint lpBaseAddress, object? lpBuffer, int nSize, out int lpNumberOfBytesRead);

Всегда выдаёт 0(Я тестил на int). Сделал как надо через через массив байт, данные есть Исходя из этого могу сделать вывод что почему-то не передаётся ссылка

Короче есть ли способ превратить массив байт в объект или сразу счесть объект?

Контекст:

Мой

public T? GetObject<T>(nint offset)
{
    T? result = default;
    
    if (!Kernel32.ReadProcessMemory(target.Handle, Module.BaseAddress + offset, result, Marshal.SizeOf<T>(), out int readsBytes))
        throw new Exception($"Memory read error(code: {Kernel32.GetLastError()})");

    return result;
}

Чужой:

[NullableContext(0)]
public static T Read<[IsUnmanaged] T>(IntPtr Address) where T : struct, ValueType
{
    int size = Marshal.SizeOf<T>();
    object buffer = default(T);
    int lpNumberOfBytesRead;
    Memory.ReadProcessMemory(Memory._proc.Handle, Address, buffer, size, out lpNumberOfBytesRead);
    if (lpNumberOfBytesRead != size)
    {
        return default(T);
    }
    return (T)((object)buffer);
}

Ответы (1 шт):

Автор решения: Pronik

Потыкался ещё немного и пришёл к такому коду:

[DllImport("kernel32.dll")]
extern public static bool ReadProcessMemory(nint hProcess, nint lpBaseAddress, [MarshalAs(UnmanagedType.AsAny)][Out] object lpBuffer, int nSize, out int lpNumberOfBytesRead);

public T GetObject<T>(nint offset)
{
    object result = default(T);

    if (!Kernel32.ReadProcessMemory(target.Handle, Module.BaseAddress + offset, result, Marshal.SizeOf<T>(), out int readsBytes))
        throw new Exception($"Memory read error(code:{Kernel32.GetLastError()})");

    return (T)result;
}

Я всё ещё не особо понимаю почему так а не иначе, но оно вроде работает

→ Ссылка