home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
ida35bc.zip
/
DRIVER.IDC
< prev
next >
Wrap
Text File
|
1996-01-29
|
3KB
|
100 lines
//
// This file is executed when a new device driver is loaded.
// Device drivers have extensions DRV or SYS.
//
// History:
//
// 08/12/95 20:16 by Alexey Kulentsov:
// + Check for Device Request Block
// + Cludge with Drv/Com supported
// 04/01/96 04:21 by ig:
// + 0000:0000 means end of devices chain too.
static main(void) {
auto x,i,base;
auto intr,strt;
auto attr,cmt;
auto nextbase;
auto DevReq;
i = 0;
x = MinEA();
base = (x >> 4); // The segment base
while ( 1 ) {
Message(form("Device driver block at %04lX",x) + "\n");
MakeName(x,form("NextDevice_%ld",i));
MakeWord(x);
OpNum(x);
if ( Word(x) == 0xFFFF ) {
MakeComm(x,"The last device");
} else {
nextbase = base + Word(x+2);
OpOffset(x,[nextbase,0]);
MakeComm(x,"Offset to the next device");
}
MakeWord(x+2);
OpNum(x+2);
MakeName(x+4,form("DevAttr_%ld",i));
MakeWord(x+4);
OpNum(x+4);
attr = Word(x+4);
cmt = "";
if ( attr & (1<< 0) ) cmt = cmt + "stdin device\n";
if ( attr & (1<< 1) ) cmt = cmt + ((attr & (1<<15)) ? "stdout device\n" : ">32M\n");
if ( attr & (1<< 2) ) cmt = cmt + "stdnull device\n";
if ( attr & (1<< 3) ) cmt = cmt + "clock device\n";
if ( attr & (1<< 6) ) cmt = cmt + "supports logical devices\n";
if ( attr & (1<<11) ) cmt = cmt + "supports open/close/RM\n";
if ( attr & (1<<13) ) cmt = cmt + "non-IBM block device\n";
if ( attr & (1<<14) ) cmt = cmt + "supports IOCTL\n";
cmt = cmt + ((attr & (1<<15)) ? "character device" : "block device");
MakeComm(x+4,cmt);
MakeName(x+6,form("Strategy_%ld",i));
MakeWord(x+6);
OpOffset(x+6,MinEA());
MakeName(x+8,form("Interrupt_%ld",i));
MakeWord(x+8);
OpOffset(x+8,MinEA());
MakeName(x+0xA,form("DeviceName_%ld",i));
MakeStr (x+0xA,8);
MakeComm(x+0xA,"May be device number");
strt = [ base, Word(x+6) ];
intr = [ base, Word(x+8) ];
MakeCode( strt );
MakeCode( intr );
MakeName( strt, form("Strategy_Routine_%ld",i));
MakeName( intr, form("Interrupt_Routine_%ld",i));
MakeComm( strt, "ES:BX -> Device Request Block");
MakeComm( intr, "Device Request Block:\n"
"0 db length\n"
"1 db unit number\n"
"2 db command code\n"
"5 d? reserved\n"
"0D d? command specific data");
if( Byte( strt )==0x2E && Word(strt+1)==0x1E89
&& Byte(strt+5)==0x2E && Word(strt+6)==0x068C
&& Word(strt+3)==Word(strt+8)-2)
{
DevReq=Word(strt+3);
Message(form("DevReq at %x",DevReq) + "\n");
MakeUnkn(x+DevReq,0);MakeUnkn(x+DevReq+2,0);
MakeDword(x+DevReq);MakeName(x+DevReq,form("DevRequest_%ld",i));
}
if ( Word(x) == 0xFFFF ||
((Byte(x)==0xE9 || Byte(x)==0xEB) && i==0) ) break;
if ( Dword(x) == 0 ) break; // 04.01.96
x = [ nextbase, Word(x) ];
i = i + 1;
}
}