Detect-It-Easy/db/MSDOS/_init
2014-06-01 23:42:39 +02:00

132 lines
3 KiB
Text

var File=MSDOS;
includeScript("result");
// Get the "base" offset, after the header.
MSDOS.getBaseOffset = function(nOffset)
{
if(arguments.length==0)
{
nOffset=0;
}
return (MSDOS.readWord(8)<<4)+nOffset;
}
// Translate segment/offset address pair to file offset.
MSDOS.AddressToOffset = function(nSegment,nOffset)
{
if(arguments.length==1)
{
nOffset=0;
}
nOffset+=nSegment<<4;
return MSDOS.getBaseOffset(nOffset&0xFFFFF);
}
// Get the entry point offset.
MSDOS.getEntryPointOffset = function(nOffset)
{
if(arguments.length==0)
{
nOffset=0;
}
return MSDOS.AddressToOffset(MSDOS.readWord(0x16),
MSDOS.readWord(0x14))+nOffset;
}
// Get the NewExe offset (assuming it's valid).
MSDOS.getNEOffset = function(nOffset)
{
if(arguments.length==0)
{
nOffset=0;
}
return MSDOS.readDword(0x3C)+nOffset;
}
// Add the overlay functions.
MSDOS._OverlayOffset=0;
MSDOS.getOverlayOffset = function(nOffset)
{
if(arguments.length==0)
{
nOffset=0;
}
if(MSDOS._OverlayOffset==0)
{
if(MSDOS.isNE())
{
var nNE=MSDOS.getNEOffset();
var nSegments=MSDOS.readWord(nNE+0x1C);
var nShift=MSDOS.readWord(nNE+0x32);
if(nShift==0)
{
nShift=9;
}
var nTable=nNE+MSDOS.readWord(nNE+0x22);
var nLast=0,nSize,bRelocs;
for(var i=0;i<nSegments;i++)
{
var nSeg=MSDOS.readWord(nTable+i*8);
if(nSeg>nLast)
{
nLast=nSeg;
nSize=MSDOS.readWord(nTable+2+i*8);
bRelocs=MSDOS.readWord(nTable+4+i*8)&0x100;
}
}
if(nSize==0)
{
nSize=65536;
}
MSDOS._OverlayOffset=(nLast<<nShift)+nSize;
if(bRelocs)
{
MSDOS._OverlayOffset+=2+MSDOS.readWord(nLast)*8;
}
MSDOS._OverlayOffset=(MSDOS._OverlayOffset+(1<<nShift)-1)&-(1<<nShift);
}
else if(MSDOS.isLE())
{
var nLE=MSDOS.getNEOffset();
var nPages=MSDOS.readDword(nLE+0x14);
var nPageSize=MSDOS.readDword(nLE+0x28);
var nLastPage=MSDOS.readDword(nLE+0x2C);
var nDataPage=MSDOS.readDword(nLE+0x80);
MSDOS._OverlayOffset=(nPages-1)*nPageSize+nLastPage+nDataPage;
}
else
{
MSDOS._OverlayOffset=((MSDOS.readWord(4)-1)<<9)+MSDOS.readWord(2);
}
}
return MSDOS._OverlayOffset+nOffset;
}
MSDOS.getOverlaySize = function()
{
return MSDOS.getSize()-MSDOS.getOverlayOffset();
}
MSDOS.isOverlayPresent = function()
{
return MSDOS.getOverlaySize()!=0;
}
MSDOS.compareOverlay = function(sSignature,nOffset)
{
if(arguments.length==1)
{
nOffset=0;
}
return MSDOS.compare(sSignature,MSDOS.getOverlayOffset()+nOffset);
}