//================================================================ static DWORD RVA2Offset(DWORD dwRVA) { PIMAGE_SECTION_HEADER pSec; pSec = RVA2Section(dwRVA);//ImageRvaToSection(pimage_nt_headers,Base,dwRVA); if(pSec == NULL) { return 0; } return (dwRVA + (pSec->PointerToRawData) - (pSec->VirtualAddress)); }
void* CoffLoader::RVA2Data(unsigned long RVA) { int Sctn = RVA2Section(RVA); if( RVA < SectionHeader[Sctn].VirtualAddress || RVA >= SectionHeader[Sctn].VirtualAddress + SectionHeader[Sctn].VirtualSize) { // RVA2Section is lying, let's use base address of dll instead, only works if // DLL has been loaded fully into memory, wich we normally do return (void*)(RVA + (unsigned long)hModule); } return SectionData[Sctn] + RVA - SectionHeader[Sctn].VirtualAddress; }