7.2.2 Создание стратегии устройства.
Процедура стратегии устройства требует только пяти строк.
Когда система загружает устройство, то она создает блок данных,
называемый заголовком запроса. Он имеет две функции. Во-первых он
служит областью данных для внутренних операций системы. Более
важно то, что заголовок запроса служит областью, через которую
происходит обмен информацией между драйвером и вызывающей его
программой. Например, когда драйвер выводит данные, то ему дается
адрес данных через заголовок запроса. Когда же драйвер завершает
свою работу, то он устанавливает в заголовке запроса байт стату-
са, который доступен вызывающей программе, тем самым давая воз-
можность ей узнать об ошибке.
MS DOS создает заголовок запроса при установке драйвера уст-
ройства (когда система загружается). Процедура стратегии уст-
ройства выполняется только один раз в этот момент. При этом ES:BX
указывают на вновь созданный заголовок запроса и процедуре нужно
просто скопировать их, чтобы впоследствии он мог быть обнаружен
при обращении к драйверу. Адреса смещения и сегмента заголовка
помещаются в две переменные. В следующем разделе Вы увидите, что
при обращении к драйверу, первое что он делает - восстанавливает
значения ES:BX, чтобы можно было получить информацию из заголовка
запроса.
Размер заголовка запроса может меняться, в зависимости от типа
сделанного запроса к драйверу (напр. инициализация, вывод данных
или возврат статуса). Однако первые 13 байт заголовка всегда одни
и те же. Их формат таков:
1. Длина заголовка запроса (DB).
2. Код устройства (DB). Определяет номер для блочных устройств.
3. Код команды (DB). Здесь хранится номер последней посланной
драйверу команды. Эти коды перечислены в [7.2.3].
4. Статус (DW). Статус устанавливается каждый раз при вызове
драйвера. Если установлен бит 15, то в младших восьми битах нахо-
дится код ошибки. Коды ошибок перечислены в [7.2.3].
5. Резервная область (8 байтов). Используется MS DOS.
6. Данные необходимые для работы драйвера (переменной длины).
Низкий уровень.
Вот 5 строк процедуры стратегии устройства. Отмечаем, что две
словные переменные, хранящие значения ES и BX, следуют за инст-
рукцией RET, как и положено в формате COM.
DEV_STRATEGY: MOV CS:KEEP_ES,ES
MOV CS:KEEP_BX,BX
RET
KEEP_CS DW ?
KEEP_BX DW ?