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

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));
}
}