{ Updated DRIVES.SWG on October 13, 1993 } { This give all the info on a bootable drive } { it replaces the EXIST-DD in DRIVES.SWG which DID NOT work } { updated by GDAVIS 10/13/93 } Uses Crt,Dos; Type bootrecptr = ^bootRecord; bootRecord = Record nj : Array[0..2] of Byte; {offset 0 Near jump code } oem : Array[0..7] of Byte; { 3 OEM name and ver } Bytesec : Word; { 11 Bytes/Sector } sectclus : Byte; { 13 Sectors/cluster } ressect : Word; { 14 Reserved sectors } fattables: Byte; { 16 FAT tables } direntrys: Word; { 17 Directory entries} logsec : Word; { 19 Logical sectors } MDS : Byte; { 21 Media descriptor } FatSects : Word; { 22 FAT sectors } Secstrak : Word; { 24 Sectors/track } NumHeads : Word; { 26 Number of heads } HidnSecs : Word; { 28 Hidden sectors } bootcode : Array[0..415] of Byte; { 30 boot code } partcode : Array[0..15] of Byte; { 446 partition info } bootcode2: Array[0..49] of Byte; { 462 rest of boot code} end; Var boot : bootRecord; { the boot Record Variable } FUNCTION DiskRead (Drive : CHAR; SSect, NSect : WORD; VAR Buffer) : WORD; { Read absolute disk sectors } VAR kbuff : ARRAY [0..$1f] OF BYTE; {Read Ralf Brown's interrupt listing} kPtr : POINTER; {Int 25h - ES:[BP+1E] may change } bufPtr : POINTER; BEGIN kPtr := @kbuff; BufPtr := @buffer; Asm push es push bp push di les di, kPtr { move past first 31 bytes } mov al, drive { Gets the passed parameter. } AND al, 1fh { Cvt from ASCII to drive num } DEC al { Adjust because A: is drive 0 } mov cx, nsect { number of sectors to read } mov dx, ssect { starting at sector.. } push ds lds bx, bufptr { Get the address of the buffer } mov bp, di push si INT 25h { Do the drive read. } pop si { Remove the flags int 25h leaves on stack} pop si pop ds pop di pop bp pop es jc @1 mov @result, 0 { No errors, so set Function to zero } jmp @Escape @1 : mov @result, ax @Escape : END; END; Procedure bootlook(Drive : Char); Var ReadResult : WORD; I : Integer; begin { Get diskette info } ReadResult := DiskRead(Drive,0,1,boot); if ReadResult <> 0 then begin { Error code here , there are LOTS of them.. see a good DOS book most common will be : 2 = Drive NOT ready 7 = unknown media .. not a boot disk 8 = sector not found .. not a boot disk } Writeln(LO(ReadResult)); end else begin WITH Boot DO BEGIN { I'll just print a few of the possible items } Write('OEM : '); FOR I := 0 TO 7 DO WRITE(CHR(OEM[i])); Writeln; WriteLn('Dir Entrys : ',DirEntrys : 4); WriteLn('Fat Tables : ',FatTables : 4); WriteLn('Num Heads : ',NumHeads : 4); WriteLn('Secs p/Trk : ',SecsTrak : 4); WriteLn('Hidden Secs : ',HidnSecs : 4); END; end; end; { Procedure bootlook } BEGIN ClrScr; BootLook('B'); { if drive isn't bootable, you'll get an error (7) } Readkey; { try it, this is a safe procedure } END.