
͸
                                                             
                        DISKINFO.ASM                         
             Disk-Informationen abfragen, V1.00              
                07.07.1993 Sven B. Schreiber                 
                                                             
;

DISKINFO ist ein Windows-Utility zum Abfragen von Seriennummer, 
Datentrgername   und  Dateisystemtyp   eines  Disketten-  oder 
Plattenlaufwerks.    Die  Parameter   werden   dem  erweiterten 
BIOS-Parameterblock  (XBPB)  des  Datentrgers  entnommen.  Die 
Ergebnisse  schreibt  DISKINFO in eine ANSI-Textdatei,  die das 
Format einer Windows-INI-Datei hat. Damit kann man DISKINFO als 
Server fr Anwendungen  verwenden, die selbst nicht in der Lage 
sind, DOS-interne Daten dieser Art selbst zu ermitteln. 

Der Programmaufruf kann folgende drei Formen annehmen:

     DISKINFO
     DISKINFO <Laufwerk>
     DISKINFO <Laufwerk> <Zieldatei>

Beim ersten Aufruftyp fragt DISKINFO die Parameter von Laufwerk 
C:  ab und schreibt die Ergebnisse in die Datei DISKINFO.INI im 
Windows-Verzeichnis  (normalerweise  C:\WINDOWS).  Beim zweiten 
Typ wertet DISKINFO  das angegebene  Laufwerk  aus.  Der dritte 
Aufruf  spezifiziert   noch  zustzlich   Pfad  und  Namen  der 
Zieldatei, die die Ergebnisse enthalten soll.  Ist nur ein Name 
ohne  Pfad  angegeben,  wird  die Datei  im Windows-Verzeichnis 
angelegt. 

Die Zieldatei sieht in etwa so aus:

     [C:]
     InfoLevel=0000
     SerialNumber=1616-1DDB
     VolumeLabel=SVEN_C
     FileSystem=FAT16

     [D:]
     InfoLevel=435B
     SerialNumber=3E14-1DD6
     VolumeLabel=SVEN_D
     FileSystem=FAT16

In  diesem  Beispiel   wurde  DISKINFO  zweimal  hintereinander 
aufgerufen, einmal mit C:  und einmal mit D: als Parameter. Die 
resultierende Datei C:\WINDOWS\DISKINFO.INI  enthlt daher zwei 
Eintrge,   je  einen   pro  untersuchtes   Laufwerk.    Andere 
Anwendungen knnen diese Datei nun mit der Profildatei-Funktion 
GetPrivateProfileString() des Windows-API auswerten. 

Das Programm  eignet  sich z.B.  zum Abfragen  der Seriennummer 
eines Datentrgers von einem WinWord-Makro aus.  Die beigefgte 
Datei DISKINFO.MAC  enthlt ein kleines Beispiel,  das erst den 
Laufwerksnamen  abfragt  und dann  die Parameter  des Laufwerks 
anzeigt. 

DISKINFO  ermittelt   die  Disk-Informationen   mit  Hilfe  der 
undokumentierten DOS-Funktion 69h (Get/Set Disk Serial Number), 
die im wesentlichen  das gleiche wie die Unterfunktion  66h der 
DOS-Funktion 440Dh macht (IOCTL - Generic Block Device Request: 
Get Media ID). Beide Funktionen erwarten eine MID-Struktur, die 
auf  Seite  48  der  Microsoft  MS-DOS  Programmer's  Reference 
(Version 5) beschrieben ist: 

     MID STRUC
         midInfoLevel   dw  0            ;information level
         midSerialNum   dd  ?            ;serial number
         midVolLabel    db  11 dup (?)   ;ASCII volume label
         midFileSysType db  8 dup (?)    ;file system type
     MID ENDS

Der Wert des Infolevel-Felds  mu beim Aufruf gleich Null sein. 
Nach der Rckkehr knnen sich dort recht unterschiedliche Werte 
befinden, deren Bedeutung offenbar nicht dokumentiert ist.  Bei 
der  Auswertung  des Datentrgernamens  (Volume  Label)  ist zu 
beachten,  da DISKINFO zuweilen andere Werte als der DIR- oder 
LABEL-Befehl  liefert (in diesem Fall meistens "NO NAME").  Das 
liegt daran, da DISKINFO den Namen aus dem XBPB, nicht aus dem 
Inhaltsverzeichnis  des Datentrgers  holt.  Zuweilen  kommt es 
auch vor, da DISKINFO bei bestimmten Disketten "Laufwerk nicht 
vorhanden"  meldet.   Dies bedeutet,  da die DOS-Funktion  69h 
einen  Fehler  gemeldet  hat.  Eine Behandlung  mit QuickFormat 
schafft hier blicherweise Abhilfe. 

Funktion  69h  unterscheidet  sich  von der Funktion  440Dh/66h 
lediglich  darin,  da die Aufrufkonventionen  etwas  einfacher 
sind. Die Funktion 440Dh ist eine aufwendige Mehrzweckfunktion, 
bei der "Get Media ID" nur einer von vielen  Diensten  ist.  Da 
beide Funktionen  gleichermaen  von Windows  nicht untersttzt 
werden,  ist es relativ  egal, fr welche  von beiden  man sich 
entscheidet.   Beide  existieren  seit der DOS-Version  4.  Die 
Funktion  440Dh/66h  ist seit der Version 5 dokumentiert,  wird 
aber dennoch nicht von Windows 3.1 untersttzt. 

Wie bei allen Real-Mode-Interupts,  die im Protected Mode unter 
Windows  nicht  wie  gewohnt  funktionieren,  mu  man  das DOS 
Protected  Mode Interface  (DPMI,  INT 31h) bemhen,  um an die 
fehlende Funktionalitt heranzukommen.   Hierzu stellt das DPMI 
die  Funktion   0300h   zur  Verfgung   (Simulate   Real  Mode 
Interrupt).    Sie  umgeht  den  Protected-Mode-Handler   eines 
Interrupts und ruft direkt den Real-Mode-Handler auf.  Dies ist 
der  typischerweise   beschrittene   Weg,   um  undokumentierte 
DOS-Funktionen unter Windows zu benutzen. 

08.07.1993 Sven B. Schreiber
SBS@PARABOL.ZER
