From 72049c35aa9b83662596256ed61af2b66562b4c6 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Mon, 14 Jul 2025 11:57:51 -0700 Subject: [PATCH 1/3] adding GetAppDomainStoreData cDAC API --- .../Legacy/ISOSDacInterface.cs | 6 ++++ .../Legacy/SOSDacImpl.cs | 29 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs index 73eb5aa3c24c5d..caa5328e83bef5 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs @@ -24,6 +24,12 @@ internal struct DacpThreadStoreData public int fHostConfig; // Uses hosting flags defined above }; +internal struct DacpAppDomainStoreData +{ + public ClrDataAddress sharedDomain; + public ClrDataAddress systemDomain; + public ulong DomainCount; +}; internal struct DacpThreadData { public int corThreadId; diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs index 4a07701f68daa1..62362db7853f64 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs @@ -117,7 +117,34 @@ int ISOSDacInterface.GetAppDomainList(uint count, [In, MarshalUsing(CountElement int ISOSDacInterface.GetAppDomainName(ClrDataAddress addr, uint count, char* name, uint* pNeeded) => _legacyImpl is not null ? _legacyImpl.GetAppDomainName(addr, count, name, pNeeded) : HResults.E_NOTIMPL; int ISOSDacInterface.GetAppDomainStoreData(void* data) - => _legacyImpl is not null ? _legacyImpl.GetAppDomainStoreData(data) : HResults.E_NOTIMPL; + { + DacpAppDomainStoreData* appDomainStoreData = (DacpAppDomainStoreData*)data; + try + { + appDomainStoreData->sharedDomain = 0; + TargetPointer systemDomainPtr = _target.ReadGlobalPointer(Constants.Globals.SystemDomain); + appDomainStoreData->systemDomain = _target.ReadPointer(systemDomainPtr).ToClrDataAddress(_target); + appDomainStoreData->DomainCount = (ulong)(_target.ReadPointer(_target.ReadGlobalPointer(Constants.Globals.AppDomain)) != 0 ? 1 : 0); + } + catch (System.Exception ex) + { + return ex.HResult; + } +#if DEBUG + { + if (_legacyImpl is not null) + { + DacpAppDomainStoreData legacyData = default; + int hrLocal = _legacyImpl.GetAppDomainStoreData(&legacyData); + Debug.Assert(hrLocal == HResults.S_OK, $"cDAC: {HResults.S_OK:x}, DAC: {hrLocal:x}"); + Debug.Assert(appDomainStoreData->sharedDomain == legacyData.sharedDomain, $"cDAC: {appDomainStoreData->sharedDomain:x}, DAC: {legacyData.sharedDomain:x}"); + Debug.Assert(appDomainStoreData->systemDomain == legacyData.systemDomain, $"cDAC: {appDomainStoreData->systemDomain:x}, DAC: {legacyData.systemDomain:x}"); + Debug.Assert(appDomainStoreData->DomainCount == legacyData.DomainCount, $"cDAC: {appDomainStoreData->DomainCount}, DAC: {legacyData.DomainCount}"); + } + } +#endif + return HResults.S_OK; + } int ISOSDacInterface.GetApplicationBase(ClrDataAddress appDomain, int count, char* appBase, uint* pNeeded) { // Method is not supported on CoreCLR From 3e4d128a0336d63e08990aef57e70ec4ce2f6bf1 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Wed, 16 Jul 2025 08:40:57 -0700 Subject: [PATCH 2/3] renaming, restructuring and changing struct layout --- .../Legacy/ISOSDacInterface.cs | 2 +- .../Legacy/SOSDacImpl.cs | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs index caa5328e83bef5..13499379e9ef75 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/ISOSDacInterface.cs @@ -28,7 +28,7 @@ internal struct DacpAppDomainStoreData { public ClrDataAddress sharedDomain; public ClrDataAddress systemDomain; - public ulong DomainCount; + public int DomainCount; }; internal struct DacpThreadData { diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs index 62362db7853f64..650ba518a06276 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs @@ -119,31 +119,33 @@ int ISOSDacInterface.GetAppDomainName(ClrDataAddress addr, uint count, char* nam int ISOSDacInterface.GetAppDomainStoreData(void* data) { DacpAppDomainStoreData* appDomainStoreData = (DacpAppDomainStoreData*)data; + int hr = HResults.S_OK; try { appDomainStoreData->sharedDomain = 0; TargetPointer systemDomainPtr = _target.ReadGlobalPointer(Constants.Globals.SystemDomain); appDomainStoreData->systemDomain = _target.ReadPointer(systemDomainPtr).ToClrDataAddress(_target); - appDomainStoreData->DomainCount = (ulong)(_target.ReadPointer(_target.ReadGlobalPointer(Constants.Globals.AppDomain)) != 0 ? 1 : 0); + TargetPointer appDomainPtr = _target.ReadGlobalPointer(Constants.Globals.AppDomain); + appDomainStoreData->DomainCount = _target.ReadPointer(appDomainPtr) != 0 ? 1 : 0; } catch (System.Exception ex) { - return ex.HResult; + hr = ex.HResult; } #if DEBUG { if (_legacyImpl is not null) { - DacpAppDomainStoreData legacyData = default; - int hrLocal = _legacyImpl.GetAppDomainStoreData(&legacyData); + DacpAppDomainStoreData dataLocal = default; + int hrLocal = _legacyImpl.GetAppDomainStoreData(&dataLocal); Debug.Assert(hrLocal == HResults.S_OK, $"cDAC: {HResults.S_OK:x}, DAC: {hrLocal:x}"); - Debug.Assert(appDomainStoreData->sharedDomain == legacyData.sharedDomain, $"cDAC: {appDomainStoreData->sharedDomain:x}, DAC: {legacyData.sharedDomain:x}"); - Debug.Assert(appDomainStoreData->systemDomain == legacyData.systemDomain, $"cDAC: {appDomainStoreData->systemDomain:x}, DAC: {legacyData.systemDomain:x}"); - Debug.Assert(appDomainStoreData->DomainCount == legacyData.DomainCount, $"cDAC: {appDomainStoreData->DomainCount}, DAC: {legacyData.DomainCount}"); + Debug.Assert(appDomainStoreData->sharedDomain == dataLocal.sharedDomain, $"cDAC: {appDomainStoreData->sharedDomain:x}, DAC: {dataLocal.sharedDomain:x}"); + Debug.Assert(appDomainStoreData->systemDomain == dataLocal.systemDomain, $"cDAC: {appDomainStoreData->systemDomain:x}, DAC: {dataLocal.systemDomain:x}"); + Debug.Assert(appDomainStoreData->DomainCount == dataLocal.DomainCount, $"cDAC: {appDomainStoreData->DomainCount}, DAC: {dataLocal.DomainCount}"); } } #endif - return HResults.S_OK; + return hr; } int ISOSDacInterface.GetApplicationBase(ClrDataAddress appDomain, int count, char* appBase, uint* pNeeded) { From add577eec118460c32671ee40e500250557c5658 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Thu, 17 Jul 2025 16:42:30 -0700 Subject: [PATCH 3/3] validation --- .../managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs index 650ba518a06276..6c64863d574c45 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs @@ -138,7 +138,7 @@ int ISOSDacInterface.GetAppDomainStoreData(void* data) { DacpAppDomainStoreData dataLocal = default; int hrLocal = _legacyImpl.GetAppDomainStoreData(&dataLocal); - Debug.Assert(hrLocal == HResults.S_OK, $"cDAC: {HResults.S_OK:x}, DAC: {hrLocal:x}"); + Debug.Assert(hrLocal == hr, $"cDAC: {hr:x}, DAC: {hrLocal:x}"); Debug.Assert(appDomainStoreData->sharedDomain == dataLocal.sharedDomain, $"cDAC: {appDomainStoreData->sharedDomain:x}, DAC: {dataLocal.sharedDomain:x}"); Debug.Assert(appDomainStoreData->systemDomain == dataLocal.systemDomain, $"cDAC: {appDomainStoreData->systemDomain:x}, DAC: {dataLocal.systemDomain:x}"); Debug.Assert(appDomainStoreData->DomainCount == dataLocal.DomainCount, $"cDAC: {appDomainStoreData->DomainCount}, DAC: {dataLocal.DomainCount}");