[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]
unit GetDrive;
interface
uses
Crt;
type
TFCB = Record
Drive: Byte;
Name: array[0..7] of Char;
Ext: array[0..2] of Char;
CurBlock: Word;
RecSize: Word;
FileSize: LongInt;
FileDate: Word;
FileTime: Word;
Reserved: array[0..7] of Char;
CurRec: Byte;
RandRec: LongInt;
end;
TDBP = Record
Drive: Byte;
AUnit: Byte;
SectorSize: Word;
Rest: array[0..28] of Byte;
end;
PDBP = ^TDBP;
procedure GetDrives;
implementation
var
Sx: array[0..80] of Char;
FCBx: TFCB;
DBP: PDBP;
function ISOK(Drive: Byte): Boolean; assembler;
asm
push ds
mov dl, Drive
mov ah, 32h
int 21h
cmp al, $FF
jz @error
mov cx, ds
mov es, cx
pop ds
mov word ptr DBP, bx
mov word ptr DBP + 2, es
mov al, 1
jmp @Ok
@error:
pop ds
mov al, 0
@Ok:
end;
function GetInfo: Boolean; assembler;
asm
push bp
push ds
mov si, seg Sx
mov ds, si
mov si, offset sx
mov di, seg FCBx
mov es, di
mov di, offset fcbx
mov al, 1
mov ah, 29h
int 21h
mov bl, al
mov ax, 1
cmp bl, $FF
jnz @Done
mov ax, 0
@Done:
pop ds
pop bp
end;
procedure GetDrives;
var
S1: String;
i: Integer;
bad: Boolean;
S: PChar;
begin
GetMem(S, 80);
S1 := 'c:*.*';
FillChar(FCBx, SizeOf(TFCB), #0);
for i := 0 to 25 do begin
S1[1] := Chr(i + 65);
move(S1[1], Sx, Length(S1));
S[Length(S1)] := #0;
Bad := GetInfo;
if bad then begin
Write(S1);
if (i = 0) or (i = 1) then
WriteLn(' -> Normal')
else
if IsOk(i+1) then WriteLn(' -> Normal')
else WriteLn(' -> Special');
end;
end;
FreeMem(S, 80);
end;
end.
{ ------------------------------- DEMO --------------------------- }
{
This code shows how to find information about which drives
exist on the system. It returns the information without
ever causing an error message to appear on screen.
}
program Drives;
uses
GetDrive,
Crt;
begin
ClrScr;
GetDrives;
ReadLn;
end.
[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]