[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]
{
KB> How do get the disk size or the total clusters on a CD-ROM?
}
program CD_Info;
uses crt, dos;
Type tReq_Blk = Array[0..255] of Byte;
tReq_Hdr = Array[0..017] of Word;
Const MSCDEX_GETDRIVES = $1500;
MSCDEX_GETVERSION = $150C;
MSCDEX_DRIVER_REQ = $1510;
MSCDEX_GetSecSize = 7;
MSCDEX_GetVolSize = 8;
RAW_DATA = 1;
Var CPU : Registers;
Akt, Cnt, First : byte;
Req_Hdr : tReq_Hdr;
Req_Blk : tReq_Blk;
SecSize : word;
VolBytes : real;
VolSize : LongInt;
function CallDriver( Var R: Registers ):byte;
begin
Intr($2F, R);
if (R.FLAGS and FCARRY) <> 0
then CallDriver := R.AL
else CallDriver := 0;
end;
begin
writeln; writeln;
writeln(' CD-ROM Info v1.0 (c) Norbert Igl 1994 ');
writeln;
With CPU do
begin
FillChar( CPU, Sizeof( CPU ), 0);
AX := MSCDEX_GETVERSION;
If CallDriver( CPU ) <> 0 then
begin
writeln(' MSCDEX not installed ... ');
halt(1);
end
else begin
writeln(' MSCDEX Version : ',Hi(BX),'.',Lo(BX):2 );
end;
FillChar( CPU, Sizeof( CPU ), 0);
AX := MSCDEX_GETDRIVES;
If CallDriver( CPU ) <> 0 then
begin
writeln(' GETDRIVES Error : ',Lo(AX) );
halt(2);
end
else begin
Cnt := BX;
First := CX;
write(' Installed Drives : ',Cnt,' ( ');
write( CHAR( 65+first ),':');
if Cnt > 1 then
write(' .. ', CHAR( 64+first+cnt),':');
writeln(' )');
end;
For Akt := First to First+Cnt-1 do
begin
FillChar( CPU, Sizeof( CPU ), 0);
FillChar( Req_Blk, Sizeof( Req_Blk ), 0);
FillChar( Req_Hdr, Sizeof( Req_Hdr ), 0);
Req_Hdr[0] := $000D; { length of req_hdr }
Req_Hdr[1] := $0003; { IOCTL_READ }
Req_Hdr[7] := Ofs(Req_Blk);
Req_Hdr[8] := Seg(Req_Blk);
Req_Hdr[9] := $0004;
Req_Blk[0] := MSCDEX_GetSecSize;
AX := MSCDEX_DRIVER_REQ;
CX := Akt;
ES := SEG( Req_Hdr );
BX := OFS( Req_Hdr );
If CallDriver( CPU ) <> 0 then
begin
writeln(' GetSecSize Drive(',Char(Akt+65),') Error : ',Lo(AX) );
end
else Move(Req_Blk[2], SecSize, 2);
FillChar( CPU, Sizeof( CPU ), 0);
FillChar( Req_Blk, Sizeof( Req_Blk ), 0);
FillChar( Req_Hdr, Sizeof( Req_Hdr ), 0);
Req_Hdr[0] := $000D; { length of req_hdr }
Req_Hdr[1] := $0003; { IOCTL_READ }
Req_Hdr[7] := Ofs(Req_Blk);
Req_Hdr[8] := Seg(Req_Blk);
Req_Hdr[9] := $0005;
Req_Blk[0] := MSCDEX_GetVolSize;;
AX := MSCDEX_DRIVER_REQ;
CX := Akt;
ES := SEG( Req_Hdr );
BX := OFS( Req_Hdr );
If CallDriver( CPU ) <> 0 then
begin
writeln(' GetVolSize Drive(',Char(Akt+65),') Error : ',Lo(AX) );
end
else Move(Req_Blk[1], VolSize, 4);
VolBytes := VolSize;
if VolBytes < 0 then
begin
VolSize := ( VolSize shr 1 );
VolBytes := Volsize;
VolBytes := VolBytes*2;
end;
VolBytes := Volbytes * SecSize;
VolBytes := Volbytes / ( 1024*1024 );
Writeln(' Disk in Drive ',Char(Akt+65),' : ',VolBytes:6:2 ,' MB ');
end;
end
end.
[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]