diff --git a/src/coreclr/debug/daccess/dacimpl.h b/src/coreclr/debug/daccess/dacimpl.h index 92f7081d32033b..5f1f5725a5b1c4 100644 --- a/src/coreclr/debug/daccess/dacimpl.h +++ b/src/coreclr/debug/daccess/dacimpl.h @@ -1088,8 +1088,8 @@ class ClrDataAccess virtual HRESULT STDMETHODCALLTYPE GetModuleData(CLRDATA_ADDRESS moduleAddr, struct DacpModuleData *data); virtual HRESULT STDMETHODCALLTYPE TraverseModuleMap(ModuleMapType mmt, CLRDATA_ADDRESS moduleAddr, MODULEMAPTRAVERSE pCallback, LPVOID token); virtual HRESULT STDMETHODCALLTYPE GetMethodDescFromToken(CLRDATA_ADDRESS moduleAddr, mdToken token, CLRDATA_ADDRESS *methodDesc); - virtual HRESULT STDMETHODCALLTYPE GetPEFileBase(CLRDATA_ADDRESS addr, CLRDATA_ADDRESS *base); - virtual HRESULT STDMETHODCALLTYPE GetPEFileName(CLRDATA_ADDRESS addr, unsigned int count, _Inout_updates_z_(count) WCHAR *fileName, unsigned int *pNeeded); + virtual HRESULT STDMETHODCALLTYPE GetPEFileBase(CLRDATA_ADDRESS moduleAddr, CLRDATA_ADDRESS *base); + virtual HRESULT STDMETHODCALLTYPE GetPEFileName(CLRDATA_ADDRESS moduleAddr, unsigned int count, _Inout_updates_z_(count) WCHAR *fileName, unsigned int *pNeeded); virtual HRESULT STDMETHODCALLTYPE GetAssemblyModuleList(CLRDATA_ADDRESS assembly, unsigned int count, CLRDATA_ADDRESS modules[], unsigned int *pNeeded); virtual HRESULT STDMETHODCALLTYPE GetGCHeapData(struct DacpGcHeapData *data); virtual HRESULT STDMETHODCALLTYPE GetGCHeapList(unsigned int count, CLRDATA_ADDRESS heaps[], unsigned int *pNeeded); diff --git a/src/coreclr/debug/daccess/request.cpp b/src/coreclr/debug/daccess/request.cpp index 2c843d1118dd9c..6458792e859c2c 100644 --- a/src/coreclr/debug/daccess/request.cpp +++ b/src/coreclr/debug/daccess/request.cpp @@ -1722,11 +1722,11 @@ ClrDataAccess::GetModuleData(CLRDATA_ADDRESS addr, struct DacpModuleData *Module ZeroMemory(ModuleData,sizeof(DacpModuleData)); ModuleData->Address = addr; - ModuleData->PEAssembly = HOST_CDADDR(pModule->GetPEAssembly()); + ModuleData->PEAssembly = addr; // Module address in .NET 9+ - correspondingly, SOS-DAC APIs for PE assemblies expect a module address COUNT_T metadataSize = 0; if (!pModule->GetPEAssembly()->IsDynamic()) { - ModuleData->ilBase = (CLRDATA_ADDRESS)(ULONG_PTR) pModule->GetPEAssembly()->GetIJWBase(); + ModuleData->ilBase = TO_CDADDR(dac_cast(pModule->GetPEAssembly()->GetLoadedLayout()->GetBase())); } ModuleData->metadataStart = (CLRDATA_ADDRESS)dac_cast(pModule->GetPEAssembly()->GetLoadedMetadata(&metadataSize)); @@ -2125,13 +2125,14 @@ ClrDataAccess::GetFrameName(CLRDATA_ADDRESS vtable, unsigned int count, _Inout_u } HRESULT -ClrDataAccess::GetPEFileName(CLRDATA_ADDRESS addr, unsigned int count, _Inout_updates_z_(count) WCHAR *fileName, unsigned int *pNeeded) +ClrDataAccess::GetPEFileName(CLRDATA_ADDRESS moduleAddr, unsigned int count, _Inout_updates_z_(count) WCHAR *fileName, unsigned int *pNeeded) { - if (addr == 0 || (fileName == NULL && pNeeded == NULL) || (fileName != NULL && count == 0)) + if (moduleAddr == 0 || (fileName == NULL && pNeeded == NULL) || (fileName != NULL && count == 0)) return E_INVALIDARG; SOSDacEnter(); - PEAssembly* pPEAssembly = PTR_PEAssembly(TO_TADDR(addr)); + PTR_Module pModule = PTR_Module(TO_TADDR(moduleAddr)); + PEAssembly* pPEAssembly = pModule->GetPEAssembly(); // Turn from bytes to wide characters if (!pPEAssembly->GetPath().IsEmpty()) @@ -2182,20 +2183,25 @@ ClrDataAccess::GetPEFileName(CLRDATA_ADDRESS addr, unsigned int count, _Inout_up } HRESULT -ClrDataAccess::GetPEFileBase(CLRDATA_ADDRESS addr, CLRDATA_ADDRESS *base) +ClrDataAccess::GetPEFileBase(CLRDATA_ADDRESS moduleAddr, CLRDATA_ADDRESS *base) { - if (addr == 0 || base == NULL) + if (moduleAddr == 0 || base == NULL) return E_INVALIDARG; SOSDacEnter(); - PEAssembly* pPEAssembly = PTR_PEAssembly(TO_TADDR(addr)); + PTR_Module pModule = PTR_Module(TO_TADDR(moduleAddr)); + PEAssembly* pPEAssembly = pModule->GetPEAssembly(); // More fields later? if (!pPEAssembly->IsDynamic()) - *base = TO_CDADDR(pPEAssembly->GetIJWBase()); + { + *base = TO_CDADDR(dac_cast(pPEAssembly->GetLoadedLayout()->GetBase())); + } else + { *base = (CLRDATA_ADDRESS)NULL; + } SOSDacLeave(); return hr; diff --git a/src/coreclr/debug/daccess/task.cpp b/src/coreclr/debug/daccess/task.cpp index d878fae66897fe..d94bf04a9d8998 100644 --- a/src/coreclr/debug/daccess/task.cpp +++ b/src/coreclr/debug/daccess/task.cpp @@ -2705,7 +2705,7 @@ ClrDataModule::RequestGetModuleData( Module* pModule = GetModule(); PEAssembly *pPEAssembly = pModule->GetPEAssembly(); - outGMD->PEAssembly = TO_CDADDR(PTR_HOST_TO_TADDR(pPEAssembly)); + outGMD->PEAssembly = TO_CDADDR(PTR_HOST_TO_TADDR(pModule)); outGMD->IsDynamic = pModule->IsReflection(); if (pPEAssembly != NULL) diff --git a/src/coreclr/inc/dacprivate.h b/src/coreclr/inc/dacprivate.h index ae91e940ce22fd..3e96334430da5c 100644 --- a/src/coreclr/inc/dacprivate.h +++ b/src/coreclr/inc/dacprivate.h @@ -230,7 +230,7 @@ struct MSLAYOUT DacpThreadLocalModuleData struct MSLAYOUT DacpModuleData { CLRDATA_ADDRESS Address = 0; - CLRDATA_ADDRESS PEAssembly = 0; // A PEAssembly addr + CLRDATA_ADDRESS PEAssembly = 0; // Actually the module address in .NET 9+ CLRDATA_ADDRESS ilBase = 0; CLRDATA_ADDRESS metadataStart = 0; ULONG64 metadataSize = 0; @@ -986,7 +986,7 @@ struct MSLAYOUT DacpGetModuleData BOOL IsDynamic = FALSE; BOOL IsInMemory = FALSE; BOOL IsFileLayout = FALSE; - CLRDATA_ADDRESS PEAssembly = 0; + CLRDATA_ADDRESS PEAssembly = 0; // Actually the module address in .NET 9+ CLRDATA_ADDRESS LoadedPEAddress = 0; ULONG64 LoadedPESize = 0; CLRDATA_ADDRESS InMemoryPdbAddress = 0;