home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 10 / tricks / dpb.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-07-08  |  4.5 KB  |  145 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      DPB.PAS                           *)
  3. (*          Auslesen der Drive Parameter Blöcke           *)
  4. (*           (c) 1990 Dominik Ernst & TOOLBOX             *)
  5. (* ------------------------------------------------------ *)
  6. PROGRAM Drive_Parameter;
  7.  
  8. USES
  9.   Dos, Crt;
  10.  
  11. TYPE
  12.   DPB_Type = RECORD
  13.                Laufwerk_Nr,
  14.                Subunit                 : BYTE;
  15.                Bytes_pro_Sektor        : WORD;
  16.                Interleave_Faktor,
  17.                Sektoren_pro_Cluster    : BYTE;
  18.                Reservierte_Sektoren    : WORD;
  19.                Anzahl_FATs             : BYTE;
  20.                Anzahl_Eintraege        : WORD;
  21.                Erster_belegter_Sektor,
  22.                Letzter_belegter_Sektor : WORD;
  23.                Sektoren_pro_FAT        : BYTE;
  24.                Erster_DatenSektor      : WORD;
  25.                Geraete_Treiber_Zeiger  : Pointer;
  26.                Media_descriptor,
  27.                Used_flag               : BYTE;
  28.                Naechster_DPB           : Pointer;
  29.              END;
  30.  
  31. VAR
  32.   Laufwerk : Byte;
  33.   DPB      : DPB_Type;
  34.  
  35.  
  36.   FUNCTION  Anz_DPBs : BYTE;
  37.   TYPE
  38.     DPB_Zeiger = ^DPB_Type;
  39.   VAR
  40.     Akt_Zeiger : DPB_Zeiger;
  41.     DIB_Zeiger : Pointer;
  42.     Regs       : Registers;
  43.     Drives     : BYTE;
  44.   BEGIN
  45.     Regs.ah := $52;     (* ermittelt die Startadresse des *)
  46.     MSDos(Regs);        (* DOS-INFO-Blocks + 4 im         *)
  47.                         (* Registerpaar ES:BX             *)
  48.     Drives := 0;
  49.     DIB_Zeiger := Ptr(Regs.ES, Regs.BX);
  50.     Akt_Zeiger := DPB_Zeiger(DIB_Zeiger^);
  51.     WHILE (Ofs(Akt_Zeiger^) <> $FFFF) DO BEGIN
  52.                         (* solange noch weitere Laufwerke *)
  53.       Inc(Drives);
  54.       Akt_Zeiger := Akt_Zeiger^.Naechster_DPB
  55.     END;
  56.     Anz_DPBs := Drives;
  57.   END;
  58.  
  59.  
  60.   FUNCTION  Get_DPB(    LWNR : BYTE;
  61.                     VAR DPB  : DPB_Type) : BOOLEAN;
  62.   TYPE
  63.     DPB_Zeiger    = ^DPB_Type;
  64.   VAR
  65.     Akt_Zeiger : DPB_Zeiger;
  66.     DIB_Zeiger : Pointer;
  67.     Regs       : Registers;
  68.     Drives     : BYTE;
  69.     ok         : BOOLEAN;
  70.   BEGIN
  71.     Regs.AH := $52;
  72.     MSDos(Regs);
  73.     ok := (Regs.Flags AND FCarry) = 0;
  74.     IF ok THEN BEGIN
  75.       Drives := 1;
  76.       DIB_Zeiger := PTR(Regs.es, Regs.bx);
  77.       Akt_Zeiger := DPB_Zeiger(DIB_Zeiger^);
  78.       WHILE (Ofs(Akt_Zeiger^) <> $FFFF) AND
  79.             (Drives < LWNr) DO BEGIN
  80.         Inc(Drives);
  81.         Akt_Zeiger := Akt_Zeiger^.Naechster_DPB
  82.       END;
  83.     END;
  84.     IF (Drives = LWNr) AND ok THEN BEGIN
  85.       DPB := Akt_Zeiger^;
  86.       Get_DPB := TRUE
  87.     END ELSE
  88.       Get_DPB := FALSE;
  89.   END;
  90.  
  91.  
  92.   FUNCTION Get_DPB2(     LWNR : BYTE;
  93.                      VAR DPB  : DPB_Type) : BOOLEAN;
  94.   TYPE
  95.     DPB_Zeiger = ^DPB_Type;
  96.   VAR
  97.     Akt_Zeiger : DPB_Zeiger;
  98.     Regs       : Registers;
  99.     ok         : BOOLEAN;
  100.   BEGIN
  101.     Regs.dl := LWNR;
  102.     Regs.ah := $32;              (* undokumentierter Int! *)
  103.     MSDos(Regs);
  104.     ok := (Regs.Flags AND FCarry) = 0;
  105.     IF ok THEN BEGIN
  106.       Akt_Zeiger := Ptr(Regs.ds, Regs.bx);
  107.       DPB := Akt_Zeiger^;
  108.     END;
  109.     Get_DPB2 := ok;
  110.   END;
  111.  
  112. BEGIN
  113.   ClrScr;
  114.   WriteLn('<D>rive <P>arameter <B>lock Inhalte : ');
  115.   WriteLn('---------------------------------------------',
  116.           '-----------------------');
  117.   WriteLn('Laufwerk  Bytes  Sektoren  Anzahl  Sektoren  ',
  118.           'Interleave    Media');
  119.   WriteLn('           pro      pro     der      pro     ',
  120.           '  Faktor    Descriptor');
  121.   WriteLn('          Sektor  Cluster  FATs      FAT');
  122.   WriteLn('---------------------------------------------',
  123.           '-----------------------');
  124.   FOR Laufwerk := 1 TO Anz_DPBs DO BEGIN
  125.     IF Get_DPB2(Laufwerk, DPB) THEN WITH DPB DO BEGIN
  126.       WriteLn(' ', Chr(65 + Laufwerk_Nr), ':',
  127.               Bytes_pro_Sektor:11,
  128.               Sektoren_pro_Cluster:8,
  129.               Anzahl_FATs:8,
  130.               Sektoren_pro_FAT:10,
  131.               Interleave_Faktor:11,
  132.               Media_Descriptor:12);
  133.       END ELSE
  134.         WriteLn(' ', Chr(65 + Pred(Laufwerk)),
  135.                 ': kann nicht angesprochen werden, ',
  136.                 'evtl. keine Disk eingelegt ? ');
  137.   END;
  138.   WriteLn('--------------------------------------------',
  139.           '------------------------');
  140.   WriteLn(' irgendeine Taste ... ');
  141.   REPEAT UNTIL KeyPressed;
  142. END.
  143. (* ------------------------------------------------------ *)
  144. (*                 Ende von DPB.PAS                       *)
  145.