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 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)); } } }