home *** CD-ROM | disk | FTP | other *** search
- PROGRAM PWD; {Print Working Directories on all valid drives.
-
- (C) Copyright 1989, Earl F. Glynn, Overland Park, KS. Compuserve: 73257,3527
- All Rights Reserved. Version 1.0, 14 June 1989. This program may be
- freely distributed for non-commerical use.
-
- Information about the Disk Parameter Block and what I have termed the
- "Drive Array" was found in the public domain program SYSID.PAS by
- Steve Grant, Long Beach, CA. I prefer to use RECORDs and pointers to
- access this information instead of the MEM and MEMW Turbo Pascal "arrays".}
-
- USES DOS; {INTR}
-
- TYPE
- DiskParameterBlockPointer = ^DiskParameterBlock;
- DiskParameterBlock =
- RECORD { offset }
- misc1 : BYTE; { 0 $00 }
- driveunit : BYTE; { 1 $01 }
- BytesPerSector : WORD; { 2 $02 }
- SectorsPerCluster : BYTE; { 4 $04 }
- ClusterToSectorShift: BYTE; { 5 $05 }
- ReservedSectors : WORD; { 6 $06 }
- FATs : BYTE; { 8 $08 }
- RootDirectoryEntries: WORD; { 9 $09 }
- FirstDataSector : WORD; { 11 $0B }
- Clusters : WORD; { 13 $0D }
- SectorsPerFAT : BYTE; { 15 $0F }
- RootDirectorySector : WORD; { 16 $10 }
- DeviceHeader : pointer; { 18 $12 }
- MediaType : BYTE; { 22 $16 }
- Valid : BYTE; { 23 $17 }
- NextDPB : pointer { 24 $18 }
- END;
-
- DriveArrayPointer = ^DriveArray;
- DriveArray =
- RECORD
- DefaultDirectory: ARRAY[1..69] OF CHAR; {ASCIIZ string}
- DPB : DiskParameterBlockPointer;
- END;
-
- DOSListOfLists =
- RECORD { offset }
- FirstMCBSegment : WORD; { -2 -$02 }
- misc1 : ARRAY[1..16] OF BYTE; { 0 $00 }
- MaxBytesPerBlock: WORD; { 16 $10 }
- misc2 : ARRAY[1..4] OF BYTE; { 18 $12 }
- BaseDA : DriveArrayPointer; { 22 $16 }
- misc3 : ARRAY[1..7] OF BYTE; { 26 $1A }
- LastDrive : BYTE { 33 $21 }
- END;
-
- VAR
- c : CHAR;
- DA : DriveArrayPointer;
- DPB : DiskParameterBlockPointer;
- drive: WORD;
- i : WORD;
- LoL : ^DOSListOfLists;
- r : Registers;
-
- BEGIN
- WRITELN ('Working Directories:');
- r.AH := $52;
- Intr ($21,r); {Undocumented DOS function}
- LoL := Ptr(r.ES,r.BX-2); {DOS List of Lists - 2}
- DA := LoL^.BaseDA; {First Drive Array entry}
- drive := 1;
- REPEAT
- DPB := DA^.DPB; {Disk Parameter Block}
- IF DPB^.valid = 0 {Is this drive valid?}
- THEN BEGIN
- WRITE (' ');
- i := 1;
- c := DA^.DefaultDirectory[i]; {Output working directory}
- WHILE c > #$00 DO BEGIN {Look for end of ASCIIZ string}
- WRITE (c);
- INC (i);
- c := DA^.DefaultDirectory[i]
- END;
- WRITELN
- END;
- INC (drive);
- DA := Ptr(Seg(DA^), Ofs(DA^)+$51) {Next Drive Array entry}
- UNTIL (Seg(DPB^.NextDPB^) = $FFFF) OR (drive > LoL^.LastDrive)
- END {PWD}.