Аппаратное обеспечение персонального компьютера© Александр Фролов, Григорий ФроловТом 33, М.: Диалог-МИФИ, 1997, 304 стр. Работа через драйвер CD-ROMПеред тем как приступить к чтению этого раздела, мы рекомендуем вам обратиться к 6 главе 18 тома “Библиотеки системного программиста”, которая называется “Драйверы”. В ней мы привели минимум сведений, которые необходимы для создания собственных драйверов устройств, а также для работы с уже имеющимися драйверами. Напомним, что после загрузки драйвер становится частью операционной системы. Прикладные программы не вызывают драйвер напрямую, а пользуются для вызова драйвера функциями операционной системы. Внутри драйвера есть две функции, одна из которых называется программой стратегии, другая – программой прерывания. Задача программы стратегии – сохранение в области данных драйвера адреса заголовка запроса, который подготавливается для драйвера операционной системой и выполняется программой прерывания. Как найти адреса этих программ? Они есть в заголовке драйвера, который, однако, тоже еще нужно найти. Операционная система MS-DOS не имеет в своем составе документированных средств для поиска заголовков драйверов. В 18 томе “Библиотеки системного программиста” мы описали, как это можно сделать с применением недокументированной векторной таблицы связи MS-DOS. Однако для вызова драйвера устройства чтения CD-ROM вам не потребуются недокументированные средства, а также прямые вызовы программ стратегии и прерывания. С помощью описанной выше функции 10h расширения MSCDEX.EXE вы можете передавать драйверу заголовки запросов вполне документированным способом. Заголовок запросаСтруктура и размер заголовка запроса зависит от кода выполняемой команды, однако начальная часть заголовка всегда одна и та же. Для удобства формирования заголовка запроса мы подготовили структуру 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 слово состояния, по которому можно судить о результате выполнения. Формат слова состояния:
Если команда выполнилась (с ошибкой или без ошибки), в слове состояния установлен бит 8. При возникновении ошибки также устанавливается бит 15. При этом в поле 0-7 находится код ошибки. Список кодов ошибок приведен ниже:
Здесь приведены коды ошибок не только для устройства чтения CD-ROM, но и для других устройств (например, для принтера). |