logo
несколько программ / bsp33

Заголовок запроса

Структура и размер заголовка запроса зависит от кода выполняемой команды, однако начальная часть заголовка всегда одна и та же. Для удобства формирования заголовка запроса мы подготовили структуру ReqHdr, соответствующую начальной части заголовка запроса, а также структуры для всех основных команд.

Определение структуры ReqHdr приведено ниже:

typedef unsigned char BYTE;

typedef unsigned int WORD;

typedef unsigned longDWORD;

#pragma pack(1)

typedef struct _ReqHdr

{

BYTE bSize; // размер заголовка запроса в байтах

BYTE bSubUnit; // номер устройства subunit

BYTE bCmd; // код команды

WORD wStatus; // слово состояния

BYTE bReserved[8]; // зарезервировано

} ReqHdr;

Для удобства мы такжеопределили типы BYTE, WORD и DWORD, которыми будем пользоваться в этой главе.

Поле bSize должно содержать общий размер заголовка запроса, который складывается из размера структуры ReqHdr и размера дополнительной структуры, формат которой зависит от кода команды.

В поле bSubUnit необходиом занести номер устройства, обслуживаемого данным драйвером. Этот номер нетрудно определить с помощью функции 01h расширенияMSCDEX.EXE.

В поле bCmd необходимо записать код команды, которую должен выполнить драйвер. Коды и описание команд мы приведем ниже.

После выполнения команды драйвер записывает в поле wStatus слово состояния, по которому можно судить о результате выполнения.

Формат слова состояния:

Поле

Описание

0-7

Код ошибки (если в слове состояния установлен бит 15)

8

Выполнение команды завершено

9

Устройство занято

10-14

Зарезервировано

15

При выполнении команды произошла ошибка

Если команда выполнилась (с ошибкой или без ошибки), в слове состояния установлен бит 8.

При возникновении ошибки также устанавливается бит 15. При этом в поле 0-7 находится код ошибки.

Список кодов ошибок приведен ниже:

Код ошибки

Описание

00h

Защита записи

01h

Неизвестное устройство

02h

Устройство не готово

03h

Неизвестная команда

04h

Ошибка циклической контрольной суммы CRC

05h

Неправильная длина структуры запроа

06h

Ошибка при поиске

07h

Неизвестный носитель данных

08h

Сектор не найден

09h

В принтере нет бумаги

0Ah

Ошиба при записи

0Bh

Ошибка при чтении

0Ch

Общая ошибка

0Dh

Зарезервировано

0Eh

Зарезервировано

0Fh

Неправильная смена диска

Здесь приведены коды ошибок не только для устройства чтения CD-ROM, но и для других устройств (например, для принтера).