Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
54
Добавлен:
03.06.2014
Размер:
2.63 Mб
Скачать

Команды драйвера cd-rom

В этом разделе мы расскажем о командах драйвера CD-ROM. Заметим, что в рамках одной команды может выполняться несколько функций. Код функции при этом записывается в расширение загловка запроса.

Инициализация

Команда инициализации вызывается из MS-DOS только один раз.

Ниже мы привели формат заголовка запроса для этой команды:

// ---------------

// Код команды 0

// ---------------

#pragma pack(1)

typedef struct _Init

{

ReqHdr rh;

BYTE bNumberOfUnits;

DWORD lpEndAddress;

DWORD lpAddressOfBPB;

BYTE bNumberOfBlockDevice;

} Init;

После выполнения команды поля структуры заполняются драйвером следующим образом:

Поле

Описание

rh.wStatus

Слово состояния

bNumberOfUnits

Количество устройств, обслуживаемых драйвером. Равно 0

lpEndAddress

Конечный адрес резидентной порции драйвера в оперативной памяти

lpAddressOfBPB

Указатель на символ = в строке файла CONFIG.SYS, с помощью которой загружен драйверCD-ROM. Может быть использован для анализа параметров драйвера

bNumberOfBlockDevice

Равно 0

ЧтениеIoctl Input

При помощи команды IOCTL Input программа может получить от драйвера самую разную информацию, начиная от адреса заголовка драйвера и заканчивая информацией о дорожках диска.

Формат заголовка запроса:

// ---------------

// Код команды 3

// ---------------

#pragma pack(1)

typedef struct _IOCTL_Input

{

ReqHdr rh;

BYTE bMediaDescriptor;

DWORD lpTransferAddress;

WORD wDataSize;

WORD wStartSector;

DWORD lpVolID;

} IOCTL_Input;

Заполнение полей заголовка запроса:

Поле

Описание

rh.wStatus

После вызова драйвера содержит слово состояния

bMediaDescriptor

Байт описания среды носителя данных

lpTransferAddress

Адрес буфера

wDataSize

Размер буфера

wStartSector

Номер начального сектора

lpVolID

Указатель на идентификатор тома, если при выполнении команды возникла ошибка с кодом 0Fh

Команда IOCTL Input может выполнять много функций. Перед вызовом драйвера вы должны подготовить заголовок функции, указав в одном из его полей код выполняемой функции. Адрес и размер этой структуры необходимо записать в поля lpTransferAddress и wDataSize, соответственно.

Рассмотрим форматы заголовков различных функций, выполняемых в рамках команды IOCTL Input.

Определение адреса заголовка драйвера cd-rom

// ---------------

// Код функции 0

// ---------------

#pragma pack(1)

typedef struct _RAddr

{

BYTEbFunctionCode;

DWORD lpDeviceHeader;

} RAddr;

Поле

Описание

bFunctionCode

Код функции

lpDeviceHeader

Адрес заголовка драйвера CD-ROM

Зная адрес заголовка драйвера, вы можете определить имя драйвера и его атрибуты. Подробности об атрибутах драйверов вы найдете в 18 томе «Библиотеки системного програмиста».

Определение положения головки

// ---------------

// Код функции 1

// ---------------

#pragma pack(1)

typedef struct _HeadLocation

{

BYTEbFunctionCode;

BYTEbAddressMode;

DWORD lpHeadLocation;

} HeadLocation;

Поле

Описание

bFunctionCode

Код функции

bAddressMode

Режим адресации:

0 – HSG;

1 – Redbook;

2 – 255 – зарезервировано

lpHeadLocation

Положении головки. Значение зависит от режима адресации

Здесь необходимо сделать замечание относительно режимов адресации.

По умолчанию устройство чтения CD-ROM находится в режиме адресацииHSG, описанный в стандартеHigh Sierra. При этом в качестве адреса указывается логический номер блока.

Другой режим адресации описан в стандарте Redbook. В нем адрес представляет собой набор из трех значений: минуты(MIN), секунды(SEC), фреймы (FRAME). Каждое значение занимает один байт, причем в младшем байте хранится значениеFRAME, в следующем байте - значение SEC, и в последнем, третьем байте, - значение MIN.

С помощью следующей формулы вы можете преобразовать адрес из формата Redbook в форматHSG:

SECTOR = MIN * 60 * 75 + SEC * 75 + FRAME – 150

Соседние файлы в папке несколько программ