Заголовок запроса
Структура и размер заголовка запроса зависит от кода выполняемой команды, однако начальная часть заголовка всегда одна и та же. Для удобства формирования заголовка запроса мы подготовили структуру 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, но и для других устройств (например, для принтера).