src/Microsoft.Diagnostics.Runtime/DbgEng/DebugDataSpaces.cs (64 lines of code) (raw):
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Microsoft.Diagnostics.Runtime.Utilities;
namespace Microsoft.Diagnostics.Runtime.DbgEng
{
internal sealed unsafe class DebugDataSpaces : CallableCOMWrapper
{
internal static readonly Guid IID_IDebugDataSpaces2 = new("7a5e852f-96e9-468f-ac1b-0b3addc4a049");
public DebugDataSpaces(RefCountedFreeLibrary library, IntPtr pUnk, DebugSystemObjects sys)
: base(library, IID_IDebugDataSpaces2, pUnk)
{
_sys = sys;
SuppressRelease();
}
private ref readonly IDebugDataSpacesVTable VTable => ref Unsafe.AsRef<IDebugDataSpacesVTable>(_vtable);
public int ReadVirtual(ulong address, Span<byte> buffer)
{
using IDisposable holder = _sys.Enter();
fixed (byte* ptr = buffer)
{
HResult hr = VTable.ReadVirtual(Self, address, ptr, buffer.Length, out int read);
return read;
}
}
public HResult QueryVirtual(ulong address, out MEMORY_BASIC_INFORMATION64 info)
{
using IDisposable holder = _sys.Enter();
return VTable.QueryVirtual(Self, address, out info);
}
private readonly DebugSystemObjects _sys;
}
[StructLayout(LayoutKind.Sequential)]
internal readonly unsafe struct IDebugDataSpacesVTable
{
public readonly delegate* unmanaged[Stdcall]<IntPtr, ulong, byte*, int, out int, int> ReadVirtual;
public readonly IntPtr WriteVirtual;
public readonly IntPtr SearchVirtual;
public readonly IntPtr ReadVirtualUncached;
public readonly IntPtr WriteVirtualUncached;
public readonly IntPtr ReadPointersVirtual;
public readonly IntPtr WritePointersVirtual;
public readonly IntPtr ReadPhysical;
public readonly IntPtr WritePhysical;
public readonly IntPtr ReadControl;
public readonly IntPtr WriteControl;
public readonly IntPtr ReadIo;
public readonly IntPtr WriteIo;
public readonly IntPtr ReadMsr;
public readonly IntPtr WriteMsr;
public readonly IntPtr ReadBusData;
public readonly IntPtr WriteBusData;
public readonly IntPtr CheckLowMemory;
public readonly IntPtr ReadDebuggerData;
public readonly IntPtr ReadProcessorSystemData;
public readonly IntPtr VirtualToPhysical;
public readonly IntPtr GetVirtualTranslationPhysicalOffsets;
public readonly IntPtr ReadHandleData;
public readonly IntPtr FillVirtual;
public readonly IntPtr FillPhysical;
public readonly delegate* unmanaged[Stdcall]<IntPtr, ulong, out MEMORY_BASIC_INFORMATION64, int> QueryVirtual;
}
}