ret
STRATEGY endp
;
;******* ПРОГРАММА ПРЕРЫВАНИЙ *****************************************
;
; Обработать команду, находящуюся в заголовке запроса. Адрес заголовка
; запроса содержится в REQ_PTR в форме СМЕЩЕНИЕ:СЕГМЕНТ.
;
INTERRUPT PROC far
pusha ; Сохранить все регистры
- 6-19 -
lds bx,cs:[req_ptr] ; Получить адрес заголовка запроса
.
.
.
INTERRUPT ENDP
.
.
.
DRIVER ENDS
END
---------------------------------------------------------------------
Заголовок драйвера
Заголовок драйвера -- это блок данных длиной 18 байт, которым
должен начинаться любой драйвер. Заголовок драйвера всегда должен
располагаться начиная с нулевого смещения в сегменте драйвера.
При загрузке драйвера MS-DOS считывает заголовок для того, чтобы
определить тип драйвера и точки входа в драйвер. В заголовке
драйвера содержится четыре типа сведений, критичных для использо-
вания драйвера системой : ПОЛЕ СВЯЗИ, СЛОВО АТРИБУТОВ, ВЕКТОРА
ТОЧЕК ВХОДА и ПОЛЕ ИМЕНИ/КОЛИЧЕСТВА.
Поле связи
Первые четыре байта заголовка драйвера это FAR указатель (сме-
щение:сегмент) на следующий драйвер в цепочке (списке) драйверов.
При создании драйвера эти байты устанавливаются равными FFFF:FFFF
(-1). При загрузке нового драйвера его адрес помещается в поле
связи предыдущего драйвера. Исключением являются файлы, содержа-
щие несколько драйверов одновременно. В этом случае первые два
байта поля связи должны содержать смещение заголовка следующего
драйвера.
Слово атрибутов
Следующее слово заголовка драйвера называется словом атрибу-
тов. Оно содержит ряд однобитовых полей, которые характеризуют
тип и возможности драйвера. На рис.6-4 показано расположение и
значение битов в слове атрибутов. Слово атрибутов для разных
драйверов может иметь, например, следующее значение :
Драйвер диска формата IBM - 0000
Стандартный драйвер консоли - 8003H
Драйвер стандартного устройства (напр. PRN) - 8000H
БИТ15: CHR. Бит CHR должен быть сброшен в 0, если драйвер пред-
назначен для блоковых устройств, и должен быть установлен в 1,
если драйвер будет обслуживать символьное устройство (см. раздел
"Типы драйверов устройств").
БИТ14: IOCTL. Бит IOCTL является необязательным. Его установка
информирует MS-DOS о том, что драйвер поддерживает средства кана-
ла прямого управления. Если IOCTL бит установлен, то драйвер ОБЯ-
ЗАН поддерживать команды 3 и 12 (IOCTL ввод и вывод), в противном
- 6-20 -
случае бит 14 должен быть сброшен. Указанные команды доступны при
помощи подфункций 2 и 3 (для символьных устройств) или 4 и 5 (для
блоковых устройств) функции MS-DOS 44H.
БИТ13: NONIBM/OTB. Для блоковых драйверов этот бит называется
также NONFAT бит. Будучи установленным, этот бит указывает на то,
что блоковое устройство может не поддерживать стандартной для IBM
/MS-DOS структуры диска. В этом случае обработка драйвером команд
INIT и BUILD BPB будет происходить особым образом. Для символьных
драйверов в MS-DOS версий 3.2 и более поздних, этот бит носит
название OTB (Output Until Busy) -- "Вывод пока не занято", и
указывает на то, что драйвер поддерживает дополнительную команду
9 (Output Until Busy). Эта команда полезна для символьных уст-
ройств, имеющих буфер большой емкости, таких как некоторые прин-
теры. Символьные драйверы, используемые с MS-DOS версий 3.1 и ни-
же, должны иметь этот бит сброшенным в 0.
БИТ12: NETWORK. Этот бит является необязательным атрибутом, впер-
вые определенный в MS-DOS версии 3.10. Интересно, что бит NETWORK
не упоминался в последующей документации по MS-DOS версий 3.2 или
3.3, так что использование его в настоящее время оставляет неко-
торые вопросы. Это бит предназначен для информирования MS-DOS о
том, что драйвер обслуживает сетевое устройство. Сетевые устройс-
тва помечаются как блоковые устройства в слове атрибутов; при
этом делается допущение, что обслуживаемое сетевое устройство яв-
ляется "окном" в сеть, позволяя, таким образом, целиком перенап-
равлять на обработку удаленному устройству системные вызовы. Ко-
нечно, для того, чтобы воспользоваться услугами сети для
указанного перенаправления, необходима поддержка соответствующего
средства, такого как MS-NET.
БИТ11: OCRM. Атрибут OCRM (Open/Close/Removable Media) появляется
начиная с MS-DOS версии 3.0. Он может использоваться как для сим-
вольных, так и для блоковых драйверов. Этот бит является не обя-
зательным, хотя Microsoft рекомендует устанавливать его для всех
новых драйверов. Поняв назначение этого атрибута, программист не-
сомненно сможет определиться в его использовании (или не исполь-
зовании).
Как для символьных, так и для блоковых драйверов установка
этого бита означает поддержку драйвером команд DEVICE OPEN и
DEVICE CLOSE (команды 13 "Открыть устройство" и 14 "Закрыть уст-
ройство"). Блоковые драйверы с установленным битом OCRM должны
также поддерживать команду CHECK FOR REMOVABLE MEDIA (команда 15,
"Проверка замены носителя").
Для блоковых устройств команды DEVICE OPEN и DEVICE CLOSE вы-
даются только в режиме совместного использования файлов (file
sharing). Этот режим включается после запуска команды SHARE.EXE.
При установленном режиме совместного использования файлов, коман-
да DEVICE OPEN выдается драйверу при вызове функций MS-DOS 0FH
("Открыть файл, используя FCB") или 3DH ("Открыть файл при помощи
вызова функций 10H ("Закрыть файл, используя FCB") или 3H ("Зак-
рыть файл при помощи описателя"). Для дисковых устройств коман-
ды DEVICE OPEN и DEVICE CLOSE можно использовать для подсчета
числа открытий определенного устройства, например, числа открытых
файлов на диске. Это может быть полезно при определении недопус-
тимости смены дискеты в дисководе, если на момент замены носителя
- 6-21 -
оставались открытые файлы.
Для символьных устройств команды DEVICE OPEN и DEVICE CLOSE
выдаются всегда, когда соответствующее устройство открывается и
закрывается, независимо от режима совместного использования фай-
лов, так что загрузка команды SHARE.EXE не требуется. При работе
с устройствами могут быть использованы только функции MS-DOS 3DH
("Открыть файл при помощи описателя") и 3H ("Закрыть файл при по-
мощи описателя"), так как FCB-метод не работает с устройствами.
Для символьных устройств команды DEVICE OPEN и DEVICE CLOSE могут
быть использованы для предотвращения одновременного доступа к та-
ким устройствам, как принтер или модем, а также для вызова проце-
дур пред- и после обработки, таких как процедуры настройки прин-
тера или завершение сеанса связи для модема.
Заметим, что устройства CON, AUX и PRN открыты всегда, так как
связаны с описателями 0, 1, и 2 (STDIN, STDOUT и STDERR -- все
отображаются на устройство CON), описателем 3 (STDAUX, отображае-
мый на устройство AUX) и описателем 4 (STDPRN, отображаемый на
устройство PRN).
Команда CHECK FOR REMOVABLE MEDIA выдается при вызове пользо-
вателем функции MS-DOS 44H ("Управление работой устройств") с
подкомандой номер 8. Драйвер должен вернуть информацию о наличии
сменного либо несменного носителя.
Атрибут OCRM (Open/Close/Removable Media) также учитывается
при обработке драйвером команды BUILD BPB ("Построить блок пара-
метров BIOS"). Сменный носитель может содержать "идентификатор
тома", одиннадцатисимвольное имя диска. Если устройство поддержи-
вает сменный носитель, имя тома должно быть определено и обрабо-
тано драйвером. Подробнее об этом можно найти при описании коман-
ды BUILD BIOS PARAMETER BLOCK.
БИТЫ с 10 по 7 : Зарезервированы.
---------------------------------
БИТ6: GIOCTL. В MS-DOS версии 3.3 бит GIOCTL ("Группа команд уп-
равления") устанавливается в 1 для индикации того, что блоковый
или символьный драйвер поддерживает дополнительные подкоманды ко-
мандой 19 (GENERIC I/O CONTROL REQUEST). Если этот бит разрешает
использование команды 19, драйвер должен также поддерживать ко-
манды 23 и 24 (GET/SET LOGICAL DRIVE -- Получить/Установить имя
логического диска).
При поддержке драйвером указанных команд, программа пользова-
теля может выдать команду GENERIC I/O CONTROL REQUEST с помощью
функции 44H MS-DOS (подфункции 0CH и 0DH). Для блоковых драйверов
команды GET/SET LOGICAL DRIVE могут быть выполнены вызовом под-
функций 0H (GET LOGICAL DRIVE) и 0FH (SET LOGICAL DRIVE) функции
MS-DOS 44H. Для получения более подробной информации обратитесь к
описанию функции 44H и описанию команд драйвера GENERIC IOCTL и
GET/SET LOGICAL DRIVE.
БИТ 5 : Зарезервирован.
-----------------------
БИТ4: SPECL. Бит SPECL является необязательным атрибутом, исполь-
зуемым только драйвером консоли, и информирующим MS -DOS о том,
что драйвер установил специальный обработчик INT 29H для выполне-
ния высокоскоростного вывода на консоль (устройство CON). Если
этот бит установлен, то при необходимости быстрого вывода на кон-
- 6-22 -
соль MS-DOS выдает программное прерывание INT 29H, передавая вы-
водимый символ в регистр AL. Режим быстрого вывода управляется и
индицируется битом 5 (режим двоичного вывода) в слове конфигура-
ции. При выдаче прерывания INT 29H ожидается, что драйвер выведет
переданный в регистре AL символ и вернет управление. Обычные про-
цедуры ввода/вывода пропускаются. Как стандартный драйвер консоли
MS-DOS, так и заменяющий его драйвер ANSI.SYS поддерживают эту
особенность. Если используемый драйвер консоли поддерживает пре-
рывание INT 29H (что определяется чтением слова конфигурации
драйвера), то прикладная программа также может осуществлять быст-
рый вывод на консоль, используя INT 29H.
Заметим, что этот бит объявлен резервным в документации IBM и
вообще игнорируется в последней документации фирмы Microsoft. Оба
этих факта говорят о том, что поддержка бита SPECL в будущем не
гарантируется.
БИТ3: CLOCK. Бит CLOCK устанавливается на драйвере символьного
устройства, имеющего имя "CLOCK$", для обозначения этого устройс-