ディスクの場所から PE ファイルを読み取るときに、RVA (pdb ファイルから取得した相対仮想アドレス) を PE ファイル (EXE) オフセットにマップする必要があります。このために、RVA をファイル オフセットに変換して、その場所から GUIDS(CLSID、IID) を読み取ることができるようにする必要があります。
よろしくウスマン
ディスクの場所から PE ファイルを読み取るときに、RVA (pdb ファイルから取得した相対仮想アドレス) を PE ファイル (EXE) オフセットにマップする必要があります。このために、RVA をファイル オフセットに変換して、その場所から GUIDS(CLSID、IID) を読み取ることができるようにする必要があります。
よろしくウスマン
template <class T> LPVOID GetPtrFromRVA(
DWORD rva,
T* pNTHeader,
PBYTE imageBase ) // 'T' = PIMAGE_NT_HEADERS
{
PIMAGE_SECTION_HEADER pSectionHdr;
INT delta;
pSectionHdr = GetEnclosingSectionHeader( rva, pNTHeader);
if ( !pSectionHdr )
return 0;
delta = (INT)(pSectionHdr->VirtualAddress-pSectionHdr->PointerToRawData);
return (PVOID) ( imageBase + rva - delta );
}
template <class T> PIMAGE_SECTION_HEADER GetEnclosingSectionHeader(
DWORD rva,
T* pNTHeader) // 'T' == PIMAGE_NT_HEADERS
{
PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(pNTHeader);
unsigned i;
for ( i=0; i < pNTHeader->FileHeader.NumberOfSections; i++, section++ )
{
// This 3 line idiocy is because Watcom's linker actually sets the
// Misc.VirtualSize field to 0. (!!! - Retards....!!!)
DWORD size = section->Misc.VirtualSize;
if ( 0 == size )
size = section->SizeOfRawData;
// Is the RVA within this section?
if ( (rva >= section->VirtualAddress) &&
(rva < (section->VirtualAddress + size)))
return section;
}
return 0;
}
トリックを行う必要があります...
ImageRvaToVa関数を使用できます。