Электронная библиотека книг Александра Фролова и Григория Фролова.
 
Библиотека
Братьев
Фроловых
Электронная библиотека книг Александра Фролова и Григория Фролова.
Библиотека системного программиста
Программирование на JAVA
ПК. Шаг за шагом
Другие книги
Восстановление данных
Антивирусная защита
Статьи для
программистов
Пользователю компьютера

Аппаратное обеспечение персонального компьютера

© Александр Фролов, Григорий Фролов
Том 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 слово состояния, по которому можно судить о результате выполнения.

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

Поле

Описание

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, но и для других устройств (например, для принтера).

[Назад] [Содеожание] [Дальше]


Создание интернет-магазинов: http://www.shop2you.ru/ © Александр Фролов, Григорий Фролов, 1991-2016