Delphi Tips and Techniques 
 
 
Detect Drive Types 
 
 
LCHA41B@prodigy.com wrote: 
 
> I've been working on some routines to gather data about the disk drives 
> currently installed on a system, but there doesn't seem to be much 
> available in the way of system resources for this task.  My current 
 
Try this little piece of code... It will detect drive types. The only   
thing is: I don't know how to detect RAM drives (they are detected as   
hard disk drives). 
 
-- Matthias 
 
const 
  dtInvalid = 0; 
  dtFloppy = 1; 
  dtHardDisk = 2; 
  dtRamDrive = 3; 
  dtNetDrive = 4; 
  dtSubstDrive = 5; 
  dtCDROM = 6; 
 
function DriveValid(Drive: Char): Boolean; near; assembler; 
asm 
	MOV	AH,19H          { Save the current drive in BL } 
	INT	21H 
	MOV	BL,AL 
	MOV	DL,Drive	{ Select the given drive } 
	SUB	DL,'A' 
	MOV	AH,0EH 
	INT	21H 
	MOV	AH,19H		{ Retrieve what DOS thinks is current } 
	INT	21H 
	MOV	CX,0		{ Assume false } 
	CMP	AL,DL		{ Is the current drive the given drive? } 
	JNE	@@1 
	MOV	CX,1		{ It is, so the drive is valid } 
	MOV	DL,BL		{ Restore the old drive } 
	MOV	AH,0EH 
	INT	21H 
@@1:	XCHG	AX,CX		{ Put the return value into AX } 
end; 
 
function IsCDRom(Drive: Char): Boolean; near; assembler; 
var 
  map: array[0..25] of Byte; 
asm 
	mov	bx, ss 
	mov	es, bx 
	lea	bx, map 
	mov	di, bx 
	cld 
	mov	cx, 26/2 
	mov	ax, 0FFFFH 
	rep	stosw 
	mov	ax, 150DH 
	int	2FH 
	lea	di, map 
	mov	al, 1		{ Assume it is a CD ROM } 
	mov	dh, Drive 
	sub	dh, 'A' 
@@1: 
	mov	dl, es:[bx] 
	cmp	dl, dh 
	jz	@@0		{ Found drive letter } 
	inc	dl 
	jz	@@2		{ End of list } 
	inc	bx 
	jmp	@@1 
@@2: 
	mov	al, 0 
@@0: 
end; 
 
function IsFixed(Drive: Char): Boolean; near; assembler; 
asm 
	mov	ax, 4408H 
	mov	bl, Drive 
	sub	bl, 'A' - 1 
	int	21H 
	jnc	@@0 
	mov	al, 1		{ On error assume it's fixed } 
@@0: 
end; 
 
function IsRemote(Drive: Char): Boolean; near; assembler; 
asm 
	mov	ax, 4409H 
	mov	bl, Drive 
	sub	bl, 'A' - 1 
	int	21H 
	mov	al, 0		{ Assume it's not remote } 
	jc	@@0 
	shr	dx, 12		{ Get bit 12 } 
	mov	al, dl 
	and	al, 1 
@@0: 
end; 
 
function IsSubst(Drive: Char): Boolean; near; assembler; 
asm 
	mov	ax, 4409H 
	mov	bl, Drive 
	sub	bl, 'A' - 1 
	int	21H 
	mov	al, 0		{ Assume it's not remote } 
	jc	@@0 
	shr	dx, 15		{ Get bit 15 } 
	mov	al, dl 
	and	al, 1 
@@0: 
end; 
 
function GetDriveType(Drive: Char): Byte; 
begin 
  GetDriveType := dtInvalid; 
  if DriveValid(Drive) then 
    if IsSubst(Drive) then GetDriveType := dtSubstDrive else 
    if IsRemote(Drive) then GetDriveType := dtNetDrive else 
    if IsCDROM(Drive) then GetDriveType := dtCDROM else 
    if IsFixed(Drive) then GetDriveType := dtHardDisk else 
    GetDriveType := dtFloppy 
end; 
 
 
Matthias Koeppe              (currently out of witty quotes) 
mkoeppe@moose.boerde.de 
100331.174@compuserve.com 
 
 
 
