Структура и размер заголовка запроса зависит от кода выполняемой команды, однако начальная часть заголовка всегда одна и та же. Для удобства формирования заголовка запроса мы подготовили структуру ReqHdr, соответствующую начальной части заголовка запроса, а также структуры для всех основных команд.
Определение структуры ReqHdr приведено ниже:
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
#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, но и для других устройств (например, для принтера).