DWORD ZapVirtualSectionsTable::GetSize() { DWORD nSectionInfos = 0; COUNT_T nPhysicalSections = m_pImage->GetPhysicalSectionCount(); for (COUNT_T iPhysicalSection = 0; iPhysicalSection < nPhysicalSections; iPhysicalSection++) { ZapPhysicalSection * pPhysicalSection = m_pImage->GetPhysicalSection(iPhysicalSection); DWORD dwPreviousType = 0; COUNT_T nVirtualSections = pPhysicalSection->GetVirtualSectionCount(); for (COUNT_T iVirtualSection = 0; iVirtualSection < nVirtualSections; iVirtualSection++) { ZapVirtualSection * pVirtualSection = pPhysicalSection->GetVirtualSection(iVirtualSection); if (pVirtualSection->GetNodeCount() == 0) continue; DWORD dwSectionType = pVirtualSection->GetSectionType(); if (dwSectionType == 0) continue; // Fold sections with the same type together if (dwPreviousType != dwSectionType) { dwPreviousType = dwSectionType; nSectionInfos++; } } } return nSectionInfos * sizeof(CORCOMPILE_VIRTUAL_SECTION_INFO); }
void ZapDebugDirectory::SaveNGenDebugDirectoryEntry(ZapWriter *pZapWriter) { #if !defined(NO_NGENPDB) _ASSERTE(pZapWriter); IMAGE_DEBUG_DIRECTORY debugDirectory = {0}; if (m_nDebugDirectory > 0) { memcpy(&debugDirectory, m_pDebugDirectory, sizeof(IMAGE_DEBUG_DIRECTORY)); } debugDirectory.Type = IMAGE_DEBUG_TYPE_CODEVIEW; debugDirectory.SizeOfData = m_pNGenPdbDebugData->GetSize(); debugDirectory.AddressOfRawData = m_pNGenPdbDebugData->GetRVA(); // Make sure the "is portable pdb" indicator (MinorVersion == 0x504d) is clear // for the NGen debug directory entry since this debug directory is copied // from an existing entry which could be a portable pdb. debugDirectory.MinorVersion = 0; { ZapPhysicalSection *pPhysicalSection = ZapImage::GetImage(pZapWriter)->m_pTextSection; DWORD dwOffset = m_pNGenPdbDebugData->GetRVA() - pPhysicalSection->GetRVA(); _ASSERTE(dwOffset < pPhysicalSection->GetSize()); debugDirectory.PointerToRawData = pPhysicalSection->GetFilePos() + dwOffset; } pZapWriter->Write(&debugDirectory, sizeof(debugDirectory)); #endif // NO_NGENPDB }
void ZapDebugDirectory::SaveOriginalDebugDirectoryEntry(ZapWriter *pZapWriter) { if (m_ppDebugData != nullptr) { for (DWORD i = 0; i < m_nDebugDirectory; i++) { if (m_ppDebugData[i] != nullptr) { m_pDebugDirectory[i].SizeOfData = m_ppDebugData[i]->GetSize(); m_pDebugDirectory[i].AddressOfRawData = m_ppDebugData[i]->GetRVA(); // Compute the absolute file (seek) pointer. We need to reach to the matching physical section to do that. ZapPhysicalSection * pPhysicalSection = ZapImage::GetImage(pZapWriter)->m_pTextSection; DWORD dwOffset = m_ppDebugData[i]->GetRVA() - pPhysicalSection->GetRVA(); _ASSERTE(dwOffset < pPhysicalSection->GetSize()); m_pDebugDirectory[i].PointerToRawData = pPhysicalSection->GetFilePos() + dwOffset; } else { m_pDebugDirectory[i].SizeOfData = 0; m_pDebugDirectory[i].AddressOfRawData = 0; m_pDebugDirectory[i].PointerToRawData = 0; } } pZapWriter->Write(m_pDebugDirectory, sizeof(IMAGE_DEBUG_DIRECTORY) * m_nDebugDirectory); } }
void ZapDebugDirectory::SaveNGenDebugDirectoryEntry(ZapWriter *pZapWriter) { _ASSERTE(pZapWriter); IMAGE_DEBUG_DIRECTORY debugDirectory = {0}; memcpy(&debugDirectory, &m_debugDirectory, sizeof(IMAGE_DEBUG_DIRECTORY)); debugDirectory.Type = IMAGE_DEBUG_TYPE_CODEVIEW; debugDirectory.SizeOfData = m_pNGenPdbDebugData->GetSize(); debugDirectory.AddressOfRawData = m_pNGenPdbDebugData->GetRVA(); { ZapPhysicalSection *pPhysicalSection = ZapImage::GetImage(pZapWriter)->m_pTextSection; DWORD dwOffset = m_pNGenPdbDebugData->GetRVA() - pPhysicalSection->GetRVA(); _ASSERTE(dwOffset < pPhysicalSection->GetSize()); debugDirectory.PointerToRawData = pPhysicalSection->GetFilePos() + dwOffset; } pZapWriter->Write(&debugDirectory, sizeof(debugDirectory)); }
void ZapDebugDirectory::SaveOriginalDebugDirectoryEntry(ZapWriter *pZapWriter) { if (m_pDebugData != NULL) { m_debugDirectory.SizeOfData = m_pDebugData->GetSize(); m_debugDirectory.AddressOfRawData = m_pDebugData->GetRVA(); // Compute the absolute file (seek) pointer. We need to reach to the matching physical section to do that. ZapPhysicalSection * pPhysicalSection = ZapImage::GetImage(pZapWriter)->m_pTextSection; DWORD dwOffset = m_pDebugData->GetRVA() - pPhysicalSection->GetRVA(); _ASSERTE(dwOffset < pPhysicalSection->GetSize()); m_debugDirectory.PointerToRawData = pPhysicalSection->GetFilePos() + dwOffset; pZapWriter->Write(&m_debugDirectory, sizeof(m_debugDirectory)); } }
void ZapVirtualSectionsTable::Save(ZapWriter * pZapWriter) { COUNT_T nPhysicalSections = m_pImage->GetPhysicalSectionCount(); for (COUNT_T iPhysicalSection = 0; iPhysicalSection < nPhysicalSections; iPhysicalSection++) { ZapPhysicalSection * pPhysicalSection = m_pImage->GetPhysicalSection(iPhysicalSection); CORCOMPILE_VIRTUAL_SECTION_INFO sectionInfo; sectionInfo.SectionType = 0; COUNT_T nVirtualSections = pPhysicalSection->GetVirtualSectionCount(); for (COUNT_T iVirtualSection = 0; iVirtualSection < nVirtualSections; iVirtualSection++) { ZapVirtualSection * pVirtualSection = pPhysicalSection->GetVirtualSection(iVirtualSection); if (pVirtualSection->GetNodeCount() == 0) continue; DWORD dwSectionType = pVirtualSection->GetSectionType(); if (dwSectionType == 0) continue; // Fold sections with the same type together if (sectionInfo.SectionType != dwSectionType) { if (sectionInfo.SectionType != 0) { pZapWriter->Write(§ionInfo, sizeof(sectionInfo)); } sectionInfo.SectionType = dwSectionType; sectionInfo.VirtualAddress = pVirtualSection->GetRVA(); } // Update section size sectionInfo.Size = (pVirtualSection->GetRVA() + pVirtualSection->GetSize()) - sectionInfo.VirtualAddress; } if (sectionInfo.SectionType != 0) { pZapWriter->Write(§ionInfo, sizeof(sectionInfo)); } } }