Initial
This commit is contained in:
111
image/VXDHDR.CPP
Normal file
111
image/VXDHDR.CPP
Normal file
@@ -0,0 +1,111 @@
|
||||
#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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user