Contributor: ANDREW EIGUS             

{
 SA> Does anyone have any idea of how I can check the system hardware and
 SA> identify available hard drives and disk drives?
}



const
  { GetDriveType return values.  REQUIRES DOS 3.x or greater}

  dtError     = 0; { Drive physically isn't available }
  dtRemote    = 1; { Remote (network) disk drive }
  dtFixed     = 2; { Fixed (hard) disk drive }
  dtRemovable = 3; { Removable (floppy) disk drive }
  dtBadVer    = $FF; { Invalid DOS version (DOS 3.x required) }


Function GetDriveType(Drive : byte) : byte; assembler;
Asm
  MOV AH,30h
  INT 21h
  CMP AL,3
  JGE @@1
  MOV AL,dtBadVer
  JMP @@4
@@1:
  MOV BL,Drive
  MOV AX,4409h
  INT 21h
  JNC @@2
  MOV AL,dtError
  JMP @@5
@@2:
  CMP AL,True
  JNE @@3
  MOV AL,dtRemote
  JMP @@5
@@3:
  MOV AX,4408h
  INT 21h
  CMP AL,True
  JNE @@4
  MOV AL,dtFixed
  JMP @@5
@@4:
  MOV AL,dtRemovable
@@5:
End; { GetDriveType }

var
  Drive : byte;
  DT : byte;

Begin
  for Drive := 1 to 25 do
  begin
    DT := GetDriveType(Drive);
    if DT <> dtError then
    begin
      Write('Drive ', Chr(Drive + 64), ': ');
      case DT of
        dtRemote: WriteLn('Network drive');
        dtFixed: WriteLn('Hard disk');
        dtRemovable: WriteLn('Floppy drive')
      end
    end
  end
End.