home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / dos / diskinfo.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-05-13  |  4.9 KB  |  138 lines

  1. {$A+,B-,D-,E-,F-,G-,I-,N-,O-,P-,Q-,R-,S-,T-,V-,X-,M 4096,0,2048}
  2. (*===================================================================*)
  3. (*                     DISKINFO.PAS Version 2.00                     *)
  4. (*                Copyright (C) 1993 te-wi Verlag, München           *)
  5. (*-------------------------------------------------------------------*)
  6. (* Das Programm gibt alle im Bootsektor eines Laufwerks befindlichen *)
  7. (*              Informationen auf dem Bildschirm aus.                *)
  8. (*===================================================================*)
  9. {$IFNDEF DPMI}
  10. PROGRAM DiskInformation;
  11.  
  12. USES
  13.   Dos, UPPER, DOSUtil, Hex;
  14.  
  15. VAR
  16.   Buffer    : ARRAY[0..$200] OF BYTE;
  17.   BootBlock : tBootBlock ABSOLUTE Buffer;
  18.   i         : WORD;
  19.   Parameter : ComStr;
  20.   DrvChar   : CHAR;
  21.   result    : INTEGER;
  22.   Size      : REAL;
  23.   SizeStr   : STRING;
  24.   FSizeStr  : STRING;
  25.  
  26. CONST
  27.   Drive     : BYTE = 3;
  28.  
  29. BEGIN
  30.   WriteLn(^M^J'Bootsektor-Information Version 2.00, ' +
  31.         '(C) 1993 te-wi Verlag, München.');
  32.   IF ParamCount > 0 THEN
  33.   BEGIN
  34.     Parameter := UpString(ParamStr(1));
  35.     IF NOT (Parameter[1] IN ['A'..'Z', '?']) THEN
  36.       Delete(Parameter, 1, 1);
  37.     DrvChar := Parameter[1];
  38.     IF DrvChar IN ['A'..'Z'] THEN Drive := BYTE(Ord(DrvChar) - 64)
  39.     ELSE IF DrvChar = '?' THEN
  40.     BEGIN
  41.       WriteLn(^M^J'Aufruf:');
  42.       WriteLn(' DISKINFO [-][Laufwerk|?]');
  43.       WriteLn(' ''?'' zeigt diese Information an.');
  44.       WriteLn(' Es reicht, wenn der Laufwerksbuchstabe angegeben');
  45.       WriteLn(' wird. Ist kein Laufwerk angegeben, wird das erste');
  46.       WriteLn(' Plattenlaufwerk angezeigt.'^M^J);
  47.       Halt(0);
  48.     END;
  49.   END;
  50.  
  51.   result := ReadBootSector(Drive, Buffer);
  52.  
  53.   IF result <> 0 THEN
  54.   BEGIN
  55.     WriteLn('Fehler beim Lesen des Bootsektors von Laufwerk ',
  56.       Chr(Drive + 64), ':');
  57.       ExitCode := result;
  58.   END
  59.   ELSE
  60.   BEGIN
  61.     WriteLn(^J'Daten im Bootsektor von Laufwerk ',
  62.             Chr(Drive + 64), ':');
  63.     WriteLn('-----------------------------------');
  64.     WITH BootBlock DO
  65.     BEGIN
  66.       Write('OEM-Kennung           : ');
  67.       FOR i := 1 TO 8 DO
  68.         IF OEM[i] >= ' ' THEN Write(OEM[i]);
  69.       WriteLn;
  70.       WriteLn('Bytes pro Sektor      : ', Data.BytesPerSector);
  71.       WriteLn('Sektoren pro Cluster  : ', Data.SectorsPerCluster);
  72.       WriteLn('Bytes pro Cluster     : ', WORD(Data.SectorsPerCluster) *
  73.                                           WORD(Data.BytesPerSector));
  74.       WriteLn('Reservierte Sektoren  : ', Data.ReservedSectors);
  75.       WriteLn('Anzahl FATs           : ', Data.NumberOfFATs);
  76.       WriteLn('Anzahl Rooteinträge   : ', Data.RootEntries);
  77.       IF Data.TotalSectors <> 0 THEN BEGIN
  78.         WriteLn('Sektoren (12 Bit-FAT) : ', Data.TotalSectors);
  79.         Size := LONGINT(Data.TotalSectors) *
  80.                 LONGINT(Data.BytesPerSector) / 1024;
  81.       END
  82.       ELSE
  83.       BEGIN
  84.         WriteLn('Sektoren (16 Bit-FAT) : ', Data.BigTotalSectors);
  85.         Size := LONGINT(Data.BigTotalSectors) *
  86.                 LONGINT(Data.BytesPerSector) / 1024 / 1024;
  87.       END;
  88.       Str(Size:5:2, SizeStr);
  89.       IF Pos('.', SizeStr) > 0 THEN SizeStr[Pos('.', SizeStr)] := ',';
  90.       IF Data.MediaDescriptor = $F8 THEN BEGIN
  91.         WriteLn('Gesamtgröße in Mbytes : ', SizeStr);
  92.         Str(DiskFree(Drive) / 1024 / 1024: 3: 2, FSizeStr);
  93.         IF Pos('.', FSizeStr) > 0 THEN
  94.             FSizeStr[Pos('.', FSizeStr)] := ',';
  95.         WriteLn('Davon sind noch frei  : ', FSizeStr);
  96.       END
  97.       ELSE
  98.       BEGIN
  99.         WriteLn('Gesamtgröße in Kbytes : ', LONGINT(Data.TotalSectors)
  100.                                         * LONGINT(Data.BytesPerSector)
  101.                                         DIV 1024);
  102.         WriteLn('Davon sind noch frei  : ', DiskFree(Drive) DIV 1024);
  103.  
  104.       END;
  105.       WriteLn('Media-Descriptor-Byte : ',
  106.                                   Byte2Hex(Data.MediaDescriptor), 'h');
  107.       WriteLn('Sektoren pro FAT      : ', Data.SectorsPerFAT);
  108.       WriteLn('Sektoren pro Spur     : ', Data.SectorsPerTrack);
  109.       WriteLn('Schreib-/Lese-Köpfe   : ', Data.Heads);
  110.       IF Data.MediaDescriptor = $F8 THEN
  111.         WriteLn('Versteckte Sektoren   : ', Data.HiddenSectors)
  112.       ELSE
  113.         WriteLn('Versteckte Sektoren   : 0');
  114.       Write(^M^J'Disk-Label (DOS4)     : ');
  115.       FOR i := 1 TO 11 DO BEGIN
  116.         IF DiskLabel[i] IN ['A'..'Z', '0'..'9'] THEN
  117.           Write(DiskLabel[i]);
  118.       END;
  119.       WriteLn;
  120.       Write('FAT-ID     (DOS4)     : ');
  121.       FOR i := 1 TO 8 DO BEGIN
  122.         IF FatTypeText[i] IN [' ', 'A'..'Z', '0'..'9'] THEN
  123.           Write(FatTypeText[i]);
  124.       END;
  125.       IF Lo(DosVersion) < 4 THEN
  126.         WriteLn('Hier kann bei Ihrem DOS auch etwas anderes stehen');
  127.       WriteLn;
  128.     END;
  129.   END;
  130. {$ELSE}
  131. BEGIN
  132.    WriteLn('Dieses Programm wurde fälschlicherweise ' +
  133.            'im DPMI-Mode compiliert!');
  134. {$ENDIF}
  135. END.
  136.  
  137. (*===================================================================*)
  138.