Драйвер устройства dos
Устанавливаемый драйвер устройства - это программа в специальном формате, загружаемая в память во время загрузки DOS. Программа драйвера устройства состоит из следующих основных частей:
· заголовка устройства,
· рабочей области драйвера,
· локальных процедур,
· процедуры СТРАТЕГИЯ,
· процедуры ПРЕРЫВАНИЕ,
· программ обработки команд DOS.
Первой частью файла должна быть 18-байтовая структура - заголовок устройства, структура которого приведена ниже. Поле Next_Device, имеющее при загрузке значение смещения –1 (0ffffh) модифицируется DOS так, чтобы указывать на начало следующего драйвера в цепочке. DOS поддерживает связный список драйверов, начиная с устройства НУЛЬ (nul:). Драйвер устройства НУЛЬ находится в списке первым и содержит указатель на следующий драйвер. Каждый следующий драйвер содержит такой же указатель, значение которого в последнем драйвере равно -1. Каждый драйвер содержит имя своего устройства, по которому DOS и находит нужный драйвер.
Заголовок драйвера устройства
Смещ. | Длина | Содержимое | |||||||||
+0 | смещ. | сегмент | Next_Device: адрес след. устройства | ||||||||
+4 | DevAttr | Атрибут устройства | |||||||||
+6 | Strategy | Смещение программы СТРАТЕГИЯ | |||||||||
+8 | Intrupt | Смещение программы ПРЕРЫВАНИЕ | |||||||||
+0ah | ‘L’ | ‘P’ | ‘T’ | ‘1’ | 20h | 20h | 20h | 20h | Имя устройства | ||
Значение поля Next_Device для последнего устройства в цепочке принимает значение –1 (0ffffh).
Поле "Имя устройства" содержит 8-символьное имя для символьного устройства или количество обслуживаемых устройств - для блоковых.
Поле DevAttr Заголовка устройства указывает свойства устройства. Ниже приведены значения отдельных разрядов слова состояния.
Бит | Маска | |
1 = стандартное входное устройство | 0001h | |
1 = стандартное выходное устройство | 0002h | |
1 = стандартное устройство NUL | 0004h | |
1 = часы | 0008h | |
1 = поддерживает логические устройства | 0040h | |
1 = поддерживает open/close/RM | 0800h | |
1 = не IBM блочное устройство | 2000h | |
1 = поддерживает IOCTL | 4000h | |
1 = символьное устройство; 0 = блочное устройство | 8000h |
Замечания:
· устройство NUL не может быть переназначено
· бит устройства не-IBM влияет на обработку запроса "построить блок ВРВ"
· бит символьного устройства влияет на запросы ввода и вывода и определяет смысл поля 'имя устройства' в Заголовке устройства. Если этот бит равен 0, устройство является блочным устройством (обычно дисковод)
· бит часов указывает на замещение устройства CLOCK$. CLOCK$ - это символьное устройство, обрабатывающее запросы устройства на ввод и вывод длиной ровно в 6 байтов. Запрос на ввод (код команды 4) должен возвратить 6 байтов, указывающих текущие время и дату. Запрос на вывод (код команды 8) должен принимать 6 байтов, содержащих значения часов и календаря.
При обращении к драйверу DOS формирует запрос устройства, в котором указывается, какую команду должен выполнить драйвер, а также передаются параметры команды, если это необходимо. Команды, используемые при вызове устройств в MS-DOS, приведены ниже.
Команда | Наименование |
Инициализировать устройство | |
Контроль носителя | |
Построить ВРВ | |
IOCTL ввод | |
Ввод (читать с устройства) | |
Неразрушающий ввод | |
Статус ввода | |
Сброс ввода | |
Вывод (писать на устройство) | |
Вывод с верификацией | |
0ah | Статус вывода |
Команда | Наименование |
0bh | Сброс вывода |
0ch | IOCTL вывод |
0dh | Открыть устройство |
0eh | Закрыть устройство |
0fh | Съемный носитель |
13h | Общий запрос IOCTL |
17h | Дать логическое устройство |
18h | Установить логическое устройство |
ОПИСАНИЕ КОМАНД ДРАЙВЕРА
0. Инициализация
Первая команда, выдаваемая в драйвер диска после загрузки. Она служит для настройки драйвера и для получения следующих сведений:
· сколько накопителей поддерживает драйвер
· адрес конца драйвера
· адрес таблицы BPB (количество ВРВ по числу поддерживаемых накопителей).
1. Контроль носителя
Эта команда всегда вызывается до дисковых операций считывания и записи для проверки смены носителя. Варианты ответа драйвера на запрос:
· носитель не сменялся
· носитель был сменен
· не знаю
2. Получение ВРВ
Эта команда выдается в драйвер, если была определена смена носителя. Для жестких дисков команда получения ВРВ вызывается только один раз.
Если драйвер в ответ на контроль смены носителя отвечает "не знаю", вызывается команда получения ВРВ, если в DOS нет "грязных" буферов, т.е. буферов, в которых содержатся модифицированные данные, еще не записанные на диск. Если "грязные буферы" есть, DOS считает, что носитель сменен не был.
По команде получения ВРВ драйвер должен прочесть с диска загрузочный сектор, где по смещению 11 находится ВРВ. ВРВ помещается в рабочую область DOS, и драйвер возвращает DOS указатель на ВРВ.
3. IOCTL-ввод