src/Microsoft.Diagnostics.Runtime/DacInterface/SosDac14.cs (42 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.DacInterface { /// <summary> /// This is an undocumented, untested, and unsupported interface. Do not use directly. /// </summary> internal sealed unsafe class SosDac14 : CallableCOMWrapper { private readonly DacLibrary _library; internal static readonly Guid IID_ISOSDac14 = new("9aa22aca-6dc6-4a0c-b4e0-70d2416b9837"); public SosDac14(DacLibrary library, IntPtr ptr) : base(library?.OwningLibrary, IID_ISOSDac14, ptr) { _library = library ?? throw new ArgumentNullException(nameof(library)); } private ref readonly ISOSDac14VTable VTable => ref Unsafe.AsRef<ISOSDac14VTable>(_vtable); public (ulong NonGCStaticsBase, ulong GCStaticsBase) GetStaticBaseAddress(ClrDataAddress methodTable) { HResult hr = VTable.GetStaticBaseAddress(Self, methodTable, out ClrDataAddress nonGCStaticsBase, out ClrDataAddress gcStaticsBase); return hr ? (nonGCStaticsBase, gcStaticsBase) : (0, 0); } public (ulong NonGCThreadStaticsBase, ulong GCThreadStaticsBase) GetThreadStaticBaseAddress(ClrDataAddress methodTable, ClrDataAddress thread) { HResult hr = VTable.GetThreadStaticBaseAddress(Self, methodTable, thread, out ClrDataAddress nonGCThreadStaticsBase, out ClrDataAddress gcThreadStaticsBase); return hr ? (nonGCThreadStaticsBase, gcThreadStaticsBase) : (0, 0); } [StructLayout(LayoutKind.Sequential)] private readonly unsafe struct ISOSDac14VTable { public readonly delegate* unmanaged[Stdcall]<nint, ClrDataAddress, out ClrDataAddress, out ClrDataAddress, int> GetStaticBaseAddress; public readonly delegate* unmanaged[Stdcall]<nint, ClrDataAddress, ClrDataAddress, out ClrDataAddress, out ClrDataAddress, int> GetThreadStaticBaseAddress; public readonly delegate* unmanaged[Stdcall]<nint, ClrDataAddress, out MethodTableInitializationFlags, int> GetMethodTableInitializationFlags; } } internal enum MethodTableInitializationFlags : int { Unknown, MethodTableInitialized, MethodTableInitializationFailed, } }