ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
є є
є Команда GENERIC IOCTL (19) є
є є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДД¬ є
є +00 : 23 Длина ¦ X ¦ Блок. драйверы є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ є
є +01 : номер # Устройство ЪДДД¬ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ¦ ¦ Симв. драйверы є
є +02 : 19 Команда АДДДЩ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД є
є +03 : Статус є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЧТЕНИЕ ЗАПИСЬ є
є Зарезервировано є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДД¬ ДДДДД ЪДДД¬ ДДДДД є
є +13 : Номер функции (старший) ¦ X ¦ ¦ ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДД є
є +14 : Номер функции (младший) ¦ X ¦ ¦ ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДД є
є +15 : Содержимое регистра SI ¦ X ¦ ¦ ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДД є
є +17 : Содержимое регистра DI ¦ X ¦ ¦ ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДД є
є +19 : Адрес блока IOCTL запроса ¦ X ¦ ¦ ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ ДДДДД АДДДЩ ДДДДД є
є є
ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј
Название "Группа команд управления вводом/выводом" не совсем
точно, так как эта команда используется при поддержке драйвером
дополнительных возможностей. Одна группа дополнительных функций
(доступ к которой обеспечивается IOCTL подфункцией 0CH) поддержи-
вает возможность переключения кодовых страниц (code page
switching), средства для оперативной реконфигурации драйвера.
Другая большая группа функций (доступ к которой обеспечивается
IOCTL подфункцией 0DH) обеспечивает стандартный интерфейс для ап-
паратурозависимых операций блоковых драйверов. Операции, входящие
в данную группу, включают чтение, запись, верификацию, форматиро-
вание целых дорожек, чтение и модификацию блока параметров BIOS
(BPB).
Расширенные возможности команды GENERIC IOCTL хорошо описаны в
"MS-DOS Technical Reference Manual" ("MS-DOS. Техническое описа-
ние") в разделе, описывающем функцию 44H MS-DOS. В связи с тем,
что эти функции предназначены в основном для поддержки оборудова-
ния производителей, мы отсылаем читателей к упомянутому руководс-
тву для получения более подробной информации.
Команды GETLOGICALDEVICE и SETLOGICALDEVICE (23 и 24) являются
дополнительными командами для блоковых драйверов и поддерживаются
в MS-DOS начиная с версии 3.20. Использование этих команд разре-
шается при наличии у драйвера атрибута GIOCTL (бит 6 слова атри-
бутов) равного 1.
- 6-46 -
Команды GET & SET LOGICAL DEVICE
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
є є
єКоманда GET & SET LOGICAL DEVICE (23,24) є
є є
єДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДД¬ є
є+00 : 21 Длина ¦ X ¦ Блок. драйверы є
єДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ є
є+01 : номер # Устройство ЪДДД¬ є
єДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ¦ ¦ Симв. драйверы є
є+02 : команда Команда АДДДЩ є
єДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД є
є+03 : Статус ЪДДДДДДДДДДДДДДДДДДДДДДДДД¬є
єДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ¦ КОМАНДЫ : ¦є
є Зарезервировано ¦ ¦є
є ¦ 23: GET LOGICAL DEVICE ¦є
є ¦ 24: SET LOGICAL DEVICE ¦є
є АДДДДДДДДДДДДДДДДДДДДДДДДДЩє
є є
є ЧТЕНИЕ ЗАПИСЬ є
є є
єДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДД¬ ДДДДД ЪДДД¬ ДДДДє
є+13 : Ввод (код устройства) ¦ X ¦ ¦ ¦ є
єДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДє
є+14 : Код команды ¦ X ¦ ¦ ¦ є
єДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДє
є+15 : Статус ¦ X ¦ ¦ ¦ є
єДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДє
є+17 : Зарезервировано ¦ ¦ ¦ X ¦ є
єДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ ДДДДД АДДДЩ ДДДДє
є є
ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј
Эти команды используются для отслеживания имени текущего
диска для устройств, имеющих несколько логических дисков. Подобно
команде GENERICIOCTL, команды GET/SET LOGICAL DEVICE доступны че-
рез функцию 44H MS-DOS. Подфункция 0H применяется для получения
текущего имени логического диска, а функция 0FH для присвоения
имени нового логического диска. Так же как и команда
GENERICIOCTL, команды GET/SET LOGICAL DEVICE предназначены, в ос-
новном, для поддержки устройств производителя (например, в случае
драйвера DRIVER.SYS, для поддержки 3.5-дюймовых гибких дисков).
Полное описание этих команд можно найти в "MS-DOS Technical
Reference Manual" в разделе, описывающем функцию MS-DOS 44H, куда
мы Вас и отсылаем.
Создание загрузочного файла драйвера устройства
Выше уже упоминалось, что программа драйвера устройства похожа
на обычную .COM программу. Это утверждение тем более истинно при
использовании описываемого метода создания .SYS файла драйвера.
Заметьте, что нет никаких причин, кроме соглашений, для использо-
вания расширения .SYS в файлах драйверов - допустимы любые рас-
ширения. В листинге 6-4 представлен диалог с системой при созда-
нии драйвера "DRIVER". Этот файл ассемблируется и линкуется как
обычная программа, после чего преобразуется в двоичный .SYS файл.
Отметим,что отсутствие стека для драйвера является нормальным яв-
- 6-47 -
лением, так как драйвер при работе использует собственный стек
MS-DOS.
В примере, приведенном в листинге 6-4, создается также выход-
ной .LST файл ассемблера и выходной .MAP файл редактора связей
(линкера). Конечно же, .OBJ и .EXE файлы могут быть удалены после
создания .SYS файла.
Листинг 6-4. Процесс создания простого драйвера
-----------------------------------------------------------------
C> masm driver,driver,driver;
Microsoft Macro Assembler Version 4.00
Copyright Microsoft Corp 1981, 1983, 1984, 1985.
All rights reserved.
45976 Bytes symbol space free
0 Warning Errors
0 severe Errors
C> link driver,driver,driver;
Microsoft 8086 Object linker
Version 3.00 Copyright Microsoft Corp 1983, 1984, 1985
Warning: no stack segment
C> exe2bin driver driver.sys
-----------------------------------------------------------------
Отладка драйверов устройств
После того, как драйвер установлен в системе, он уже не может
быть отлажен с помощью MS-DOS (из-за проблемы реентерабельности).
Однако отлаживать драйверы необходимо, так как подобно практичес-
ки всем программам трудно ожидать от драйвера правильной работы
после первого запуска. К решению задачи отладки драйверов можно
подойти с трех сторон.
Во-первых, разрабатывайте драйвер по технологии "сверху вниз"
- заставьте работать основную часть программы, а затем добавляй-
те более сложные блоки. Не пытайтесь сделать в первую очередь об-
работчики IOCTL. Процедурами, правильной работы которых Вы должны
добиться в первую очередь, являются программы СТРАТЕГИЙ и ПРЕРЫ-
ВАНИЙ, а также процедура инициализации INIT. В блоковых драйверах
Вы должны также добиться правильной работы команды MEDIACHECK и,
если только Вы не установили NONIBM бит в слове атрибутов, коман-
ды BUILDBPB. С помощью такого набора функций Вы, конечно, не смо-
жете выполнять операции ввода/вывода, однако MS-DOS сможет по
крайней мере успешно загрузить этот драйвер.
Другой подход, который может помочь в отладке драйверов, зак-
лючается в использовании функций BIOS для вывода информации, оп-
ределяющей текущее состояние драйвера. Знание места, до которого
дошел драйвер, прежде чем аварийно завершиться очень помогает при
отладке. Если у Вас нет ROM-BIOS, на который можно положиться, Вы
можете встроить в драйвер различные подпрограммы вывода. Напри-
- 6-48 -
мер, отлаживая драйвер RDISK (приведенный в конце этой главы),
авторы встроили в драйвер средства вывода на дисплей идентифици-
рующего символа для каждой обрабатываемой команды ("I" для ПРЕРЫ-
ВАНИЙ, "S" для СТРАТЕГИЙ, "i" для INIT и т.д.). Это представляло
действительную помощь когда драйвер загружался и был доступен с
помощью прерываний прямого доступа к диску, но "сваливался" при
попытке чтения директория диска. Взаимодействие между драйвером и
системой может быть одной из самых сложных проблем и, к не-
счастью, обычно может быть отлажено только после загрузки драйве-
ра.
Если Вы решили добавить отладочные команды к Вашему драйверу,
знайте, что это вероятнее всего увеличит требуемую глубину стека
и Вам, возможно, придется использовать в драйвере локальный стек
(если, конечно, Вы еще не сделали этого).
При тестировании отдельных частей драйвера нет никакой необхо-
димости отлаживать их после его загрузки. Если Вам не жалко вре-
мени, потраченного на написание простой тестовой программы, соз-
дающей блоки запросов и передающей их драйверу для обработки, то