| File: SOSDacImpl.ICLRDataEnumMemoryRegions.cs | Web Access |
| Project: Microsoft.Diagnostics.DataContractReader.Legacy.csproj (Microsoft.Diagnostics.DataContractReader.Legacy) |
// 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.Threading; using Microsoft.Diagnostics.DataContractReader.Legacy.EnumMemory; namespace Microsoft.Diagnostics.DataContractReader.Legacy; /// <summary> /// Implementation of ICLRDataEnumMemoryRegions interface intended to be passed out to consumers /// interacting with the DAC via those COM interfaces. /// </summary> public sealed unsafe partial class SOSDacImpl : ICLRDataEnumMemoryRegions { int ICLRDataEnumMemoryRegions.EnumMemoryRegions(void* callback, uint miniDumpFlags, CLRDataEnumMemoryFlags clrFlags) { using Lock.Scope scope = _apiLock.EnterScope(); if (callback is null) return HResults.E_INVALIDARG; try { // Like the native DAC, ignore the reserved clrFlags argument. DumpType dumpType = GetDumpType(miniDumpFlags); MemoryRegionEmitter emitter = new((nint)callback, (uint)_target.PointerSize, dumpType); return MemoryEnumerator.Enumerate(_target, emitter, dumpType); } catch (Exception ex) { int hr = ex.HResult; return hr < 0 ? hr : HResults.E_FAIL; } } internal static DumpType GetDumpType(uint miniDumpFlags) { const uint MiniDumpWithPrivateReadWriteMemory = 0x200; const uint MiniDumpWithFullAuxiliaryState = 0x8000; const uint MiniDumpFilterTriage = 0x100000; if ((miniDumpFlags & MiniDumpWithPrivateReadWriteMemory) != 0) return DumpType.Heap; if ((miniDumpFlags & MiniDumpWithFullAuxiliaryState) != 0) return DumpType.Mini; if ((miniDumpFlags & MiniDumpFilterTriage) != 0) return DumpType.Triage; return DumpType.Mini; } }