Contributor: ANDREW EIGUS

{
> What I need is a routine that will give back the letters of the active
> drives on a system.  Can anyone help me.
}
Program ListAvailableDrives;
(*
  Public Domain, (c) 1994 by Andrew Eigus   Fidonet: 2:5100/33 }
  These routines are taken from my EnhDOS unit where are lot of useful
  stuff.

  MATERIAL RELEASED FOR SWAG
*)

const
  { GetDriveType return values }

  dtError      = $00; { Bad drive }
  dtFixed      = $01; { Fixed drive }
  dtRemovable  = $02; { Removable (floppy) drive }
  dtRemote     = $03; { Remote (network) drive }
  dtCDROM      = $04; { CD-ROM V2.00+ drive }
  dtDblSpace   = $05; { DoubleSpace compressed drive }

Function GetDriveType(Drive : byte) : byte; assembler;
{ 0=current (default) drive,1=A,2=B,3=C... }
Asm
  cmp Drive,0
  jne @@1
  mov ah,19h
  int 21h
  mov Drive,al
  inc Drive
@@1:
  mov ax,1500h
  xor bx,bx
  int 2Fh
  or  bx,0      { works with CD-ROM v2.00+ }
  jz  @@2
  mov ax,150Bh
  xor ch,ch
  mov cl,Drive
  int 2Fh
  cmp bx,0ADADh
  jne @@2
  or  ax,0
  jz  @@2
  mov bl,dtCDROM
  jmp @@7
@@2:
  mov ax,4A11h
  mov bx,1
  mov dl,Drive
  dec dl
  int 2Fh
  xor cl,cl     { mov cl,False }
  or  ax,0      { is DoubleSpace loaded? }
  jnz @@3
  cmp dl,bl     { if a host drive equal to compressed, then get out... }
  je  @@3
  test bl,10000000b { bit 7=1: DL=compressed,BL=host
                           =0: DL=host,BL=compressed }
  jz  @@3       { so avoid host drives, assume host=fixed :) }
  inc dl
  cmp Drive,dl
  jne @@3
  mov bl,dtDblSpace
  jmp @@7
@@3:
  mov ax,4409h
  mov bl,Drive
  int 21h
  jc  @@5
  or  al,False
  jz  @@4
  mov bl,dtRemote
  jmp @@7
@@4:
  mov ax,4408h
  mov bl,Drive
  int 21h
  jc  @@5
  or  al,False
  jz  @@6
  mov bl,dtFixed
  jmp @@7
@@5:
  xor bl,bl     { mov bl,dtError cuz dtError=0 }
  jmp @@7
@@6:
  mov bl,dtRemovable
@@7:
  mov al,bl
End; { GetDriveType }

var
  Drive : byte;
  DriveType : byte;

Begin
  WriteLn(#13#10'Drives available:');
  WriteLn('-----------------------------');
  for Drive := (Ord('A') - Ord('A') + 1) to (Ord('Z') - Ord('A') + 1) do
  begin
    DriveType := GetDriveType(Drive);
    if DriveType <> dtError then
    begin
      Write('Drive ', Chr(Drive + Ord('A') - 1), ': ');
      case DriveType of
        dtRemovable: WriteLn('Removable (floppy)');
        dtFixed: WriteLn('Fixed (hard disk)');
        dtRemote: WriteLn('Remote (network)');
        dtCDROM: WriteLn('CD-ROM');
        dtDblSpace: WriteLn('DoubleSpace')
      end
    end
  end;
  WriteLn('-----------------------------')
End.