home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* DEVICES.PAS *)
- (* Informationen über die Gerätetreiber *)
- (* (c) 1989 Norbert Juffa & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Devices;
-
- USES DOS;
-
- TYPE DevPtr = ^DevHdr;
- DevHdr = RECORD
- Next: DevPtr;
- Attr: WORD;
- Strt: WORD;
- Srvc: WORD;
- CASE BOOLEAN OF
- FALSE: (Unts: BYTE);
- TRUE : (Name: ARRAY [0..7] OF CHAR);
- END;
- DevAddr = ARRAY [0..15] OF LONGINT;
- List = ^Device;
- Device = RECORD
- Address: POINTER;
- Attribute: WORD;
- Name: STRING [25];
- Next: List;
- END;
-
-
- CONST DevTyp : ARRAY [0..1] OF STRING [9] =
- ('CHARACTER', ' BLOCK ');
- Flag: ARRAY [0..1] OF CHAR = (' ', '*');
-
-
- { Die Funktion PtrToLongInt gibt den übergebenen Zeiger }
- { Ptr als lineare Adresse zurück. }
-
- FUNCTION PtrToLongint (Ptr: POINTER): LONGINT;
- BEGIN
- PtrToLongint := LongInt(Seg(Ptr^)) * 16 + Ofs(Ptr^);
- END;
-
- { Die Funktion Hex liefert die übergebene Wort-Variable }
- { als eine Kette von vier Zeichen in hexadezimaler }
- { Schreibweise zurück. }
-
- FUNCTION Hex (X: WORD): STRING;
- VAR H: ARRAY [0..15] OF CHAR;
- BEGIN
- H := '0123456789ABCDEF';
- Hex := H [X SHR 12] + H [(X AND $0F00) SHR 8] +
- H [(X AND $00F0) SHR 4] + H [(X AND $000F)];
- END;
-
- { Die Prozedur GetDiskParameterBlk durchläuft die Liste }
- { der Diskparameterblöcke und vermerkt zu jedem Laufwerk }
- { in dem Array DriverAddress die Adresse des zugehörigen }
- { DPB. Auuserdem liefert sie in DriveNr die Gesamtzahl der }
- { installierten Laufwerke. }
-
- PROCEDURE GetDiskParameterBlk(VAR DriverAddress: DevAddr;
- VAR DriveNr: WORD);
- TYPE DPB = RECORD
- Drive: BYTE;
- Unt: BYTE;
- SecSize: WORD;
- ClstSec: BYTE;
- ClstSiz: BYTE;
- FAT1: WORD;
- NrFAT: BYTE;
- DirEnt: WORD;
- Free1: WORD;
- DskSiz: WORD;
- FATLen: BYTE;
- DIR1: WORD;
- DevHd: POINTER;
- IDByte: BYTE;
- Flg: BYTE;
- NextDBP: Pointer;
- Reserved:LONGINT;
- END;
-
- VAR Regs: Registers;
- Next: ^DPB;
-
- BEGIN
- DriveNr := 1;
- Regs.AH := $52;
- MsDos(Regs);
- Next := Pointer(Ptr(Regs.ES, Regs.BX)^);
- REPEAT
- DriverAddress[DriveNr] := PtrToLongInt(Next^.DevHd);
- Next := Pointer(Next^.NextDBP);
- Inc(DriveNr);
- UNTIL(Ofs(Next^) = $FFFF);
- END;
-
- { Die Prozedur InsDevLst fügt das Device CurrentDev in die }
- { nach Startadresse aufsteigend sortierte Liste DevList }
- { ein. Zu jedem Device wird außer der Startadresse der }
- { Name und das Attributwort vermerkt. Bei block devices }
- { wird der Name aus den Namen der unterstützten Laufwerke }
- { gebildet. Dazu wird das Array DrvAddr ausgewertet, indem }
- { zu allen Nr Laufwerken die Startadresse des zugehörigen }
- { Treibers vermerkt ist. }
-
- PROCEDURE InsDevLst (CurrentDev: DevPtr; VAR DevList: List;
- DrvAddr: DevAddr; Nr:WORD);
-
- VAR NewDevice, Lauf: List;
- L: WORD;
-
- BEGIN
- New(NewDevice);
- IF DevList = NIL THEN BEGIN
- DevList := NewDevice;
- NewDevice^.Next := NIL;
- END ELSE
- IF PtrToLongint(CurrentDev) <=
- PtrToLongint(DevList^.Address) THEN BEGIN
- NewDevice^.Next := DevList;
- DevList := NewDevice;
- END ELSE BEGIN
- Lauf := DevList;
- WHILE (Lauf^.Next <> NIL) AND
- (PtrToLongInt(CurrentDev) >
- (PtrToLongInt(Lauf^.Next^.Address))) DO BEGIN
- Lauf := Lauf^.Next;
- END;
- NewDevice^.Next := Lauf^.Next;
- Lauf^.Next := NewDevice;
- END;
- NewDevice^.Address := CurrentDev;
- NewDevice^.Attribute := CurrentDev^.Attr;
-
- IF ((CurrentDev^.Attr SHR 15) XOR 1) = 0 THEN
- NewDevice^.Name := CurrentDev^.Name
- ELSE BEGIN
- NewDevice^.Name := '';
- FOR L := 0 TO Nr-1 DO
- IF DrvAddr[L] = PtrToLongInt(NewDevice^.Address) THEN
- NewDevice^.Name := NewDevice^.Name + Char (L+64)
- + ':, ';
- Dec(NewDevice^.Name[0], 2);
- END;
- END;
-
-
- VAR Lauf: DevPtr;
- DriverAddresses: DevAddr;
- DevList: List;
- NrOfDrives: WORD;
- DOSVersion: BYTE;
- Regs: Registers;
- Next: Pointer;
-
- BEGIN
- DevList := NIL;
- GetDiskParameterBlk(DriverAddresses, NrOfDrives);
- Regs.AH := $30;
- MSDOS(Regs);
- DOSVersion := Regs.AL;
- Regs.AH := $52;
- MsDos(Regs);
- IF DOSVersion < 3 THEN
- Lauf := Ptr(Regs.ES, Regs.BX+23)
- ELSE
- Lauf := Ptr(Regs.ES, Regs.BX+34);
- REPEAT
- InsDevLst(Lauf, DevList, DriverAddresses, NrOfDrives);
- Lauf := Lauf^.Next;
- UNTIL (Ofs(Lauf^) = $FFFF);
- WriteLn;
- WriteLn('DeviceLister 1.0 (c) 1988 N. J.');
- WriteLn;
- WriteLn(' Adresse Typ Name/Laufwerke StdIn ',
- 'StdOut NulDev StdClk NonIbm Ioctl');
- WriteLn('───────── ───────── ─────────────── ──────',
- '─────────────────────────────────');
- WHILE DevList <> NIL DO BEGIN
- Write(Hex(Seg(DevList^.Address^)), ':' ,
- Hex(Ofs(DevList^.Address^)), ' ');
- Write(DevTyp[(DevList^.Attribute SHR 15) XOR 1], ' ');
- Write(DevList^.Name, '':18-Length (DevList^.Name));
- Write(Flag [DevList^.Attribute AND 1]:3);
- Write(Flag [(DevList^.Attribute SHR 1) AND 1]:6);
- Write(Flag [(DevList^.Attribute SHR 2) AND 1]:7);
- Write(Flag [(DevList^.Attribute SHR 3) AND 1]:7);
- Write(Flag [(DevList^.Attribute SHR 13) AND 1]:7);
- WriteLn(Flag [(DevList^.Attribute SHR 14) AND 1]:6);
- DevList := DevList^.Next;
- END;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von DEVICES.PAS *)