home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* DPB.PAS *)
- (* Auslesen der Drive Parameter Blöcke *)
- (* (c) 1990 Dominik Ernst & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Drive_Parameter;
-
- USES
- Dos, Crt;
-
- TYPE
- DPB_Type = RECORD
- Laufwerk_Nr,
- Subunit : BYTE;
- Bytes_pro_Sektor : WORD;
- Interleave_Faktor,
- Sektoren_pro_Cluster : BYTE;
- Reservierte_Sektoren : WORD;
- Anzahl_FATs : BYTE;
- Anzahl_Eintraege : WORD;
- Erster_belegter_Sektor,
- Letzter_belegter_Sektor : WORD;
- Sektoren_pro_FAT : BYTE;
- Erster_DatenSektor : WORD;
- Geraete_Treiber_Zeiger : Pointer;
- Media_descriptor,
- Used_flag : BYTE;
- Naechster_DPB : Pointer;
- END;
-
- VAR
- Laufwerk : Byte;
- DPB : DPB_Type;
-
-
- FUNCTION Anz_DPBs : BYTE;
- TYPE
- DPB_Zeiger = ^DPB_Type;
- VAR
- Akt_Zeiger : DPB_Zeiger;
- DIB_Zeiger : Pointer;
- Regs : Registers;
- Drives : BYTE;
- BEGIN
- Regs.ah := $52; (* ermittelt die Startadresse des *)
- MSDos(Regs); (* DOS-INFO-Blocks + 4 im *)
- (* Registerpaar ES:BX *)
- Drives := 0;
- DIB_Zeiger := Ptr(Regs.ES, Regs.BX);
- Akt_Zeiger := DPB_Zeiger(DIB_Zeiger^);
- WHILE (Ofs(Akt_Zeiger^) <> $FFFF) DO BEGIN
- (* solange noch weitere Laufwerke *)
- Inc(Drives);
- Akt_Zeiger := Akt_Zeiger^.Naechster_DPB
- END;
- Anz_DPBs := Drives;
- END;
-
-
- FUNCTION Get_DPB( LWNR : BYTE;
- VAR DPB : DPB_Type) : BOOLEAN;
- TYPE
- DPB_Zeiger = ^DPB_Type;
- VAR
- Akt_Zeiger : DPB_Zeiger;
- DIB_Zeiger : Pointer;
- Regs : Registers;
- Drives : BYTE;
- ok : BOOLEAN;
- BEGIN
- Regs.AH := $52;
- MSDos(Regs);
- ok := (Regs.Flags AND FCarry) = 0;
- IF ok THEN BEGIN
- Drives := 1;
- DIB_Zeiger := PTR(Regs.es, Regs.bx);
- Akt_Zeiger := DPB_Zeiger(DIB_Zeiger^);
- WHILE (Ofs(Akt_Zeiger^) <> $FFFF) AND
- (Drives < LWNr) DO BEGIN
- Inc(Drives);
- Akt_Zeiger := Akt_Zeiger^.Naechster_DPB
- END;
- END;
- IF (Drives = LWNr) AND ok THEN BEGIN
- DPB := Akt_Zeiger^;
- Get_DPB := TRUE
- END ELSE
- Get_DPB := FALSE;
- END;
-
-
- FUNCTION Get_DPB2( LWNR : BYTE;
- VAR DPB : DPB_Type) : BOOLEAN;
- TYPE
- DPB_Zeiger = ^DPB_Type;
- VAR
- Akt_Zeiger : DPB_Zeiger;
- Regs : Registers;
- ok : BOOLEAN;
- BEGIN
- Regs.dl := LWNR;
- Regs.ah := $32; (* undokumentierter Int! *)
- MSDos(Regs);
- ok := (Regs.Flags AND FCarry) = 0;
- IF ok THEN BEGIN
- Akt_Zeiger := Ptr(Regs.ds, Regs.bx);
- DPB := Akt_Zeiger^;
- END;
- Get_DPB2 := ok;
- END;
-
- BEGIN
- ClrScr;
- WriteLn('<D>rive <P>arameter <B>lock Inhalte : ');
- WriteLn('---------------------------------------------',
- '-----------------------');
- WriteLn('Laufwerk Bytes Sektoren Anzahl Sektoren ',
- 'Interleave Media');
- WriteLn(' pro pro der pro ',
- ' Faktor Descriptor');
- WriteLn(' Sektor Cluster FATs FAT');
- WriteLn('---------------------------------------------',
- '-----------------------');
- FOR Laufwerk := 1 TO Anz_DPBs DO BEGIN
- IF Get_DPB2(Laufwerk, DPB) THEN WITH DPB DO BEGIN
- WriteLn(' ', Chr(65 + Laufwerk_Nr), ':',
- Bytes_pro_Sektor:11,
- Sektoren_pro_Cluster:8,
- Anzahl_FATs:8,
- Sektoren_pro_FAT:10,
- Interleave_Faktor:11,
- Media_Descriptor:12);
- END ELSE
- WriteLn(' ', Chr(65 + Pred(Laufwerk)),
- ': kann nicht angesprochen werden, ',
- 'evtl. keine Disk eingelegt ? ');
- END;
- WriteLn('--------------------------------------------',
- '------------------------');
- WriteLn(' irgendeine Taste ... ');
- REPEAT UNTIL KeyPressed;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von DPB.PAS *)