112 lines
4.5 KiB
C++
112 lines
4.5 KiB
C++
#include <image/vxdhdr.hpp>
|
|
|
|
VxDHeader::~VxDHeader()
|
|
{
|
|
}
|
|
|
|
VxDHeader &VxDHeader::operator=(const VxDHeader &someVxDHeader)
|
|
{
|
|
::memcpy((char*)&((_IMAGE_VXD_HEADER&)*this),(char*)&((_IMAGE_VXD_HEADER&)someVxDHeader),sizeof(_IMAGE_VXD_HEADER));
|
|
(DOSHeader&)*this=(DOSHeader&)someVxDHeader;
|
|
return *this;
|
|
}
|
|
|
|
WORD VxDHeader::operator==(const VxDHeader &someVxDHeader)
|
|
{
|
|
return ((DOSHeader&)*this==(DOSHeader&)someVxDHeader&&
|
|
magic()==someVxDHeader.magic()&&
|
|
byteOrdering()==someVxDHeader.byteOrdering()&&
|
|
wordOrdering()==someVxDHeader.wordOrdering()&&
|
|
exeFormatLevel()==someVxDHeader.exeFormatLevel()&&
|
|
cpuType()==someVxDHeader.cpuType()&&
|
|
osType()==someVxDHeader.osType()&&
|
|
moduleVersion()==someVxDHeader.moduleVersion()&&
|
|
moduleFlags()==someVxDHeader.moduleFlags()&&
|
|
moduleNumPages()==someVxDHeader.moduleNumPages()&&
|
|
startObjectNumberForIP()==someVxDHeader.startObjectNumberForIP()&&
|
|
eip()==someVxDHeader.eip()&&
|
|
startObjectNumberForSP()==someVxDHeader.startObjectNumberForSP()&&
|
|
esp()==someVxDHeader.esp()&&
|
|
vxdPageSize()==someVxDHeader.vxdPageSize()&&
|
|
vxdLastPageSize()==someVxDHeader.vxdLastPageSize()&&
|
|
fixupSectionSize()==someVxDHeader.fixupSectionSize()&&
|
|
fixupSectionChecksum()==someVxDHeader.fixupSectionChecksum()&&
|
|
loaderSectionSize()==someVxDHeader.loaderSectionSize()&&
|
|
loaderSectionChecksum()==someVxDHeader.loaderSectionChecksum()&&
|
|
objectTableOffset()==someVxDHeader.objectTableOffset()&&
|
|
objectCount()==someVxDHeader.objectCount()&&
|
|
objectPageMapOffset()==someVxDHeader.objectPageMapOffset()&&
|
|
objectIteratedDataMapOffset()==someVxDHeader.objectIteratedDataMapOffset()&&
|
|
resourceTableOffset()==someVxDHeader.resourceTableOffset()&&
|
|
resourceEntryCount()==someVxDHeader.resourceEntryCount()&&
|
|
residentNameTableOffset()==someVxDHeader.residentNameTableOffset()&&
|
|
entryTableOffset()==someVxDHeader.entryTableOffset()&&
|
|
moduleDirectiveTableOffset()==someVxDHeader.moduleDirectiveTableOffset()&&
|
|
moduleDirectivesCount()==someVxDHeader.moduleDirectivesCount()&&
|
|
fixupPageTableOffset()==someVxDHeader.fixupPageTableOffset()&&
|
|
fixupRecordTableOffset()==someVxDHeader.fixupRecordTableOffset()&&
|
|
importModuleNameTableOffset()==someVxDHeader.importModuleNameTableOffset()&&
|
|
importModuleNameTableCount()==someVxDHeader.importModuleNameTableCount()&&
|
|
importProcedureNameTableOffset()==someVxDHeader.importProcedureNameTableOffset()&&
|
|
perPageChecksumTableOffset()==someVxDHeader.perPageChecksumTableOffset()&&
|
|
enumeratedDataPagesOffset()==someVxDHeader.enumeratedDataPagesOffset()&&
|
|
preloadPagesCount()==someVxDHeader.preloadPagesCount()&&
|
|
nonResidentNameTableOffset()==someVxDHeader.nonResidentNameTableOffset()&&
|
|
nonResidentNameTableChecksum()==someVxDHeader.nonResidentNameTableChecksum()&&
|
|
automaticDataObjectNumber()==someVxDHeader.automaticDataObjectNumber()&&
|
|
debugInfoOffset()==someVxDHeader.debugInfoOffset()&&
|
|
debugInfoLengthBytes()==someVxDHeader.debugInfoLengthBytes()&&
|
|
preloadSectionInstancePageCount()==someVxDHeader.preloadSectionInstancePageCount()&&
|
|
demandLoadSectionInstancePageCount()==someVxDHeader.demandLoadSectionInstancePageCount()&&
|
|
sizeHeap()==someVxDHeader.sizeHeap()&&
|
|
windowsResourceOffset()==someVxDHeader.windowsResourceOffset()&&
|
|
windowsResourceLength()==someVxDHeader.windowsResourceLength()&&
|
|
vxdID()==someVxDHeader.vxdID()&&
|
|
ddkVersion()==someVxDHeader.ddkVersion());
|
|
}
|
|
|
|
WORD VxDHeader::operator<<(PureViewOfFile &pureView)
|
|
{
|
|
VxDObjects::remove();
|
|
VxDNames::remove();
|
|
pureView.rewind();
|
|
if(!(((DOSHeader&)*this)<<pureView))return FALSE;
|
|
pureView.seek(neHeaderAddress(),PureViewOfFile::SeekSet);
|
|
if(sizeof(_IMAGE_VXD_HEADER)!=pureView.read((char*)&((_IMAGE_VXD_HEADER&)*this),sizeof(_IMAGE_VXD_HEADER)))return FALSE;
|
|
if(!isOkay())return FALSE;
|
|
getObjects(pureView);
|
|
getNames(pureView);
|
|
return TRUE;
|
|
}
|
|
|
|
void VxDHeader::getObjects(PureViewOfFile &pureView)
|
|
{
|
|
VxDObjects::remove();
|
|
pureView.seek(neHeaderAddress()+objectTableOffset(),PureViewOfFile::SeekSet);
|
|
for(int objIndex=0;objIndex<objectCount();objIndex++)
|
|
{
|
|
VxDObjects::insert(&VxDObject());
|
|
VxDObjects::operator[](VxDObjects::size()-1)<<pureView;
|
|
}
|
|
}
|
|
|
|
void VxDHeader::getNames(PureViewOfFile &pureView)
|
|
{
|
|
BYTE strLength;
|
|
String entryName;
|
|
WORD entryOrdinal;
|
|
|
|
VxDNames::remove();
|
|
pureView.seek(neHeaderAddress()+residentNameTableOffset(),PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
pureView.read(strLength);
|
|
strLength&=0x7F;
|
|
if(!strLength)break;
|
|
entryName.reserve(strLength+1);
|
|
pureView.read((char*)entryName,strLength);
|
|
pureView.read(entryOrdinal);
|
|
VxDNames::insert(&VxDName(entryName,entryOrdinal));
|
|
}
|
|
}
|