BOOL PELoader::getVAforRVA(DWORD rva,void **ppva) { PIMAGE_SECTION_HEADER pSectionHeader; if (m_bIsPE32) { // Get the image header from the image, then get the directory location // of the COM+ header which may or may not be filled out. PIMAGE_NT_HEADERS32 pImageHeader; pImageHeader = (PIMAGE_NT_HEADERS32) Cor_RtlImageNtHeader(m_hMod, (ULONG) m_FileSize); PREFIX_ASSUME(pImageHeader != NULL); pSectionHeader = (PIMAGE_SECTION_HEADER) Cor_RtlImageRvaToVa32(pImageHeader, (PBYTE)m_hMod, rva, (DWORD)m_FileSizeAligned /* FileLength */); } else { PIMAGE_NT_HEADERS64 pImageHeader; pImageHeader = (PIMAGE_NT_HEADERS64) Cor_RtlImageNtHeader(m_hMod, (ULONG) m_FileSize); PREFIX_ASSUME(pImageHeader != NULL); pSectionHeader = (PIMAGE_SECTION_HEADER) Cor_RtlImageRvaToVa64(pImageHeader, (PBYTE)m_hMod, rva, (DWORD)m_FileSizeAligned /* FileLength */); } // If the section header exists, then return ok and the address. if (pSectionHeader) { *ppva = pSectionHeader; return TRUE; } // If there is no COM+ Data in this image, return false. else return FALSE; }
EXTERN_C PBYTE Cor_RtlImageRvaToVa(PTR_IMAGE_NT_HEADERS NtHeaders, PBYTE Base, ULONG Rva, ULONG FileLength) { LIMITED_METHOD_CONTRACT; if (NtHeaders->OptionalHeader.Magic == VAL16(IMAGE_NT_OPTIONAL_HDR32_MAGIC)) return Cor_RtlImageRvaToVa32((PTR_IMAGE_NT_HEADERS32)NtHeaders, Base, Rva, FileLength); else if(NtHeaders->OptionalHeader.Magic == VAL16(IMAGE_NT_OPTIONAL_HDR64_MAGIC)) return Cor_RtlImageRvaToVa64((PTR_IMAGE_NT_HEADERS64)NtHeaders, Base, Rva, FileLength); else { _ASSERTE(!"Invalid File Type"); return NULL; } }
EXTERN_C PBYTE Cor_RtlImageDirToVa(PTR_IMAGE_NT_HEADERS NtHeaders, PBYTE Base, UINT DirIndex, ULONG FileLength) { LIMITED_METHOD_CONTRACT; if (NtHeaders->OptionalHeader.Magic == VAL16(IMAGE_NT_OPTIONAL_HDR32_MAGIC)) return Cor_RtlImageRvaToVa32((PTR_IMAGE_NT_HEADERS32)NtHeaders, Base, VAL32(((PTR_IMAGE_NT_HEADERS32)NtHeaders)->OptionalHeader.DataDirectory[DirIndex].VirtualAddress), FileLength); else if(NtHeaders->OptionalHeader.Magic == VAL16(IMAGE_NT_OPTIONAL_HDR64_MAGIC)) return Cor_RtlImageRvaToVa64((PTR_IMAGE_NT_HEADERS64)NtHeaders, Base, VAL32(((PTR_IMAGE_NT_HEADERS64)NtHeaders)->OptionalHeader.DataDirectory[DirIndex].VirtualAddress), FileLength); else { _ASSERTE(!"Invalid File Type"); return NULL; } }
BOOL PELoader::getCOMHeader(IMAGE_COR20_HEADER **ppCorHeader) { PIMAGE_SECTION_HEADER pSectionHeader; if (m_bIsPE32) { PIMAGE_NT_HEADERS32 pImageHeader; // Get the image header from the image, then get the directory location // of the COM+ header which may or may not be filled out. pImageHeader = (PIMAGE_NT_HEADERS32)Cor_RtlImageNtHeader(m_hMod, (ULONG) m_FileSize); PREFIX_ASSUME(pImageHeader != NULL); pSectionHeader = (PIMAGE_SECTION_HEADER) Cor_RtlImageRvaToVa32(pImageHeader, (PBYTE)m_hMod, VAL32(pImageHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_COMHEADER].VirtualAddress), (DWORD)m_FileSizeAligned /* FileLength */); } else { PIMAGE_NT_HEADERS64 pImageHeader; // Get the image header from the image, then get the directory location // of the COM+ header which may or may not be filled out. pImageHeader = (PIMAGE_NT_HEADERS64)Cor_RtlImageNtHeader(m_hMod, (ULONG) m_FileSize); PREFIX_ASSUME(pImageHeader != NULL); pSectionHeader = (PIMAGE_SECTION_HEADER) Cor_RtlImageRvaToVa64(pImageHeader, (PBYTE)m_hMod, VAL32(pImageHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_COMHEADER].VirtualAddress), (DWORD)m_FileSizeAligned /* FileLength */); } // If the section header exists, then return ok and the address. if (pSectionHeader) { *ppCorHeader = (IMAGE_COR20_HEADER *) pSectionHeader; return TRUE; } // If there is no COM+ Data in this image, return false. else return FALSE; }