From fdfa018fe89ff8ccf460d6c6f978e39ce3f47ac0 Mon Sep 17 00:00:00 2001 From: Barbara Rosiak Date: Fri, 27 Feb 2026 17:03:53 -0800 Subject: [PATCH 1/5] Implement GetCurrentAppDomain for cDAC --- .../ClrDataAppDomain.cs | 48 +++++++++++++++++ .../ClrDataFrame.cs | 2 +- .../ClrDataModule.cs | 10 ++-- .../ClrDataTask.cs | 30 ++++++++++- .../IXCLRData.cs | 52 +++++++++++++++---- .../SOSDacImpl.IXCLRDataProcess.cs | 10 ++-- .../managed/cdac/tests/ClrDataTaskTests.cs | 44 ++++++++++++++++ 7 files changed, 172 insertions(+), 24 deletions(-) create mode 100644 src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs create mode 100644 src/native/managed/cdac/tests/ClrDataTaskTests.cs diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs new file mode 100644 index 00000000000000..000a54551e137f --- /dev/null +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs @@ -0,0 +1,48 @@ +// 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.InteropServices; +using System.Runtime.InteropServices.Marshalling; + +namespace Microsoft.Diagnostics.DataContractReader.Legacy; + +[GeneratedComClass] +public sealed unsafe partial class ClrDataAppDomain: IXCLRDataAppDomain +{ + private readonly Target _target; + private readonly TargetPointer _appDomain; + private readonly IXCLRDataAppDomain? _legacyImpl; + + public ClrDataAppDomain(Target target, TargetPointer appDomain, IXCLRDataAppDomain? legacyImpl) + { + _target = target; + _appDomain = appDomain; + _legacyImpl = legacyImpl; + } + + int IXCLRDataAppDomain.GetProcess(IXCLRDataProcess** process) + => _legacyImpl is not null ? _legacyImpl.GetProcess(process) : HResults.E_NOTIMPL; + + int IXCLRDataAppDomain.GetName(uint bufLen, uint* nameLen, char* name) + => _legacyImpl is not null ? _legacyImpl.GetName(bufLen, nameLen, name) : HResults.E_NOTIMPL; + + int IXCLRDataAppDomain.GetUniqueID(ulong* id) + => _legacyImpl is not null ? _legacyImpl.GetUniqueID(id) : HResults.E_NOTIMPL; + + int IXCLRDataAppDomain.GetFlags(uint* flags) + => _legacyImpl is not null ? _legacyImpl.GetFlags(flags) : HResults.E_NOTIMPL; + + int IXCLRDataAppDomain.IsSameObject(IXCLRDataAppDomain* appDomain) + => _legacyImpl is not null ? _legacyImpl.IsSameObject(appDomain) : HResults.E_NOTIMPL; + + int IXCLRDataAppDomain.GetManagedObject(/*IXCLRDataValue*/ void** value) + => _legacyImpl is not null ? _legacyImpl.GetManagedObject(value) : HResults.E_NOTIMPL; + + int IXCLRDataAppDomain.Request(uint reqCode, + uint inBufferSize, + [In, MarshalUsing(CountElementName = nameof(inBufferSize))] byte[] inBuffer, + uint outBufferSize, + [Out, MarshalUsing(CountElementName = nameof(outBufferSize))] byte[] outBuffer) + => _legacyImpl is not null ? _legacyImpl.Request(reqCode, inBufferSize, inBuffer, outBufferSize, outBuffer) : HResults.E_NOTIMPL; +} diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs index a47ab74739da47..8c8bd3b1b7d709 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.cs @@ -40,7 +40,7 @@ int IXCLRDataFrame.GetContext( [Out, MarshalUsing(CountElementName = nameof(contextBufSize))] byte[] contextBuf) => _legacyImpl is not null ? _legacyImpl.GetContext(contextFlags, contextBufSize, contextSize, contextBuf) : HResults.E_NOTIMPL; - int IXCLRDataFrame.GetAppDomain(void** appDomain) + int IXCLRDataFrame.GetAppDomain(/*IXCLRDataAppDomain*/ void** appDomain) => _legacyImpl is not null ? _legacyImpl.GetAppDomain(appDomain) : HResults.E_NOTIMPL; int IXCLRDataFrame.GetNumArguments(uint* numArgs) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs index f8f08dc5c3e762..afdab89ab46427 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs @@ -74,7 +74,7 @@ int IXCLRDataModule.EnumTypeDefinition(ulong* handle, /*IXCLRDataTypeDefinition* int IXCLRDataModule.EndEnumTypeDefinitions(ulong handle) => _legacyModule is not null ? _legacyModule.EndEnumTypeDefinitions(handle) : HResults.E_NOTIMPL; - int IXCLRDataModule.StartEnumTypeInstances(/*IXCLRDataAppDomain*/ void* appDomain, ulong* handle) + int IXCLRDataModule.StartEnumTypeInstances(IXCLRDataAppDomain* appDomain, ulong* handle) => _legacyModule is not null ? _legacyModule.StartEnumTypeInstances(appDomain, handle) : HResults.E_NOTIMPL; int IXCLRDataModule.EnumTypeInstance(ulong* handle, /*IXCLRDataTypeInstance*/ void** typeInstance) => _legacyModule is not null ? _legacyModule.EnumTypeInstance(handle, typeInstance) : HResults.E_NOTIMPL; @@ -88,7 +88,7 @@ int IXCLRDataModule.EnumTypeDefinitionByName(ulong* handle, /*IXCLRDataTypeDefin int IXCLRDataModule.EndEnumTypeDefinitionsByName(ulong handle) => _legacyModule is not null ? _legacyModule.EndEnumTypeDefinitionsByName(handle) : HResults.E_NOTIMPL; - int IXCLRDataModule.StartEnumTypeInstancesByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle) + int IXCLRDataModule.StartEnumTypeInstancesByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, ulong* handle) => _legacyModule is not null ? _legacyModule.StartEnumTypeInstancesByName(name, flags, appDomain, handle) : HResults.E_NOTIMPL; int IXCLRDataModule.EnumTypeInstanceByName(ulong* handle, /*IXCLRDataTypeInstance*/ void** type) => _legacyModule is not null ? _legacyModule.EnumTypeInstanceByName(handle, type) : HResults.E_NOTIMPL; @@ -105,7 +105,7 @@ int IXCLRDataModule.EnumMethodDefinitionByName(ulong* handle, /*IXCLRDataMethodD int IXCLRDataModule.EndEnumMethodDefinitionsByName(ulong handle) => _legacyModule is not null ? _legacyModule.EndEnumMethodDefinitionsByName(handle) : HResults.E_NOTIMPL; - int IXCLRDataModule.StartEnumMethodInstancesByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle) + int IXCLRDataModule.StartEnumMethodInstancesByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, ulong* handle) => _legacyModule is not null ? _legacyModule.StartEnumMethodInstancesByName(name, flags, appDomain, handle) : HResults.E_NOTIMPL; int IXCLRDataModule.EnumMethodInstanceByName(ulong* handle, out IXCLRDataMethodInstance? method) { @@ -118,7 +118,7 @@ int IXCLRDataModule.EndEnumMethodInstancesByName(ulong handle) int IXCLRDataModule.GetMethodDefinitionByToken(/*mdMethodDef*/ uint token, /*IXCLRDataMethodDefinition*/ void** methodDefinition) => _legacyModule is not null ? _legacyModule.GetMethodDefinitionByToken(token, methodDefinition) : HResults.E_NOTIMPL; - int IXCLRDataModule.StartEnumDataByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, /*IXCLRDataTask*/ void* tlsTask, ulong* handle) + int IXCLRDataModule.StartEnumDataByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, /*IXCLRDataTask*/ void* tlsTask, ulong* handle) => _legacyModule is not null ? _legacyModule.StartEnumDataByName(name, flags, appDomain, tlsTask, handle) : HResults.E_NOTIMPL; int IXCLRDataModule.EnumDataByName(ulong* handle, /*IXCLRDataValue*/ void** value) => _legacyModule is not null ? _legacyModule.EnumDataByName(handle, value) : HResults.E_NOTIMPL; @@ -415,7 +415,7 @@ private int DacPrivateRequestGetModuleData(uint inBufferSize, byte* inBuffer, ui int IXCLRDataModule.StartEnumAppDomains(ulong* handle) => _legacyModule is not null ? _legacyModule.StartEnumAppDomains(handle) : HResults.E_NOTIMPL; - int IXCLRDataModule.EnumAppDomain(ulong* handle, /*IXCLRDataAppDomain*/ void** appDomain) + int IXCLRDataModule.EnumAppDomain(ulong* handle, IXCLRDataAppDomain** appDomain) => _legacyModule is not null ? _legacyModule.EnumAppDomain(handle, appDomain) : HResults.E_NOTIMPL; int IXCLRDataModule.EndEnumAppDomains(ulong handle) => _legacyModule is not null ? _legacyModule.EndEnumAppDomains(handle) : HResults.E_NOTIMPL; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs index 64b70646e5f675..d13ae8086bba05 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics; using System.Runtime.InteropServices.Marshalling; using Microsoft.Diagnostics.DataContractReader.Contracts; @@ -23,8 +24,33 @@ public ClrDataTask(TargetPointer address, Target target, IXCLRDataTask? legacyIm int IXCLRDataTask.GetProcess(/*IXCLRDataProcess*/ void** process) => _legacyImpl is not null ? _legacyImpl.GetProcess(process) : HResults.E_NOTIMPL; - int IXCLRDataTask.GetCurrentAppDomain(/*IXCLRDataAppDomain*/ void** appDomain) - => _legacyImpl is not null ? _legacyImpl.GetCurrentAppDomain(appDomain) : HResults.E_NOTIMPL; + int IXCLRDataTask.GetCurrentAppDomain(out IXCLRDataAppDomain? appDomain) + { + int hr = HResults.S_OK, hrLocal = HResults.S_OK; + appDomain = null; + IXCLRDataAppDomain? legacyAppDomain = null; + + if (_legacyImpl is not null) + { + hrLocal = _legacyImpl.GetCurrentAppDomain(out legacyAppDomain); + } + try + { + TargetPointer currentAppDomain = _target.ReadPointer(_target.ReadGlobalPointer(Constants.Globals.AppDomain)); + appDomain = new ClrDataAppDomain(_target, currentAppDomain, legacyAppDomain); + } + catch (System.Exception ex) + { + hr = ex.HResult; + } +#if DEBUG + if (_legacyImpl is not null) + { + Debug.Assert(hrLocal == hr, $"cDAC: {hr:x}, DAC: {hrLocal:x}"); + } +#endif + return hr; + } int IXCLRDataTask.GetUniqueID(ulong* id) => _legacyImpl is not null ? _legacyImpl.GetUniqueID(id) : HResults.E_NOTIMPL; int IXCLRDataTask.GetFlags(uint* flags) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs index 9e181eeab46671..6f0d369b85d36e 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs @@ -48,7 +48,7 @@ public unsafe partial interface IXCLRDataModule int EndEnumTypeDefinitions(ulong handle); [PreserveSig] - int StartEnumTypeInstances(/*IXCLRDataAppDomain*/ void* appDomain, ulong* handle); + int StartEnumTypeInstances(IXCLRDataAppDomain* appDomain, ulong* handle); [PreserveSig] int EnumTypeInstance(ulong* handle, /*IXCLRDataTypeInstance*/ void** typeInstance); [PreserveSig] @@ -62,7 +62,7 @@ public unsafe partial interface IXCLRDataModule int EndEnumTypeDefinitionsByName(ulong handle); [PreserveSig] - int StartEnumTypeInstancesByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle); + int StartEnumTypeInstancesByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, ulong* handle); [PreserveSig] int EnumTypeInstanceByName(ulong* handle, /*IXCLRDataTypeInstance*/ void** type); [PreserveSig] @@ -79,7 +79,7 @@ public unsafe partial interface IXCLRDataModule int EndEnumMethodDefinitionsByName(ulong handle); [PreserveSig] - int StartEnumMethodInstancesByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle); + int StartEnumMethodInstancesByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, ulong* handle); [PreserveSig] int EnumMethodInstanceByName(ulong* handle, out IXCLRDataMethodInstance? method); [PreserveSig] @@ -89,7 +89,7 @@ public unsafe partial interface IXCLRDataModule int GetMethodDefinitionByToken(/*mdMethodDef*/ uint token, /*IXCLRDataMethodDefinition*/ void** methodDefinition); [PreserveSig] - int StartEnumDataByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, /*IXCLRDataTask*/ void* tlsTask, ulong* handle); + int StartEnumDataByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, /*IXCLRDataTask*/ void* tlsTask, ulong* handle); [PreserveSig] int EnumDataByName(ulong* handle, /*IXCLRDataValue*/ void** value); [PreserveSig] @@ -119,7 +119,7 @@ public unsafe partial interface IXCLRDataModule [PreserveSig] int StartEnumAppDomains(ulong* handle); [PreserveSig] - int EnumAppDomain(ulong* handle, /*IXCLRDataAppDomain*/ void** appDomain); + int EnumAppDomain(ulong* handle, IXCLRDataAppDomain** appDomain); [PreserveSig] int EndEnumAppDomains(ulong handle); @@ -183,11 +183,11 @@ int GetRuntimeNameByAddress( [PreserveSig] int StartEnumAppDomains(ulong* handle); [PreserveSig] - int EnumAppDomain(ulong* handle, /*IXCLRDataAppDomain*/ void** appDomain); + int EnumAppDomain(ulong* handle, IXCLRDataAppDomain** appDomain); [PreserveSig] int EndEnumAppDomains(ulong handle); [PreserveSig] - int GetAppDomainByUniqueID(ulong id, /*IXCLRDataAppDomain*/ void** appDomain); + int GetAppDomainByUniqueID(ulong id, IXCLRDataAppDomain** appDomain); [PreserveSig] int StartEnumAssemblies(ulong* handle); @@ -206,7 +206,7 @@ int GetRuntimeNameByAddress( int GetModuleByAddress(ClrDataAddress address, /*IXCLRDataModule*/ void** mod); [PreserveSig] - int StartEnumMethodInstancesByAddress(ClrDataAddress address, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle); + int StartEnumMethodInstancesByAddress(ClrDataAddress address, IXCLRDataAppDomain* appDomain, ulong* handle); [PreserveSig] int EnumMethodInstanceByAddress(ulong* handle, out IXCLRDataMethodInstance? method); [PreserveSig] @@ -216,7 +216,7 @@ int GetRuntimeNameByAddress( int GetDataByAddress( ClrDataAddress address, uint flags, - /*IXCLRDataAppDomain*/ void* appDomain, + IXCLRDataAppDomain* appDomain, /*IXCLRDataTask*/ void* tlsTask, uint bufLen, uint* nameLen, @@ -234,7 +234,7 @@ int GetDataByAddress( [PreserveSig] int CreateMemoryValue( - /*IXCLRDataAppDomain*/ void* appDomain, + IXCLRDataAppDomain* appDomain, /*IXCLRDataTask*/ void* tlsTask, /*IXCLRDataTypeInstance*/ void* type, ClrDataAddress addr, @@ -334,6 +334,36 @@ public unsafe partial interface IXCLRDataProcess2 : IXCLRDataProcess int SetGcNotification(GcEvtArgs gcEvtArgs); } +[GeneratedComInterface] +[Guid("7CA04601-C702-4670-A63C-FA44F7DA7BD5")] +public unsafe partial interface IXCLRDataAppDomain +{ + [PreserveSig] + int GetProcess(IXCLRDataProcess** process); + + [PreserveSig] + int GetName(uint bufLen, uint* nameLen, char* name); + + [PreserveSig] + int GetUniqueID(ulong* id); + + [PreserveSig] + int GetFlags(uint* flags); + + [PreserveSig] + int IsSameObject(IXCLRDataAppDomain* appDomain); + + [PreserveSig] + int GetManagedObject(/*IXCLRDataValue*/ void** value); + + [PreserveSig] + int Request(uint reqCode, + uint inBufferSize, + [In, MarshalUsing(CountElementName = nameof(inBufferSize))] byte[] inBuffer, + uint outBufferSize, + [Out, MarshalUsing(CountElementName = nameof(outBufferSize))] byte[] outBuffer); +} + [GeneratedComInterface] [Guid("E59D8D22-ADA7-49a2-89B5-A415AFCFC95F")] public unsafe partial interface IXCLRDataStackWalk @@ -447,7 +477,7 @@ public unsafe partial interface IXCLRDataTask int GetProcess(/*IXCLRDataProcess*/ void** process); [PreserveSig] - int GetCurrentAppDomain(/*IXCLRDataAppDomain*/ void** appDomain); + int GetCurrentAppDomain(out IXCLRDataAppDomain? appDomain); [PreserveSig] int GetUniqueID(ulong* id); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs index 6fa6cbe173ec1a..a1a6949f5162f4 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs @@ -106,13 +106,13 @@ int IXCLRDataProcess.GetRuntimeNameByAddress( int IXCLRDataProcess.StartEnumAppDomains(ulong* handle) => _legacyProcess is not null ? _legacyProcess.StartEnumAppDomains(handle) : HResults.E_NOTIMPL; - int IXCLRDataProcess.EnumAppDomain(ulong* handle, /*IXCLRDataAppDomain*/ void** appDomain) + int IXCLRDataProcess.EnumAppDomain(ulong* handle, IXCLRDataAppDomain** appDomain) => _legacyProcess is not null ? _legacyProcess.EnumAppDomain(handle, appDomain) : HResults.E_NOTIMPL; int IXCLRDataProcess.EndEnumAppDomains(ulong handle) => _legacyProcess is not null ? _legacyProcess.EndEnumAppDomains(handle) : HResults.E_NOTIMPL; - int IXCLRDataProcess.GetAppDomainByUniqueID(ulong id, /*IXCLRDataAppDomain*/ void** appDomain) + int IXCLRDataProcess.GetAppDomainByUniqueID(ulong id, IXCLRDataAppDomain** appDomain) => _legacyProcess is not null ? _legacyProcess.GetAppDomainByUniqueID(id, appDomain) : HResults.E_NOTIMPL; int IXCLRDataProcess.StartEnumAssemblies(ulong* handle) @@ -329,7 +329,7 @@ private bool HasMethodInstantiation(MethodDescHandle md) } } - int IXCLRDataProcess.StartEnumMethodInstancesByAddress(ClrDataAddress address, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle) + int IXCLRDataProcess.StartEnumMethodInstancesByAddress(ClrDataAddress address, IXCLRDataAppDomain* appDomain, ulong* handle) { int hr = HResults.S_FALSE; *handle = 0; @@ -449,7 +449,7 @@ int IXCLRDataProcess.EndEnumMethodInstancesByAddress(ulong handle) int IXCLRDataProcess.GetDataByAddress( ClrDataAddress address, uint flags, - /*IXCLRDataAppDomain*/ void* appDomain, + IXCLRDataAppDomain* appDomain, /*IXCLRDataTask*/ void* tlsTask, uint bufLen, uint* nameLen, @@ -468,7 +468,7 @@ int IXCLRDataProcess.Request(uint reqCode, uint inBufferSize, byte* inBuffer, ui => _legacyProcess is not null ? _legacyProcess.Request(reqCode, inBufferSize, inBuffer, outBufferSize, outBuffer) : HResults.E_NOTIMPL; int IXCLRDataProcess.CreateMemoryValue( - /*IXCLRDataAppDomain*/ void* appDomain, + IXCLRDataAppDomain* appDomain, /*IXCLRDataTask*/ void* tlsTask, /*IXCLRDataTypeInstance*/ void* type, ClrDataAddress addr, diff --git a/src/native/managed/cdac/tests/ClrDataTaskTests.cs b/src/native/managed/cdac/tests/ClrDataTaskTests.cs new file mode 100644 index 00000000000000..9288e03edbf096 --- /dev/null +++ b/src/native/managed/cdac/tests/ClrDataTaskTests.cs @@ -0,0 +1,44 @@ +// 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 Microsoft.Diagnostics.DataContractReader.Legacy; +using Xunit; + +namespace Microsoft.Diagnostics.DataContractReader.Tests; + +public unsafe class ClrDataTaskTests +{ + [Theory] + [ClassData(typeof(MockTarget.StdArch))] + public void GetCurrentAppDomain(MockTarget.Architecture arch) + { + TargetTestHelpers helpers = new(arch); + MockMemorySpace.Builder builder = new(helpers); + + ulong globalPtrAddr = 0x1000; + ulong expectedAppDomain = 0x2000; + + byte[] ptrData = new byte[helpers.PointerSize]; + helpers.WritePointer(ptrData, expectedAppDomain); + builder.AddHeapFragment(new MockMemorySpace.HeapFragment + { + Address = globalPtrAddr, + Data = ptrData, + Name = "AppDomainGlobalPointer" + }); + + var target = new TestPlaceholderTarget( + arch, + builder.GetMemoryContext().ReadFromTarget, + globals: [(Constants.Globals.AppDomain, globalPtrAddr)]); + + TargetPointer taskAddress = new TargetPointer(0x5000); + IXCLRDataTask task = new ClrDataTask(taskAddress, target, legacyImpl: null); + int hr = task.GetCurrentAppDomain(out IXCLRDataAppDomain? appDomain); + + Assert.Equal(HResults.S_OK, hr); + Assert.NotNull(appDomain); + Assert.IsType(appDomain); + } +} From 5235deca590234fa452aff90fbaa336fb4b0ee10 Mon Sep 17 00:00:00 2001 From: Barbara Rosiak Date: Mon, 2 Mar 2026 11:15:33 -0800 Subject: [PATCH 2/5] Fix build issues --- .../ClrDataAppDomain.cs | 12 ++----- .../ClrDataTask.cs | 5 ++- .../IXCLRData.cs | 34 ++----------------- 3 files changed, 6 insertions(+), 45 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs index 000a54551e137f..7c066420c9ac62 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs @@ -10,14 +10,10 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy; [GeneratedComClass] public sealed unsafe partial class ClrDataAppDomain: IXCLRDataAppDomain { - private readonly Target _target; - private readonly TargetPointer _appDomain; private readonly IXCLRDataAppDomain? _legacyImpl; - public ClrDataAppDomain(Target target, TargetPointer appDomain, IXCLRDataAppDomain? legacyImpl) + public ClrDataAppDomain(IXCLRDataAppDomain? legacyImpl) { - _target = target; - _appDomain = appDomain; _legacyImpl = legacyImpl; } @@ -39,10 +35,6 @@ int IXCLRDataAppDomain.IsSameObject(IXCLRDataAppDomain* appDomain) int IXCLRDataAppDomain.GetManagedObject(/*IXCLRDataValue*/ void** value) => _legacyImpl is not null ? _legacyImpl.GetManagedObject(value) : HResults.E_NOTIMPL; - int IXCLRDataAppDomain.Request(uint reqCode, - uint inBufferSize, - [In, MarshalUsing(CountElementName = nameof(inBufferSize))] byte[] inBuffer, - uint outBufferSize, - [Out, MarshalUsing(CountElementName = nameof(outBufferSize))] byte[] outBuffer) + int IXCLRDataAppDomain.Request(uint reqCode, uint inBufferSize, byte* inBuffer, uint outBufferSize, byte* outBuffer) => _legacyImpl is not null ? _legacyImpl.Request(reqCode, inBufferSize, inBuffer, outBufferSize, outBuffer) : HResults.E_NOTIMPL; } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs index d13ae8086bba05..eca7f74ccc230c 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics; using System.Runtime.InteropServices.Marshalling; using Microsoft.Diagnostics.DataContractReader.Contracts; @@ -37,7 +36,7 @@ int IXCLRDataTask.GetCurrentAppDomain(out IXCLRDataAppDomain? appDomain) try { TargetPointer currentAppDomain = _target.ReadPointer(_target.ReadGlobalPointer(Constants.Globals.AppDomain)); - appDomain = new ClrDataAppDomain(_target, currentAppDomain, legacyAppDomain); + appDomain = new ClrDataAppDomain(legacyAppDomain); } catch (System.Exception ex) { @@ -46,7 +45,7 @@ int IXCLRDataTask.GetCurrentAppDomain(out IXCLRDataAppDomain? appDomain) #if DEBUG if (_legacyImpl is not null) { - Debug.Assert(hrLocal == hr, $"cDAC: {hr:x}, DAC: {hrLocal:x}"); + System.Diagnostics.Debug.Assert(hrLocal == hr, $"cDAC: {hr:x}, DAC: {hrLocal:x}"); } #endif return hr; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs index 42cf016a71b24b..43cb9db11c9d51 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs @@ -334,36 +334,6 @@ public unsafe partial interface IXCLRDataProcess2 : IXCLRDataProcess int SetGcNotification(GcEvtArgs gcEvtArgs); } -[GeneratedComInterface] -[Guid("7CA04601-C702-4670-A63C-FA44F7DA7BD5")] -public unsafe partial interface IXCLRDataAppDomain -{ - [PreserveSig] - int GetProcess(IXCLRDataProcess** process); - - [PreserveSig] - int GetName(uint bufLen, uint* nameLen, char* name); - - [PreserveSig] - int GetUniqueID(ulong* id); - - [PreserveSig] - int GetFlags(uint* flags); - - [PreserveSig] - int IsSameObject(IXCLRDataAppDomain* appDomain); - - [PreserveSig] - int GetManagedObject(/*IXCLRDataValue*/ void** value); - - [PreserveSig] - int Request(uint reqCode, - uint inBufferSize, - [In, MarshalUsing(CountElementName = nameof(inBufferSize))] byte[] inBuffer, - uint outBufferSize, - [Out, MarshalUsing(CountElementName = nameof(outBufferSize))] byte[] outBuffer); -} - [GeneratedComInterface] [Guid("E59D8D22-ADA7-49a2-89B5-A415AFCFC95F")] public unsafe partial interface IXCLRDataStackWalk @@ -617,7 +587,7 @@ int Request( public unsafe partial interface IXCLRDataAppDomain { [PreserveSig] - int GetProcess(/*IXCLRDataProcess*/ void** process); + int GetProcess(IXCLRDataProcess** process); [PreserveSig] int GetName(uint bufLen, uint* nameLen, char* name); [PreserveSig] @@ -625,7 +595,7 @@ public unsafe partial interface IXCLRDataAppDomain [PreserveSig] int GetFlags(uint* flags); [PreserveSig] - int IsSameObject(/*IXCLRDataAppDomain*/ void* appDomain); + int IsSameObject(IXCLRDataAppDomain* appDomain); [PreserveSig] int GetManagedObject(/*IXCLRDataValue*/ void** value); [PreserveSig] From 7f4c7471124f77df4662eedb55f87fce2711b7ae Mon Sep 17 00:00:00 2001 From: Barbara Rosiak Date: Tue, 3 Mar 2026 13:36:30 -0800 Subject: [PATCH 3/5] Implement IsSameObject, expand test --- .../ClrDataAppDomain.cs | 34 +++++++++++++++++-- .../ClrDataTask.cs | 2 +- .../managed/cdac/tests/ClrDataTaskTests.cs | 3 +- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs index 7c066420c9ac62..de563d642e7571 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.InteropServices.Marshalling; @@ -10,10 +11,14 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy; [GeneratedComClass] public sealed unsafe partial class ClrDataAppDomain: IXCLRDataAppDomain { + private readonly TargetPointer _appDomain; private readonly IXCLRDataAppDomain? _legacyImpl; - public ClrDataAppDomain(IXCLRDataAppDomain? legacyImpl) + public TargetPointer Address => _appDomain; + + public ClrDataAppDomain(TargetPointer appDomain, IXCLRDataAppDomain? legacyImpl) { + _appDomain = appDomain; _legacyImpl = legacyImpl; } @@ -30,7 +35,32 @@ int IXCLRDataAppDomain.GetFlags(uint* flags) => _legacyImpl is not null ? _legacyImpl.GetFlags(flags) : HResults.E_NOTIMPL; int IXCLRDataAppDomain.IsSameObject(IXCLRDataAppDomain* appDomain) - => _legacyImpl is not null ? _legacyImpl.IsSameObject(appDomain) : HResults.E_NOTIMPL; + { + int hr = HResults.S_FALSE; + try + { + StrategyBasedComWrappers cw = new(); + object obj = cw.GetOrCreateObjectForComInstance((nint)appDomain, CreateObjectFlags.None); + if (obj is ClrDataAppDomain other) + { + hr = _appDomain == other._appDomain ? HResults.S_OK : HResults.S_FALSE; + } + } + catch (Exception ex) + { + hr = ex.HResult; + } + +#if DEBUG + if (_legacyImpl is not null) + { + int hrLocal = _legacyImpl.IsSameObject(appDomain); + Debug.Assert(hrLocal == hr, $"cDAC: {hr}, DAC: {hrLocal}"); + } +#endif + + return hr; + } int IXCLRDataAppDomain.GetManagedObject(/*IXCLRDataValue*/ void** value) => _legacyImpl is not null ? _legacyImpl.GetManagedObject(value) : HResults.E_NOTIMPL; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs index eca7f74ccc230c..585784900d8586 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs @@ -36,7 +36,7 @@ int IXCLRDataTask.GetCurrentAppDomain(out IXCLRDataAppDomain? appDomain) try { TargetPointer currentAppDomain = _target.ReadPointer(_target.ReadGlobalPointer(Constants.Globals.AppDomain)); - appDomain = new ClrDataAppDomain(legacyAppDomain); + appDomain = new ClrDataAppDomain(currentAppDomain, legacyAppDomain); } catch (System.Exception ex) { diff --git a/src/native/managed/cdac/tests/ClrDataTaskTests.cs b/src/native/managed/cdac/tests/ClrDataTaskTests.cs index 9288e03edbf096..217601488156e3 100644 --- a/src/native/managed/cdac/tests/ClrDataTaskTests.cs +++ b/src/native/managed/cdac/tests/ClrDataTaskTests.cs @@ -39,6 +39,7 @@ public void GetCurrentAppDomain(MockTarget.Architecture arch) Assert.Equal(HResults.S_OK, hr); Assert.NotNull(appDomain); - Assert.IsType(appDomain); + ClrDataAppDomain clrAppDomain = Assert.IsType(appDomain); + Assert.Equal(new TargetPointer(expectedAppDomain), clrAppDomain.Address); } } From 79ab08f6122fa0b0a2a1a025650f63db98922109 Mon Sep 17 00:00:00 2001 From: Barbara Rosiak Date: Tue, 3 Mar 2026 13:41:00 -0800 Subject: [PATCH 4/5] Add a space character --- .../ClrDataAppDomain.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs index de563d642e7571..031ab9a7cbf30c 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs @@ -9,7 +9,7 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy; [GeneratedComClass] -public sealed unsafe partial class ClrDataAppDomain: IXCLRDataAppDomain +public sealed unsafe partial class ClrDataAppDomain : IXCLRDataAppDomain { private readonly TargetPointer _appDomain; private readonly IXCLRDataAppDomain? _legacyImpl; From a96da618181eab6ee931f7503068fec923ec281d Mon Sep 17 00:00:00 2001 From: Barbara Rosiak Date: Wed, 4 Mar 2026 17:11:58 -0800 Subject: [PATCH 5/5] Revert type substitution --- .../ClrDataAppDomain.cs | 2 +- .../ClrDataModule.cs | 10 ++++----- .../IXCLRData.cs | 22 +++++++++---------- .../SOSDacImpl.IXCLRDataProcess.cs | 10 ++++----- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs index 031ab9a7cbf30c..ec94fc12bf7702 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataAppDomain.cs @@ -22,7 +22,7 @@ public ClrDataAppDomain(TargetPointer appDomain, IXCLRDataAppDomain? legacyImpl) _legacyImpl = legacyImpl; } - int IXCLRDataAppDomain.GetProcess(IXCLRDataProcess** process) + int IXCLRDataAppDomain.GetProcess(/*IXCLRDataProcess*/ void** process) => _legacyImpl is not null ? _legacyImpl.GetProcess(process) : HResults.E_NOTIMPL; int IXCLRDataAppDomain.GetName(uint bufLen, uint* nameLen, char* name) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs index afdab89ab46427..f8f08dc5c3e762 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs @@ -74,7 +74,7 @@ int IXCLRDataModule.EnumTypeDefinition(ulong* handle, /*IXCLRDataTypeDefinition* int IXCLRDataModule.EndEnumTypeDefinitions(ulong handle) => _legacyModule is not null ? _legacyModule.EndEnumTypeDefinitions(handle) : HResults.E_NOTIMPL; - int IXCLRDataModule.StartEnumTypeInstances(IXCLRDataAppDomain* appDomain, ulong* handle) + int IXCLRDataModule.StartEnumTypeInstances(/*IXCLRDataAppDomain*/ void* appDomain, ulong* handle) => _legacyModule is not null ? _legacyModule.StartEnumTypeInstances(appDomain, handle) : HResults.E_NOTIMPL; int IXCLRDataModule.EnumTypeInstance(ulong* handle, /*IXCLRDataTypeInstance*/ void** typeInstance) => _legacyModule is not null ? _legacyModule.EnumTypeInstance(handle, typeInstance) : HResults.E_NOTIMPL; @@ -88,7 +88,7 @@ int IXCLRDataModule.EnumTypeDefinitionByName(ulong* handle, /*IXCLRDataTypeDefin int IXCLRDataModule.EndEnumTypeDefinitionsByName(ulong handle) => _legacyModule is not null ? _legacyModule.EndEnumTypeDefinitionsByName(handle) : HResults.E_NOTIMPL; - int IXCLRDataModule.StartEnumTypeInstancesByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, ulong* handle) + int IXCLRDataModule.StartEnumTypeInstancesByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle) => _legacyModule is not null ? _legacyModule.StartEnumTypeInstancesByName(name, flags, appDomain, handle) : HResults.E_NOTIMPL; int IXCLRDataModule.EnumTypeInstanceByName(ulong* handle, /*IXCLRDataTypeInstance*/ void** type) => _legacyModule is not null ? _legacyModule.EnumTypeInstanceByName(handle, type) : HResults.E_NOTIMPL; @@ -105,7 +105,7 @@ int IXCLRDataModule.EnumMethodDefinitionByName(ulong* handle, /*IXCLRDataMethodD int IXCLRDataModule.EndEnumMethodDefinitionsByName(ulong handle) => _legacyModule is not null ? _legacyModule.EndEnumMethodDefinitionsByName(handle) : HResults.E_NOTIMPL; - int IXCLRDataModule.StartEnumMethodInstancesByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, ulong* handle) + int IXCLRDataModule.StartEnumMethodInstancesByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle) => _legacyModule is not null ? _legacyModule.StartEnumMethodInstancesByName(name, flags, appDomain, handle) : HResults.E_NOTIMPL; int IXCLRDataModule.EnumMethodInstanceByName(ulong* handle, out IXCLRDataMethodInstance? method) { @@ -118,7 +118,7 @@ int IXCLRDataModule.EndEnumMethodInstancesByName(ulong handle) int IXCLRDataModule.GetMethodDefinitionByToken(/*mdMethodDef*/ uint token, /*IXCLRDataMethodDefinition*/ void** methodDefinition) => _legacyModule is not null ? _legacyModule.GetMethodDefinitionByToken(token, methodDefinition) : HResults.E_NOTIMPL; - int IXCLRDataModule.StartEnumDataByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, /*IXCLRDataTask*/ void* tlsTask, ulong* handle) + int IXCLRDataModule.StartEnumDataByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, /*IXCLRDataTask*/ void* tlsTask, ulong* handle) => _legacyModule is not null ? _legacyModule.StartEnumDataByName(name, flags, appDomain, tlsTask, handle) : HResults.E_NOTIMPL; int IXCLRDataModule.EnumDataByName(ulong* handle, /*IXCLRDataValue*/ void** value) => _legacyModule is not null ? _legacyModule.EnumDataByName(handle, value) : HResults.E_NOTIMPL; @@ -415,7 +415,7 @@ private int DacPrivateRequestGetModuleData(uint inBufferSize, byte* inBuffer, ui int IXCLRDataModule.StartEnumAppDomains(ulong* handle) => _legacyModule is not null ? _legacyModule.StartEnumAppDomains(handle) : HResults.E_NOTIMPL; - int IXCLRDataModule.EnumAppDomain(ulong* handle, IXCLRDataAppDomain** appDomain) + int IXCLRDataModule.EnumAppDomain(ulong* handle, /*IXCLRDataAppDomain*/ void** appDomain) => _legacyModule is not null ? _legacyModule.EnumAppDomain(handle, appDomain) : HResults.E_NOTIMPL; int IXCLRDataModule.EndEnumAppDomains(ulong handle) => _legacyModule is not null ? _legacyModule.EndEnumAppDomains(handle) : HResults.E_NOTIMPL; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs index 43cb9db11c9d51..b8ab8b5a921183 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs @@ -48,7 +48,7 @@ public unsafe partial interface IXCLRDataModule int EndEnumTypeDefinitions(ulong handle); [PreserveSig] - int StartEnumTypeInstances(IXCLRDataAppDomain* appDomain, ulong* handle); + int StartEnumTypeInstances(/*IXCLRDataAppDomain*/ void* appDomain, ulong* handle); [PreserveSig] int EnumTypeInstance(ulong* handle, /*IXCLRDataTypeInstance*/ void** typeInstance); [PreserveSig] @@ -62,7 +62,7 @@ public unsafe partial interface IXCLRDataModule int EndEnumTypeDefinitionsByName(ulong handle); [PreserveSig] - int StartEnumTypeInstancesByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, ulong* handle); + int StartEnumTypeInstancesByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle); [PreserveSig] int EnumTypeInstanceByName(ulong* handle, /*IXCLRDataTypeInstance*/ void** type); [PreserveSig] @@ -79,7 +79,7 @@ public unsafe partial interface IXCLRDataModule int EndEnumMethodDefinitionsByName(ulong handle); [PreserveSig] - int StartEnumMethodInstancesByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, ulong* handle); + int StartEnumMethodInstancesByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle); [PreserveSig] int EnumMethodInstanceByName(ulong* handle, out IXCLRDataMethodInstance? method); [PreserveSig] @@ -89,7 +89,7 @@ public unsafe partial interface IXCLRDataModule int GetMethodDefinitionByToken(/*mdMethodDef*/ uint token, /*IXCLRDataMethodDefinition*/ void** methodDefinition); [PreserveSig] - int StartEnumDataByName(char* name, uint flags, IXCLRDataAppDomain* appDomain, /*IXCLRDataTask*/ void* tlsTask, ulong* handle); + int StartEnumDataByName(char* name, uint flags, /*IXCLRDataAppDomain*/ void* appDomain, /*IXCLRDataTask*/ void* tlsTask, ulong* handle); [PreserveSig] int EnumDataByName(ulong* handle, /*IXCLRDataValue*/ void** value); [PreserveSig] @@ -119,7 +119,7 @@ public unsafe partial interface IXCLRDataModule [PreserveSig] int StartEnumAppDomains(ulong* handle); [PreserveSig] - int EnumAppDomain(ulong* handle, IXCLRDataAppDomain** appDomain); + int EnumAppDomain(ulong* handle, /*IXCLRDataAppDomain*/ void** appDomain); [PreserveSig] int EndEnumAppDomains(ulong handle); @@ -183,11 +183,11 @@ int GetRuntimeNameByAddress( [PreserveSig] int StartEnumAppDomains(ulong* handle); [PreserveSig] - int EnumAppDomain(ulong* handle, IXCLRDataAppDomain** appDomain); + int EnumAppDomain(ulong* handle, /*IXCLRDataAppDomain*/ void** appDomain); [PreserveSig] int EndEnumAppDomains(ulong handle); [PreserveSig] - int GetAppDomainByUniqueID(ulong id, IXCLRDataAppDomain** appDomain); + int GetAppDomainByUniqueID(ulong id, /*IXCLRDataAppDomain*/ void** appDomain); [PreserveSig] int StartEnumAssemblies(ulong* handle); @@ -206,7 +206,7 @@ int GetRuntimeNameByAddress( int GetModuleByAddress(ClrDataAddress address, /*IXCLRDataModule*/ void** mod); [PreserveSig] - int StartEnumMethodInstancesByAddress(ClrDataAddress address, IXCLRDataAppDomain* appDomain, ulong* handle); + int StartEnumMethodInstancesByAddress(ClrDataAddress address, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle); [PreserveSig] int EnumMethodInstanceByAddress(ulong* handle, out IXCLRDataMethodInstance? method); [PreserveSig] @@ -216,7 +216,7 @@ int GetRuntimeNameByAddress( int GetDataByAddress( ClrDataAddress address, uint flags, - IXCLRDataAppDomain* appDomain, + /*IXCLRDataAppDomain*/ void* appDomain, /*IXCLRDataTask*/ void* tlsTask, uint bufLen, uint* nameLen, @@ -234,7 +234,7 @@ int GetDataByAddress( [PreserveSig] int CreateMemoryValue( - IXCLRDataAppDomain* appDomain, + /*IXCLRDataAppDomain*/ void* appDomain, /*IXCLRDataTask*/ void* tlsTask, /*IXCLRDataTypeInstance*/ void* type, ClrDataAddress addr, @@ -587,7 +587,7 @@ int Request( public unsafe partial interface IXCLRDataAppDomain { [PreserveSig] - int GetProcess(IXCLRDataProcess** process); + int GetProcess(/*IXCLRDataProcess*/ void** process); [PreserveSig] int GetName(uint bufLen, uint* nameLen, char* name); [PreserveSig] diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs index a1a6949f5162f4..6fa6cbe173ec1a 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs @@ -106,13 +106,13 @@ int IXCLRDataProcess.GetRuntimeNameByAddress( int IXCLRDataProcess.StartEnumAppDomains(ulong* handle) => _legacyProcess is not null ? _legacyProcess.StartEnumAppDomains(handle) : HResults.E_NOTIMPL; - int IXCLRDataProcess.EnumAppDomain(ulong* handle, IXCLRDataAppDomain** appDomain) + int IXCLRDataProcess.EnumAppDomain(ulong* handle, /*IXCLRDataAppDomain*/ void** appDomain) => _legacyProcess is not null ? _legacyProcess.EnumAppDomain(handle, appDomain) : HResults.E_NOTIMPL; int IXCLRDataProcess.EndEnumAppDomains(ulong handle) => _legacyProcess is not null ? _legacyProcess.EndEnumAppDomains(handle) : HResults.E_NOTIMPL; - int IXCLRDataProcess.GetAppDomainByUniqueID(ulong id, IXCLRDataAppDomain** appDomain) + int IXCLRDataProcess.GetAppDomainByUniqueID(ulong id, /*IXCLRDataAppDomain*/ void** appDomain) => _legacyProcess is not null ? _legacyProcess.GetAppDomainByUniqueID(id, appDomain) : HResults.E_NOTIMPL; int IXCLRDataProcess.StartEnumAssemblies(ulong* handle) @@ -329,7 +329,7 @@ private bool HasMethodInstantiation(MethodDescHandle md) } } - int IXCLRDataProcess.StartEnumMethodInstancesByAddress(ClrDataAddress address, IXCLRDataAppDomain* appDomain, ulong* handle) + int IXCLRDataProcess.StartEnumMethodInstancesByAddress(ClrDataAddress address, /*IXCLRDataAppDomain*/ void* appDomain, ulong* handle) { int hr = HResults.S_FALSE; *handle = 0; @@ -449,7 +449,7 @@ int IXCLRDataProcess.EndEnumMethodInstancesByAddress(ulong handle) int IXCLRDataProcess.GetDataByAddress( ClrDataAddress address, uint flags, - IXCLRDataAppDomain* appDomain, + /*IXCLRDataAppDomain*/ void* appDomain, /*IXCLRDataTask*/ void* tlsTask, uint bufLen, uint* nameLen, @@ -468,7 +468,7 @@ int IXCLRDataProcess.Request(uint reqCode, uint inBufferSize, byte* inBuffer, ui => _legacyProcess is not null ? _legacyProcess.Request(reqCode, inBufferSize, inBuffer, outBufferSize, outBuffer) : HResults.E_NOTIMPL; int IXCLRDataProcess.CreateMemoryValue( - IXCLRDataAppDomain* appDomain, + /*IXCLRDataAppDomain*/ void* appDomain, /*IXCLRDataTask*/ void* tlsTask, /*IXCLRDataTypeInstance*/ void* type, ClrDataAddress addr,