Files
Work/image/IMPORT.CPP
2024-08-07 09:16:27 -04:00

49 lines
1.9 KiB
C++

#include <image/import.hpp>
void ImageImportDescriptor::loadImageImportThunks(DWORD deltaOffset,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders)
{
if(!isOkay())return;
if(!firstThunkRVA()&&!originalFirstThunkRVA())return;
if(originalFirstThunkRVA())loadImageImportThunk(originalFirstThunkRVA(),deltaOffset,
imageOriginalThunkImportOrdinals(),imageOriginalThunkImportNames(),pureView,imageSectionHeaders);
else if(firstThunkRVA())loadImageImportThunk(firstThunkRVA(),deltaOffset,
imageThunkImportOrdinals(),imageThunkImportNames(),pureView,imageSectionHeaders);
}
void ImageImportDescriptor::loadImageFirstThunk(DWORD deltaOffset,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders)
{
if(!isOkay()||!firstThunkRVA())return;
loadImageImportThunk(firstThunkRVA(),deltaOffset,
imageThunkImportOrdinals(),imageThunkImportNames(),pureView,imageSectionHeaders);
}
void ImageImportDescriptor::loadImageImportThunk(DWORD virtualAddress,DWORD deltaOffset,Block<ImageThunkData> &imageThunkImportOrdinals,Block<ImageThunkName> &imageThunkImportNames,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders)
{
ImageSectionHeader imageSectionHeader;
imageThunkImportOrdinals.remove();
imageThunkImportNames.remove();
pureView.push();
pureView.seek(virtualAddress-deltaOffset,PureViewOfFile::SeekSet);
while(TRUE)
{
ImageThunkData imageThunkData;
imageThunkData<<pureView;
if(!imageThunkData.isOkay())break;
if(imageThunkData.isOrdinalImport())imageThunkImportOrdinals.insert(&imageThunkData);
else
{
ImageThunkName imageThunkName;
pureView.push();
imageSectionHeaders.enclosingSectionHeader(imageThunkData.addressOfDataRVA(),imageSectionHeader,deltaOffset);
pureView.seek(imageThunkData.addressOfDataRVA()-deltaOffset,PureViewOfFile::SeekSet);
imageThunkName<<pureView;
imageThunkImportNames.insert(&imageThunkName);
pureView.pop();
}
}
pureView.pop();
}