[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]
{
JM>Would you happen to have any example code to determine if a drive is a
JM>hard disk, cd-rom, ramdrive etc. ?
Here is a unit that will at least tell you a little about the CD-ROM. Not all
MSCDEX functions are implemented, but enough to identify the CD-ROMS.
}
unit CDROM;
{$X+} { Extended Syntax Rules }
interface
type
CDR_DL_ENTRY = record
UNITNO : byte;
OFFSET : word;
SEGMENT : word;
end;
CDR_DL_BUFFER = array[1..26] of CDR_DL_ENTRY;
CDR_DRIVE_UNITS = array[0..25] of byte;
CDR_VTOC = array[1..2048] of byte;
{ 00h } procedure CDR_GET_DRIVE_COUNT (var COUNT, FIRST: word);
{ 01h } procedure CDR_GET_DRIVE_LIST (var LIST: CDR_DL_BUFFER);
{ 02h } function CDR_GET_COPR_NAME (DRIVE: byte): string;
{ 03h } function CDR_GET_ABSTRACT_NAME (DRIVE: byte): string;
{ 04h } function CDR_GET_BIBLIO_NAME (DRIVE: byte): string;
{ 05h Read VTOC }
{ 06h Reserved }
{ 07h Reserved }
{ 08h Absolute Disk Read }
{ 09h Absolute Disk Write }
{ 0ah Reserved }
{ 0bh } function CDR_DRIVE_CHECK (DRIVE: byte): boolean;
{ 0ch } function CDR_VERSION: word;
{ 0dh } procedure CDR_GET_DRIVE_UNITS (var BUFFER: CDR_DRIVE_UNITS);
{ 0eh Get or Set VDR }
{ 0fh Get Dir Entry }
{ 10h Send Device Request }
implementation
uses dos, strings;
const
CDROM_INTERRUPT = $2f;
var
REG : registers;
procedure CDR_GET_DRIVE_COUNT (var COUNT, FIRST: word);
assembler;
{ Returns the total number of CD-ROM Drives in the system }
{ and the logical drive number of the first drive. }
{ In a system that contains multiple CD-ROM Drives and is }
{ also networked, the CD-ROM drives might not be assigned }
{ as consecutive logical units. See also MSCDEX Function }
{ 0Dh (Get CD-ROM Drive Letters) }
asm
mov ax, 1500h
xor bx, bx
int CDROM_INTERRUPT
les di, COUNT
mov es:[di], bx
les di, FIRST
mov es:[di], cx
end;
procedure CDR_GET_DRIVE_LIST (var LIST: CDR_DL_BUFFER);
assembler;
{ Returns a driver unit identifier for each CD-ROM drive }
{ in the system, along with the address of the header for }
{ the device driver that controls the drive. }
{ The driver unit code returned in the buffer is not the }
{ systemwide logical drive identifier but is the relative }
{ unit for that particular driver. For example if three }
{ CD-ROM drivers are installed, each supporting one phy- }
{ sical drive, the driver unit code in each 5 byte entry }
{ will be 0. The systemwide drive identifiers for each }
{ CD-ROM unit can be obtained with MSCDEX Function 0Dh }
{ (Get CD-ROM Drive Letters). }
asm
mov ax, 1501h
les bx, LIST
int CDROM_INTERRUPT
end;
function CDR_GET_COPR_NAME (DRIVE: byte): string;
{ Returns the name of the copyright file from the volume }
{ table of contents (VTOC) of the specified CD-ROM Drive. }
{ CD-ROM Specs allow for a 31 character filename followed }
{ by a semicolon (;) and a 5 digit version number. }
{ On disks that comply with the High Sierra standard, }
{ the filename has an MS-DOS compatable (8/3) format. }
var
BUFFER : array[0..38] of char;
begin
REG.AX := $1502;
REG.CX := DRIVE;
REG.ES := seg(BUFFER);
REG.BX := ofs(BUFFER);
intr(CDROM_INTERRUPT, REG);
CDR_GET_COPR_NAME := strpas(BUFFER);
end;
function CDR_GET_ABSTRACT_NAME (DRIVE: byte): string;
{ Returns the name of the abstract file from the volume }
{ table of contents (VTOC) for the specified CD-ROM drive.}
{ CD-ROM Specs allow for a 31 character filename followed }
{ by a semicolon (;) and a 5 digit version number. }
{ On disks that comply with the High Sierra standard, }
{ the filename has an MS-DOS compatable (8/3) format. }
var
BUFFER : array[0..38] of char;
begin
REG.AX := $1503;
REG.CX := DRIVE;
REG.ES := seg(BUFFER);
REG.BX := ofs(BUFFER);
intr(CDROM_INTERRUPT, REG);
CDR_GET_ABSTRACT_NAME := strpas(BUFFER);
end;
function CDR_GET_BIBLIO_NAME (DRIVE: byte): string;
{ Returns the name if the bibliographic file from the }
{ volume table of contents (VTOC) for the specified drive.}
{ CD-ROM Specs allow for a 31 character filename followed }
{ by a semicolon (;) and a 5 digit version number. }
{ This function is provided for compatability with the }
{ ISO-9660 standard. A null string is returned for disks }
{ complying with the High Sierra standard. }
var
BUFFER : array[0..38] of char;
begin
REG.AX := $1504;
REG.CX := DRIVE;
REG.ES := seg(BUFFER);
REG.BX := ofs(BUFFER);
intr(CDROM_INTERRUPT, REG);
CDR_GET_BIBLIO_NAME := strpas(BUFFER);
end;
function CDR_DRIVE_CHECK (DRIVE: byte): boolean;
{ Returns a code indicating whether a particular logical }
{ unit is supported by the Microsoft CD-ROM Extensions }
{ module (MSCDEX). }
begin
REG.AX := $150b;
REG.BX := $0000;
REG.CX := DRIVE;
intr(CDROM_INTERRUPT, REG);
CDR_DRIVE_CHECK := (REG.AX <> $0000) and (REG.BX = $adad);
end;
function CDR_VERSION: word;
{ Returns the version number of the Microsoft CD-ROM Extensions }
{ The Major Version number is returned in the High Order byte }
{ and the Minor Version Number is returned in the Lo order }
{ byte. IE if the MSCDEX Version is 2.10, this routine will }
{ return $0210. }
begin
REG.AX := $150c;
REG.BX := $0000;
intr(CDROM_INTERRUPT, REG);
{ Version 1.0 Returns 0 instead of actual Version Number }
{ So we will fix it so that this routine returns 1.0 }
if REG.BX = 0 then begin
CDR_VERSION := $0100;
end else begin
CDR_VERSION := REG.BX;
end;
end;
procedure CDR_GET_DRIVE_UNITS(var BUFFER: CDR_DRIVE_UNITS);
assembler;
{ Returns a list of the systemwide logical drive identifers }
{ that are assigned to CD-ROM drives. }
{ Upon return the buffer contains a series of 1 byte entries. }
{ Each entry is a logical unit code assigned to a CD-ROM drive }
{ (0 = A, 1 = B, etc); the units might not be consecutive. }
{ The number of valid entries can be determined by MSCDEX }
{ function 00h. }
asm
mov ax, 150dh
les bx, BUFFER
int CDROM_INTERRUPT
end;
end.
[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]