Справочник программиста на персональном компьютере фирмы IBM. Ввод/вывод - Создание заголовка драйвера

ОГЛАВЛЕНИЕ

     7.2.1 Создание заголовка драйвера.


   Драйверы  устройств  должны  создаваться  в  виде  COM  файлов
[1.3.6]. Однако они не являются настоящими программами, поскольку
у  них отсутствует префикс программного сегмента.  Чтобы добиться
этого не надо включать оператор ORG  100H в начале программы, как
это  делается  для COM файлов.  Либо запишите ORG 0, либо  вообще
ничего не пишите.  Драйвер  должен  быть описан как далекая (far)
процедура,  как  и в любой программе.  В нижеприведенном  примере
приведен начальный код для драйвера устройства с именем DEVICE12.
Оно  заменяет  стандартное устройство AUX, используемое  MS  DOS,
принимая вывод функции 4 прерывания  21H. Весь драйвер устройства
состоит из кода этого раздела вместе с кодом, приведенном в  сле-
дующих двух разделах; поместите  их  подряд один за другим, чтобы
получить полную программу.
   Драйвер устройства должен начинаться с заголовка драйвера.  Он
имеет длину 18 байтов, разделенных  на 5 полей.  Первое поле (DD)
всегда содержит значение -1 (FFFFFFFFH), и когда MS DOS загружает
драйвер, то оно заменяется на стартовый  адрес следующего драйве-
ра.   Таким  образом, система может искать следующий  драйвер  по
цепочке. У последнего  загруженного драйвера в этом поле остается
значение -1.
   Второе поле это байт атрибутов драйвера. Имеют значение только
7 битов этого слова:

бит 15   1 = символьное устройство, 0 = блочное устройство
    14   1 = поддерживает IOCTL, 0 = не поддерживает IOCTL

    13   1 = формат блоков IBM, 0 = другой формат блоков
     3   1 = часы, 0 = не часы
     2   1 = нулевое устройство, 0 = не нулевое устройство
     1   1 = устройство стандартного вывода, 0 = нет
     0   1 = устройство стандартного ввода, 0 = нет

Обычно установлен только бит 15, или биты 15 и 14, если устройст-
во поддерживает IOCTL (как обсуждается в [7.2.4]).  Бит 13  уста-
навливается только для блочных устройств.  Остальные биты исполь-
зуются  для  замены устройств, используемых MS DOS  по  умолчанию
(устройствами стандартного  ввода  и вывода являются клавиатура и
видеодисплей;  устройство часов объединяет часы реального времени
с часами времени суток BIOS; а  нулевое  устройство  (NULL) - это
псевдоустройство, используемое для тестовых целей).
   Третье и четвертое поля содержат смещения для процедур страте-
гии и обработки прерывания, которые будут рассмотрены в следующих
разделах.  Наконец, последнее поле содержит имя устройства.   Имя
может содержать до  8  символов  и  оно  должно быть выравнено по
левому краю с завершающими пробелами.  Для замены существующих  в
DOS устройств, таких как  LPT1  или  COM1,  используйте то же имя
устройства, как в данном примере.

   Низкий уровень.


   В данном примере создается драйвер для последовательного  уст-
ройства. "DEVICE12" -  имя  файла,  который  должен быть указан в
файле  конфигурации сиситемы, чтобы этот драйвер был загружен.  В
байте атрибутов установлен  только  бит 15, указывая что это сим-
вольное устройство и что оно не поддерживает IOCTL.  DEV_STRATEGY
и DEV_INTERRUPT - имена процедур,  обсуждаемых в следующих разде-
лах.   Устройство названо AUX, с тем чтобы заменить обычное  уст-
ройство MS DOS с этим  именем.  Это  позволяет очень просто обра-
щаться к этому устройству, поскольку система имеет предопределен-
ный номер файла для обращения к  устройству AUX (последовательно-
му).   В пример включен начальный код для драйвера,  определяющий
его как COM программу.

CSEG      SEGMENT PUBLIC 'CODE'   'устанавливаем кодовый сегмент
          ORG 0                   'эта строка необязательна
          ASSUME CS:CSEG,DS:CSEG,ES:CSEG
DEVICE12  PROC FAR         'драйвер это далекая процедура
          DD   0FFFFFFFFH  'адрес следующего драйвера
          DW   8000H       'байт атрибутов
          DW   DEV_STATEGY 'адрес процедуры стратегии
          DW   DEV_INTERRUPT  'адрес процедуры прерывания
          DB   'AUX     ' 'имя устройство (дополненное пробелами)