496 lines
18 KiB
Plaintext
496 lines
18 KiB
Plaintext
void loadImageImportThunks(DWORD deltaOffset,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders,ImageExportDescriptors &imageExportDescriptors);
|
|
|
|
|
|
void ImageImportDescriptor::loadImageImportThunk(DWORD virtualAddress,DWORD deltaOffset,Block<ImageThunkData> &imageThunkImportOrdinals,Block<ImageThunkName> &imageThunkImportNames,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders,ImageExportDescriptors &imageExportDescriptors)
|
|
{
|
|
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())
|
|
{
|
|
ImageExportDescriptor imageExportDescriptor;
|
|
ImageThunkName imageThunkName;
|
|
DWORD exportIndex;
|
|
if(imageExportDescriptors.locateImageExportOrdinal(imageThunkData.ordinal(),imageExportDescriptor,exportIndex))
|
|
{
|
|
imageThunkName.importName(imageExportDescriptor.imageExportName());
|
|
imageThunkImportNames.insert(&imageThunkName);
|
|
}
|
|
else 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();
|
|
}
|
|
|
|
|
|
|
|
void ImageImportDescriptor::loadImageImportThunks(DWORD deltaOffset,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders,ImageExportDescriptors &imageExportDescriptors)
|
|
{
|
|
if(!isOkay())return;
|
|
if(!firstThunkRVA()&&!originalFirstThunkRVA())return;
|
|
if(originalFirstThunkRVA())loadImageImportThunk(originalFirstThunkRVA(),deltaOffset,
|
|
imageOriginalThunkImportOrdinals(),imageOriginalThunkImportNames(),pureView,imageSectionHeaders,imageExportDescriptors);
|
|
else if(firstThunkRVA())loadImageImportThunk(firstThunkRVA(),deltaOffset,
|
|
imageThunkImportOrdinals(),imageThunkImportNames(),pureView,imageSectionHeaders,imageExportDescriptors);
|
|
}
|
|
|
|
|
|
WORD PEHeader::loadImageImportDescriptors(Block<ImageImportDescriptor> &imageImportDescriptors,ImageSectionHeader &importSectionHeader,ImageExportDescriptors &imageExportDescriptors,PureViewOfFile &pureView)
|
|
{
|
|
DirectoryEntryKey sectionKey(DirectoryEntryKey::ImportDirectory);
|
|
ImageDataDirectory imageSectionDirectory(((ImageOptionalHeader&)*this)[sectionKey]);
|
|
ImageImportDescriptor imageImportDescriptor;
|
|
ImageSectionHeader importNamesSectionHeader;
|
|
ImageSectionHeader exportSectionHeader;
|
|
DWORD deltaOffset;
|
|
DWORD deltaNames;
|
|
|
|
imageImportDescriptors.remove();
|
|
imageExportDescriptors.size(0);
|
|
if(!enclosingSectionHeader(imageSectionDirectory.virtualAddress(),importSectionHeader,deltaOffset))return FALSE;
|
|
pureView.seek(imageSectionDirectory.virtualAddress()-deltaOffset,PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
String moduleName;
|
|
imageImportDescriptor<<pureView;
|
|
if(!imageImportDescriptor.isOkay())break;
|
|
enclosingSectionHeader(imageImportDescriptor.nameRVA(),importNamesSectionHeader,deltaNames);
|
|
pureView.push();
|
|
pureView.seek(imageImportDescriptor.nameRVA()-deltaNames,PureViewOfFile::SeekSet);
|
|
pureView.getLine(moduleName);
|
|
loadImageExportDescriptors(imageExportDescriptors,exportSectionHeader,moduleName);
|
|
imageImportDescriptor.moduleName(moduleName);
|
|
pureView.pop();
|
|
imageImportDescriptor.loadImageImportThunks(deltaOffset,pureView,(ImageSectionHeaders&)*this,imageExportDescriptors);
|
|
imageImportDescriptors.insert(&imageImportDescriptor);
|
|
}
|
|
return imageImportDescriptors.size();
|
|
}
|
|
|
|
|
|
WORD loadImageImportDescriptors(Block<ImageImportDescriptor> &imageImportDescriptors,ImageSectionHeader &importSectionHeader,ImageExportDescriptors &imageExportDescriptors,PureViewOfFile &pureView);
|
|
|
|
// ::sprintf(entryPointString,"&0x%08lx",(DWORD)((PureVector<ImageExportDescriptor>&)*this)[functionIndex].imageExportEntryPoint());
|
|
|
|
void replaceImageImportOrdinals(Block<ImageImportDescriptor> &imageImportDescriptors,PureViewOfFile &pureView);
|
|
void PEHeader::replaceImageImportOrdinals(Block<ImageImportDescriptor> &imageImportDescriptors,PureViewOfFile &pureView)
|
|
{
|
|
ImageExportDescriptors imageExportDescriptors;
|
|
ImageExportDescriptor imageExportDescriptor;
|
|
ImageSectionHeader exportSectionHeader;
|
|
DWORD itemCount;
|
|
DWORD importModuleCount;
|
|
DWORD exportIndex;
|
|
|
|
if(!(importModuleCount=imageImportDescriptors.size()))return;
|
|
loadImageExportDescriptors(imageExportDescriptors,exportSectionHeader,pureView);
|
|
for(short importModuleIndex=0;importModuleIndex<importModuleCount;importModuleIndex++)
|
|
{
|
|
ImageImportDescriptor &imageImportDescriptor(imageImportDescriptors[importModuleIndex]);
|
|
itemCount=imageImportDescriptor.imageOriginalThunkImportOrdinals().size();
|
|
for(DWORD itemIndex=0;itemIndex<itemCount;itemIndex++)
|
|
{
|
|
ImageImportDescriptorExpand::ImageThunkDataBlock &imageThunkDataBlock(imageImportDescriptor.imageOriginalThunkImportOrdinals());
|
|
if(imageExportDescriptors.locateImageExportOrdinal(imageThunkDataBlock[itemIndex].ordinal(),imageExportDescriptor,exportIndex))
|
|
{
|
|
imageImportDescriptor.imageOriginalThunkImportNames().insert
|
|
}
|
|
}
|
|
itemCount=imageImportDescriptor.imageThunkImportOrdinals().size();
|
|
for(itemIndex=0;itemIndex<itemCount;itemIndex++)
|
|
{
|
|
ImageImportDescriptorExpand::ImageThunkDataBlock &imageThunkDataBlock(imageImportDescriptor.imageThunkImportOrdinals());
|
|
if(imageExportDescriptors.locateImageExportOrdinal(imageThunkDataBlock[itemIndex].ordinal(),imageExportDescriptor,exportIndex))
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ((PureVector<ImageExportDescriptor>&)*this)[(WORD)exportOrdinals[nameIndex]-1].imageExportName(exportNames[nameIndex]);
|
|
// ((PureVector<ImageExportDescriptor>&)*this)[(WORD)exportOrdinals[nameIndex]-1].imageExportOrdinal(exportOrdinals[nameIndex]);
|
|
|
|
WORD PEHeader::enclosingSectionHeader(DWORD virtualAddress,ImageSectionHeader &someImageSectionHeader,DWORD &deltaOffset)
|
|
{
|
|
DWORD sectionCount(((PureVector<ImageSectionHeader>&)*this).size());
|
|
|
|
for(short sectionIndex=0;sectionIndex<sectionCount;sectionIndex++)
|
|
{
|
|
ImageSectionHeader &imageSectionHeader(((PureVector<ImageSectionHeader>&)*this)[sectionIndex]);
|
|
if(virtualAddress>=imageSectionHeader.virtualAddress()&&
|
|
virtualAddress<imageSectionHeader.virtualAddress()+imageSectionHeader.virtualSize())
|
|
{
|
|
someImageSectionHeader=imageSectionHeader;
|
|
deltaOffset=imageSectionHeader.virtualAddress()-imageSectionHeader.pointerRawData();
|
|
return TRUE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
#if 0
|
|
WORD PEHeader::loadImageImportDescriptors(Block<ImageImportDescriptor> &imageImportDescriptors,ImageSectionHeader &importSectionHeader,PureViewOfFile &pureView)
|
|
{
|
|
DirectoryEntryKey sectionKey(DirectoryEntryKey::ImportDirectory);
|
|
ImageDataDirectory imageSectionDirectory(((ImageOptionalHeader&)*this)[sectionKey]);
|
|
ImageImportDescriptor imageImportDescriptor;
|
|
DWORD deltaOffset;
|
|
DWORD deltaNames;
|
|
|
|
imageImportDescriptors.remove();
|
|
if(!enclosingSectionHeader(imageSectionDirectory.virtualAddress(),importSectionHeader))return FALSE;
|
|
deltaOffset=importSectionHeader.virtualAddress()-importSectionHeader.pointerRawData();
|
|
pureView.seek(imageSectionDirectory.virtualAddress()-deltaOffset,PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
String moduleName;
|
|
imageImportDescriptor<<pureView;
|
|
if(!imageImportDescriptor.isOkay())break;
|
|
deltaOffset=importNamesSectionHeader.virtualAddress()-importNamesSectionHeader.pointerRawData();
|
|
pureView.push();
|
|
pureView.seek(imageImportDescriptor.nameRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
pureView.getLine(moduleName);
|
|
imageImportDescriptor.moduleName(moduleName);
|
|
pureView.pop();
|
|
imageImportDescriptor.loadImageImportThunks(deltaOffset,pureView);
|
|
imageImportDescriptors.insert(&imageImportDescriptor);
|
|
}
|
|
return imageImportDescriptors.size();
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(originalFirstThunkRVA())loadImageImportThunk(originalFirstThunkRVA(),deltaOffset,
|
|
imageOriginalThunkImportOrdinals(),imageOriginalThunkImportNames(),pureView);
|
|
|
|
|
|
void loadImageImportThunks(DWORD virtualAddress,DWORD deltaOffset,Block<ImageThunkData> &imageThunkImportOrdinals,Block<ImageThunkName> &imageThunkImportNames,PureViewOfFile &pureView);
|
|
|
|
|
|
|
|
void PEHeader::loadImageImportThunks(DWORD virtualAddress,DWORD deltaOffset,Block<ImageThunkData> &imageThunkImportOrdinals,Block<ImageThunkName> &imageThunkImportNames,PureViewOfFile &pureView)
|
|
{
|
|
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();
|
|
pureView.seek(imageThunkData.addressOfDataRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
imageThunkName<<pureView;
|
|
imageThunkImportNames.insert(&imageThunkName);
|
|
pureView.pop();
|
|
}
|
|
}
|
|
pureView.pop();
|
|
}
|
|
|
|
|
|
|
|
// Block<ImageThunkData> imageOriginalThunkImportOrdinals;
|
|
// Block<ImageThunkName> imageOriginalThunkImportNames;
|
|
// if(imageImportDescriptor.originalFirstThunkRVA())
|
|
// loadImageImportThunks(imageImportDescriptor.originalFirstThunkRVA(),deltaOffset,
|
|
// imageOriginalThunkImportOrdinals,imageOriginalThunkImportNames,pureView);
|
|
|
|
// Block<ImageThunkData> imageThunkImportOrdinals;
|
|
// Block<ImageThunkName> imageThunkImportNames;
|
|
// if(imageImportDescriptor.firstThunkRVA())
|
|
// loadImageImportThunks(imageImportDescriptor.firstThunkRVA(),deltaOffset,
|
|
// imageThunkImportOrdinals,imageThunkImportNames,pureView);
|
|
|
|
|
|
|
|
pureView.push();
|
|
if(imageImportDescriptor.originalFirstThunkRVA())
|
|
{
|
|
pureView.seek(imageImportDescriptor.originalFirstThunkRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
ImageThunkData imageThunkData;
|
|
imageThunkData<<pureView;
|
|
if(!imageThunkData.isOkay())break;
|
|
}
|
|
}
|
|
pureView.pop();
|
|
|
|
#if 0
|
|
pureView.push();
|
|
if(imageImportDescriptor.firstThunkRVA())
|
|
{
|
|
pureView.seek(imageImportDescriptor.firstThunkRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
ImageThunkData imageThunkData;
|
|
imageThunkData<<pureView;
|
|
if(!imageThunkData.isOkay())break;
|
|
if(imageThunkData.isOrdinalImport())
|
|
{
|
|
}
|
|
else
|
|
{
|
|
ImageThunkName imageThunkName;
|
|
pureView.push();
|
|
pureView.seek(imageThunkData.addressOfDataRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
imageThunkName<<pureView;
|
|
pureView.pop();
|
|
}
|
|
}
|
|
}
|
|
pureView.pop();
|
|
#endif
|
|
|
|
|
|
// ImageThunkName imageThunkName;
|
|
// imageThunkName<<pureView;
|
|
// break;
|
|
// pureView.seek(imageImportDescriptor.nameRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
// char *lpString((char*)(imageImportDescriptor.nameRVA()-deltaOffset+pureView.base()));
|
|
// if(!lpString)return;
|
|
|
|
|
|
// pureView.seek(deltaOffset-imageImportDescriptor.nameRVA(),PureViewOfFile::SeekSet);
|
|
// char *lpString((char*)(imageImportDescriptor.nameRVA()-deltaOffset+pureView.base()));
|
|
// if(!lpString)return;
|
|
// lpString=0;
|
|
|
|
|
|
|
|
Bitmap kcBitmap("C:\\WORK\\SCENE\\MEDIA\\BMP\\KC.BMP");
|
|
HWND hDisplayWnd;
|
|
|
|
hDisplayWnd=::CreateWindow("BUTTON","",WS_VISIBLE,0,0,100,100,(HWND)0,(HMENU)0,hInstance,(LPVOID)0);
|
|
if(!hDisplayWnd)return FALSE;
|
|
::ShowWindow(hDisplayWnd,SW_SHOW);
|
|
::UpdateWindow(hDisplayWnd);
|
|
kcBitmap.displayBitmap(hDisplayWnd);
|
|
::Sleep(10000);
|
|
::DestroyWindow(hDisplayWnd);
|
|
|
|
|
|
|
|
|
|
// DisAssembler disAssembler;
|
|
// disAssembler.pageBreak(FALSE);
|
|
// disAssembler.disassemble("C:\\COMMAND.COM");
|
|
// winConsole.writeLine("Finished, press any key.");
|
|
// winConsole.read();
|
|
|
|
//#ifndef _COMMON_PUREVIEWOFFILE_HPP_
|
|
//#include <common/pview.hpp>
|
|
//#endif
|
|
//#ifndef _COMMON_BLOCK_TPP_
|
|
//#include <common/block.tpp>
|
|
//#endif
|
|
|
|
|
|
|
|
#if 0
|
|
// Block<SmartPointer<char> > mResStrings;
|
|
|
|
mResStrings.insert(&SmartPointer<char>("???_0"));
|
|
mResStrings.insert(&SmartPointer<char>("CURSOR"));
|
|
mResStrings.insert(&SmartPointer<char>("BITMAP"));
|
|
mResStrings.insert(&SmartPointer<char>("ICON"));
|
|
mResStrings.insert(&SmartPointer<char>("MENU"));
|
|
mResStrings.insert(&SmartPointer<char>("DIALOG"));
|
|
mResStrings.insert(&SmartPointer<char>("STRING"));
|
|
mResStrings.insert(&SmartPointer<char>("FONTDIR"));
|
|
mResStrings.insert(&SmartPointer<char>("FONT"));
|
|
mResStrings.insert(&SmartPointer<char>("ACCELERATORS"));
|
|
mResStrings.insert(&SmartPointer<char>("RCDATA"));
|
|
mResStrings.insert(&SmartPointer<char>("MESSAGETABLE"));
|
|
mResStrings.insert(&SmartPointer<char>("GROUP_CURSOR"));
|
|
mResStrings.insert(&SmartPointer<char>("???_13"));
|
|
mResStrings.insert(&SmartPointer<char>("GROUP_ICON"));
|
|
mResStrings.insert(&SmartPointer<char>("???_15"));
|
|
mResStrings.insert(&SmartPointer<char>("VERSION"));
|
|
for(short itemIndex=0;itemIndex<mResStrings.size();itemIndex++)
|
|
mResStrings[itemIndex].disposition(PointerDisposition::Assume);
|
|
#endif
|
|
|
|
|
|
// imgResDir.read(imageSectionHeader.pointerRawData(),pureView);
|
|
// pureView.seek(imageSectionHeader.pointerRawData(),PureViewOfFile::SeekSet);
|
|
// sectionData.size(imageSectionHeader.sizeofRawData());
|
|
// imgResDir.read(imageSectionHeader.pointerRawData(),pureView);
|
|
// descendResourceDirectory(imgResDir);
|
|
|
|
|
|
void ImageResourceDataEntry::read(DWORD resBase,DWORD deltaOffset,PureViewOfFile &pureView)
|
|
{
|
|
pureView.push();
|
|
pureView.read((char*)&((IMAGE_RESOURCE_DATA_ENTRY&)*this),sizeof(IMAGE_RESOURCE_DATA_ENTRY));
|
|
mRawData.size(size());
|
|
pureView.seek(offsetData()-deltaOffset,PureViewOfFile::SeekSet);
|
|
pureView.read((char*)((BYTE*)mRawData),mRawData.size());
|
|
// FileHandle resFile("RES.DAT",FileHandle::Write,FileHandle::ShareNone,FileHandle::Overwrite);
|
|
// resFile.write((BYTE*)mRawData,mRawData.size());
|
|
pureView.pop();
|
|
}
|
|
|
|
|
|
void ImageResourceDirectoryEntry::read(DWORD resBase,DWORD deltaOffset,PureViewOfFile &pureView)
|
|
{
|
|
pureView.read((char*)&((IMAGE_RESOURCE_DIRECTORY_ENTRY&)*this),sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
|
|
pureView.push();
|
|
if(nameIsString())
|
|
{
|
|
ImageResourceDirString resDirString;
|
|
pureView.push();
|
|
pureView.seek(resBase+offsetName(),PureViewOfFile::SeekSet);
|
|
resDirString.read(pureView);
|
|
mResourceName=resDirString.name();
|
|
pureView.pop();
|
|
}
|
|
if(dataIsDirectory())
|
|
{
|
|
// String resString=getResource(name());
|
|
// if(!resString.isNull())::OutputDebugString(resString+String("\n"));
|
|
// mResourceType=getResource(name());
|
|
if(mResourceName.isNull())mResourceName=getResource(name());
|
|
if(!mResourceName.isNull())::OutputDebugString(mResourceName+String("\n"));
|
|
pureView.seek(resBase+offsetDirectory(),PureViewOfFile::SeekSet);
|
|
mImageResourceDirectory.read(resBase,deltaOffset,pureView);
|
|
}
|
|
else
|
|
{
|
|
pureView.seek(resBase+offsetDirectory(),PureViewOfFile::SeekSet);
|
|
mImageResourceDataEntry.read(deltaOffset,pureView);
|
|
}
|
|
pureView.pop();
|
|
}
|
|
|
|
|
|
|
|
// ImageResourceDirectoryEntry imgResDirEntry;
|
|
// imgResDirEntry.read(resBase,deltaOffset,pureView);
|
|
// mImageResourceDirectoryEntries.insert(&imgResDirEntry);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mResStrings.insert(&String("???_0"));
|
|
mResStrings.insert(&String("CURSOR"));
|
|
mResStrings.insert(&String("BITMAP"));
|
|
mResStrings.insert(&String("ICON"));
|
|
mResStrings.insert(&String("MENU"));
|
|
mResStrings.insert(&String("DIALOG"));
|
|
mResStrings.insert(&String("STRING"));
|
|
mResStrings.insert(&String("FONTDIR"));
|
|
mResStrings.insert(&String("FONT"));
|
|
mResStrings.insert(&String("ACCELERATORS"));
|
|
mResStrings.insert(&String("RCDATA"));
|
|
mResStrings.insert(&String("MESSAGETABLE"));
|
|
mResStrings.insert(&String("GROUP_CURSOR"));
|
|
mResStrings.insert(&String("???_13"));
|
|
mResStrings.insert(&String("GROUP_ICON"));
|
|
mResStrings.insert(&String("???_15"));
|
|
mResStrings.insert(&String("VERSION"));
|
|
|
|
|
|
|
|
vxdView.seek(vxdHeader.neHeaderAddress()+vxdHeader.objectTableOffset(),PureViewOfFile::SeekSet);
|
|
for(int
|
|
|
|
|
|
VxDObject vxdObj;
|
|
for(int objIndex=0;objIndex<vxdHeader.objectCount();objIndex++)
|
|
{
|
|
vxdObj<<vxdView;
|
|
String strFlags;
|
|
::sprintf(strFlags,"virt. size:%08lx reloc. base:%08lx table index:%08lx table entries:%08lx",
|
|
vxdObj.virtualSize(),vxdObj.relocationBaseAddress(),vxdObj.pageTableIndex(),vxdObj.pageTableEntries());
|
|
strFlags+=String(" ")+(String)vxdObj;
|
|
::OutputDebugString(strFlags+String("\n"));
|
|
}
|
|
|
|
|
|
pureView.seek(neHeaderAddress()+objectTableOffset(),PureViewOfFile::SeekSet);
|
|
for(int objIndex=0;objIndex<objectCount();objIndex++){VxDObjects::insert(&VxDObject());VxDObjects::operator[](objIndex)<<pureView;}
|
|
getNames(pureView);
|
|
|
|
|
|
|
|
class DirectoryEntryKey
|
|
{
|
|
public:
|
|
enum Key{ExportDirectory=IMAGE_DIRECTORY_ENTRY_EXPORT,
|
|
ImportDirectory=IMAGE_DIRECTORY_ENTRY_IMPORT,
|
|
ResourceDirectory=IMAGE_DIRECTORY_ENTRY_RESOURCE,
|
|
ExceptionDirectory=IMAGE_DIRECTORY_ENTRY_EXCEPTION,
|
|
SecurityDirectory=IMAGE_DIRECTORY_ENTRY_SECURITY,
|
|
BaseRelocationTableDirectory=IMAGE_DIRECTORY_ENTRY_BASERELOC,
|
|
DebugDirectory=IMAGE_DIRECTORY_ENTRY_DEBUG,
|
|
DescriptionStringDirectory=IMAGE_DIRECTORY_ENTRY_COPYRIGHT,
|
|
MachineValueDirectory=IMAGE_DIRECTORY_ENTRY_GLOBALPTR,
|
|
ThreadLocalStorageDirectory=IMAGE_DIRECTORY_ENTRY_TLS,
|
|
LoadConfigurationDirectory=IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG,
|
|
BoundImportDirectory=IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT,
|
|
ImportAddressTableDirectory=IMAGE_DIRECTORY_ENTRY_IAT
|
|
};
|
|
DirectoryEntryKey(Key entryEntry=ImportDirectory);
|
|
DirectoryEntryKey(const DirectoryEntryKey &someDirectoryEntryKey);
|
|
virtual ~DirectoryEntryKey();
|
|
DirectoryEntryKey &operator=(const DirectoryEntryKey &someDirectoryEntryKey);
|
|
WORD operator==(const DirectoryEntryKey &someDirectoryEntryKey);
|
|
Key entryKey(void)const;
|
|
void entryKey(Key entryKey);
|
|
|
|
|
|
|
|
// development of this method is currently in progress
|
|
BOOL PEHeader::loadImageRelocationDirectory(ImageRelocations &imageRelocations,PureViewOfFile &pureView,BOOL isMemoryImage)
|
|
{
|
|
DirectoryEntryKey sectionKey;
|
|
ImageDataDirectory imageSectionDirectory;
|
|
ImageSectionHeader relocationSectionHeader;
|
|
DWORD deltaOffset;
|
|
BOOL msImage(FALSE);
|
|
|
|
imageRelocations.remove();
|
|
if(!isOkay())return FALSE;
|
|
sectionKey.entryKey(DirectoryEntryKey::ResourceDirectory);
|
|
imageSectionDirectory=((ImageOptionalHeader&)*this)[sectionKey];
|
|
if(!enclosingSectionHeader(imageSectionDirectory.virtualAddress(),relocationSectionHeader,deltaOffset))return FALSE;
|
|
for(short sectionIndex=0;sectionIndex<size();sectionIndex++)if(((PureVector<ImageSectionHeader>&)*this)[sectionIndex].name()==String(".reloc")){msImage=TRUE;break;}
|
|
return imageRelocations.size()?TRUE:FALSE;
|
|
}
|