MS-DOS для программиста© Александр Фролов, Григорий ФроловТом 18, М.: Диалог-МИФИ, 1995, 254 стр. 6.5. Функция управления устройствами IOCTLПосле обзора команд перейдем к описанию функции 44h прерывания INT 21h . Эта функция предназначена для управления вводом/выводом и обладает широкими возможностями. Мы рассмотрим средства управления устройствами ввода/вывода IOCTL . Использование IOCTL - обычный метод организации связи с устройствами или получения информации об открытых файлах. Описания будут приводиться в порядке номеров подфункций функции 44h прерывания INT 21h . Получить конфигурацию устройства (4400h)Вызов:
Выполнение без ошибки:
Выполнение с ошибкой:
Функция возвращает в регистре DX слово
конфигурации устройства, которое имеет
следующий формат:
Если при вызове этой подфункции регистр BX
содержит идентификатор файла, формат информации,
получаемой в регистре DX, будет следующий:
Особое внимание следует обратить на бит 5 слова информации об устройстве. Этот бит определяет режим обмена данными между операционной системой и драйвером: двоичный или символьный. В двоичном режиме управляющие символы <Ctrl+C>, <Ctrl+P>, <Ctrl+S>, <Ctrl+Z> интерпретируются как обычные данные. Установить слово конфигурации устройства (4401h)Вызов:
Выполнение без ошибки:
Выполнение с ошибкой:
Эта подфункция позволяет устанавливать некоторые биты в слове конфигурации устройства. В зависимости от установки бита 5 драйвер выполняет команды ввода/вывода различным образом. В режиме ASCII обмен с драйвером символьного устройства выполняется по байтам (содержимое поля count в запросе всегда равно 1). Если вам надо обслуживать быстродействующее устройство ввода/вывода, такой обмен может оказаться слишком медленным. В этом случае вы можете установить бит 5 в единицу и выполнять обмен в двоичном режиме. Разумеется, вам придется самостоятельно отслеживать все управляющие символы. Чтение управляющей
информации для символьных устройств (4402h)
|
Регистр | Содержание |
AH | 44h |
AL | 02h (чтение), 03h (запись) |
BX | Идентификатор устройства (только для устройства, а не для файла) |
CX | Количество читаемых или записываемых байт |
DS:DX | Указатель на область памяти, в которую надо прочитать управляющую информацию или из которой надо записать управляющую информацию |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
AX | Количество действительно прочитанных или записанных байт данных |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | 01h - запрошена несуществующая функция;05h -
доступ запрещен; 06h - регистр BX содержит несуществующий идентификатор;0Dh - неправильные данные |
Эти подфункции позволяют прикладной программе обмениваться произвольной управляющей информацией с драйвером устройства. Они инициируют вызов драйвера с командами 3 и 12, соответственно, для выполнения операций чтения и записи управляющей информации.
Для использования описанных подфункций драйвер должен поддерживать интерфейс IOCTL , что можно проверить с помощью подфункции 0 (чтение слова конфигурации устройства). Если бит 14 установлен, драйвер поддерживает IOCTL.
Чтение управляющей
информации для блочных устройств (4404h)
Запись управляющей информации для блочных
устройств (4405h)
Вызов:
Регистр | Содержание |
AH | 44h |
AL | 04h (чтение), 05h (запись) |
BL | Номер дисковода (0 - текущий дисковод, 1 - дисковод А: и т. д.) |
CX | Количество читаемых или записываемых байт данных |
DS:DX | Указатель на область памяти, в которую надо прочитать управляющую информацию или из которой надо записать управляющую информацию |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
AX | Количество действительно прочитанных или записанных байт данных |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | 01h - запрошена несуществующая функция; 05h - доступ к дисководу запрещен;0Dh - неправильные данные |
Для использования этих подфункций драйвер должен поддерживать интерфейс IOCTL .
Определение состояния
устройства ввода (4406h)
Определение состояния устройства вывода (4407h)
Вызов:
Регистр | Содержание |
AH | 44h |
AL | 06h (для устройства ввода), 07h (для устройства вывода) |
BX | Идентификатор устройства или файла |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
AL | Для устройства: 00h - устройство не готово к приему/передаче; 0FFh - устройство готово к приему/передаче. Для файла: 00h - достигнут конец файла; 0FFh - конец файла не достигнут |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | 01h - запрошена несуществующая функция; 05h - доступ запрещен; 06h - регистр BX содержит несуществующий идентификатор; 0Dh - неправильные данные |
Эти подфункции предназначены для проверки готовности устройства к вводу или выводу данных, а также для проверки на достижение конца файла.
Проверка возможности замены носителя данных для блочного устройства (4408h)
Вызов:
Регистр | Содержание |
AH | 44h |
AL | 08h |
BL | Номер дисковода (0 - текущий дисковод, 1 - дисковод А: и т. д.) |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
AX | 00h - замена носителя возможна; 01h - носитель данных несменный |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | 01h - запрошена несуществующая функция; 0Fh - неправильный идентификатор дисковода |
Эта подфункция проверяет возможность замены носителя данных.
Определение расположения устройства - локальное или удаленное (4409h)
Вызов:
Регистр | Содержание |
AH | 44h |
AL | 09h |
BL | Номер дисковода (0 - текущий дисковод, 1 - дисковод А: и т. д.) |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
DX | Биты атрибута устройства. Если блочное устройство является локальным (расположено на рабочей станции), бит 12 установлен в 0, остальные биты копируются из заголовка драйвера устройства. Если устройство является удаленным (находится на сервере), устанавливается в 1 только бит 12, остальные биты зарезервированы и равны нулю |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | 01h - запрошена несуществующая функция; 0Fh - неправильный идентификатор дисковода |
Ошибка 01h может возникнуть, если не загружена программа share.exe
Используя эту подфункцию, программы могут определить расположение диска - на локальной станции или на сервере. Однако обычно работа программы не должна зависеть от этого расположения.
Проверка идентификатора: локальный или удаленный (440Ah)
Вызов:
Регистр | Содержание |
AH | 44h |
AL | 0Ah |
BX | Идентификатор устройства (не файла) |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
DX | Слово атрибутов устройства. Если бит 15 установлен в 1, это устройство является удаленным, в противном случае - локальным |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | 01h - запрошена несуществующая функция; 06h - регистр BX содержит несуществующий индекс |
Ошибка 01h может возникнуть, если не загружена программа share.exe .
Данная подфункция позволяет проверить, является ли открытое устройство или файл локальным или удаленным. Справедливы замечания к предыдущей подфункции о том, что работа программы не всегда должна зависеть от расположения файла или устройства.
Установка количества повторов при обращении к файлу (440Bh)
Вызов:
Регистр | Содержание |
AH | 44h |
AL | 0Bh |
CX | Продолжительность паузы (по умолчанию используется значение 1) |
DX | Число повторов (по умолчанию равно 3) до вызова программы обработки прерывания INT 24h (прерывания по критической ошибке ввода/вывода) |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | 01h - запрошена несуществующая функция |
Код ошибки 01h появляется, если задан недопустимый номер подфункции или не загружена программа share.exe .
Операции, которые могут привести к возникновению конфликтных ситуаций, автоматически повторяются несколько раз до выдачи сообщения об ошибке.
Переключение кодовых страниц (440Ch)
Вызов:
Регистр | Содержание |
AH | 44h |
AL | 0Ch |
BX | Идентификатор открытого устройства |
CH | Код категории устройства: 00 - неизвестное устройство; 01 - устройства COM1 , COM2 и т. д.; 03 - консоль CON ; 05 - устройства печати LPT1 , LPT2 и т. д. |
CL | Код операции: 45h - установить число повторений операции; 4Ah - выбор кодовой страницы; 4Ch - начало подготовки кодовой страницы; 4Dh - конец подготовки кодовой страницы; 5Fh - установить устройство "видеомонитор"; 65h - получить число повторений операции; 6Ah - получить выбранную кодовую страницу; 6Bh - получить подготовленный список; 7Ah - получить параметры видеомонитора (ширина, длина и цвет) |
DS:DX | Указатель на блок параметров |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | 01h - запрошена несуществующая функция; 06h - регистр BX содержит несуществующий идентификатор |
Для подготовки кодовой страницы сначала вызывают эту подфункцию с кодом операции CL=4Ch, затем должна идти серия вызовов подфункции 03h функции 44h прерывания INT 21h (запись через интерфейс IOCTL на символьное устройство).
Формат записываемых данных зависит от типа устройства. Драйверы display.sys и printer.sys, входящие в состав MS-DOS, получают эти данные из файлов с расширением имени .cpi, таких как ega.cpi, lcd.cpi, 4201.cpi и т. д.
Блок параметров имеет различный формат для
разных кодов операций:
Код операции | Формат блока параметров |
CL = 45h | Блок параметров состоит из слова, содержащего количество повторений |
CL = 4Ah, 4Dh, 6Ah | Блок параметров состоит из двух слов, первое слово - длина данных (0002), второе - идентификатор кодовой страницы |
CL = 4Ch | В начале блока параметров расположены три слова - флаги (0000), размер остальной части блока параметров в байтах и количество кодовых страниц. За этими тремя словами следуют слова кодовых страниц. Количество слов кодовых страниц зависит от значения параметра MAXFONTS при установке драйвера и может достигать 12 |
CL = 6Bh | Первым располагается слово, содержащее длину остальной части блока в байтах, затем идет количество аппаратных кодовых страниц и слова для этих кодовых страниц. В конце расположено слово, содержащее количество подготовленных кодовых страниц и слова с подготовленными кодовыми страницами. Возвращаемый блок может иметь длину до 56 байт |
Из-за ограниченного объема книги мы не можем привести подробную информацию об использовании кодовых страниц. При необходимости обратитесь к руководству программиста, которое поставляется в составе Microsoft Developer Network (MSDN Level 1) на компакт-диске Development Library.
Общее управление вводом/выводом GENERIC IOCTL (440Dh)
Вызов:
Регистр | Содержание |
AH | 44h |
AL | 0Dh |
BL | Номер дисковода (0 - текущий дисковод, 1 - дисковод А: и т. д.) |
CH | Код категории устройства: 08h - дисковое устройство |
CL | Операция: 40h - установить параметры устройства; 60h - получить параметры устройства; 41h - записать дорожку на логическом устройстве; 61h - прочитать дорожку на логическом устройстве; 42h - форматировать дорожку на логическом устройстве; 62h - проверить дорожку на логическом устройстве |
DS:DX | Указатель на блок параметров |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | Код ошибки |
Общая схема использования этой подфункции такова:
- сохранить параметры устройства операцией 40h;
- установить нужные параметры;
- выполнить операцию ввода/вывода или форматирования;
- восстановить предыдущие параметры.
Формат блока параметров зависит от выполняемой операции:
Получить/установить параметры устройства (CL=40h/60h)
Смещение | Размер | Содержимое поля |
0 | 1 | Специальные функции |
1 | 1 | Тип устройства, возвращаемый драйвером: 0 - НГМД диаметром 5,25" емкостью 320/360 Кбайт; 1 - НГМД диаметром 5,25" емкостью 1,2 Мбайт; 2 - НГМД диаметром 3,5" емкостью 720 Кбайт; 3 - НГМД диаметром 8" нормальной плотности; 4 - НГМД диаметром 8" двойной плотности; 5 - жесткий диск; 6 - накопитель на магнитной ленте; 7 - НГМД диаметром 3,5" емкостью 1,44 Мбайт |
2 | 2 | Атрибуты устройства, возвращаемые драйвером. В этом поле используются только два младших бита. Бит 0 - признак возможности замены среды носителя данных (0 - заменяемая среда, 1 - не заменяемая среда).Бит 1 - признак наличия аппаратного контроля замены дискеты (1 - контроль выполняется, 0 - контроль не выполняется). Остальные биты зарезервированы и должны содержать 0 |
4 | 2 | Максимальное количество цилиндров на физическом устройстве. Это поле устанавливается драйвером |
6 | 1 | Тип среды носителя данных. Используется для устройств, поддерживающих несколько типов носителей данных, например, для НГМД диаметром 5,25" значение этого поля, равное 0, соответствует дискете емкостью 1.2 Мбайт, а 1 - 360 Кбайт |
7 | 31 | Блок BPB для устройства. Если бит 0 поля специальных функций сброшен, то в этом поле находится новый блок BPB для устройства. Если бит 0 установлен, драйвер устройства возвращает BPB для всех последующих запросов на построение BPB |
38 | ? | Таблица разметки дорожки, имеет переменную длину |
Биты байта специальных функций имеют следующее значение:
- Бит 0
В операции 60h значение этого бита, равное 1, используется для извлечения текущего BPB , как если бы он был получен по команде драйвера с кодом 2 (построить BPB). Значение этого бита, равное 0, говорит о том, что надо извлечь BPB, используемый по умолчанию.
Для операции с кодом 40h значение бита, равное 1, используется для извлечения текущего BPB , значение 0 приводит к использованию BPB, подготовленного в данном блоке параметров.
- Бит 1
Значение этого бита, равное 1, - это указание игнорировать все поля в блоке параметров, кроме поля описания физической структуры дорожки на данном устройстве.
- Бит 2
Значение этого бита, равное 1, говорит о том, что все секторы на этой дорожке имеют одинаковый размер.
Таблица разметки дорожки начинается с двухбайтового слова, содержащего общее количество секторов на дорожке. Затем для каждого сектора в таблице находится по два двухбайтовых слова, содержащих номер сектора (1, 2 и т. д.), а также размер сектора. Таким образом, для каждого сектора в таблице содержится два слова.
Если в поле "специальные функции" бит 2 установлен в 1, размеры всех секторов должны быть одинаковыми.
Записать/прочитать дорожку (CL=41h/61h)
Смещение | Размер | Содержимое поля |
0 | 1 | Специальные функции (это поле всегда содержит 0) |
1 | 2 | Номер головки |
3 | 2 | Номер дорожки |
5 | 2 | Номер начального сектора (нумерация секторов, в отличие от нумерации головок и дорожек, начинается с 0) |
7 | 2 | Общее количество секторов на дорожке, уменьшенное на единицу |
9 | 4 | Дальний указатель на буфер обмена с диском, в который помещается считываемая информация или откуда берется записываемая информация |
Форматировать/проверить дорожку
(CL=42h/62h)
Смещение | Размер | Содержимое поля |
0 | 1 | Специальные функции. Для этой операции определен только бит 0.Перед вызовом команды значение бита, равное 0, требуется для форматирования дорожки. Если этот бит установлен в 1, то проверяется возможность использования заданного формата трека. Если после выполнения команды значение бита 0 равно 0, то заданный формат трека поддерживается и заполненную таблицу разметки дорожки можно использовать. Если значение бита 0 равно 1, то затребованный формат дорожки не поддерживается |
1 | 2 | Номер головки для форматирования или проверки |
3 | 2 | Номер дорожки для форматирования или проверки |
Получение информации о логическом дисководе (440Eh)
Вызов:
Регистр | Содержание |
AH | 44h |
AL | 0Eh |
BL | Номер дисковода (0 - текущий дисковод, 1 - дисковод А: и т. д.) |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
AL | Содержимое этого регистра равно 0, если данному дисководу соответствует только одно логическое устройство, или номеру текущего логического дисковода (1 - А:, 2 - В: и т. д.). |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | 01h - запрошена несуществующая функция; 0Fh - неправильный идентификатор дисковода |
Установка текущего логического дисковода (440Fh)
Вызов:
Регистр | Содержание |
AH | 44h |
AL | 0Fh |
BL | Номер дисковода, который должен стать текущим (0 - текущий дисковод, 1 - дисковод А: и т. д.) |
Выполнение без ошибки:
Регистр | Содержание |
CF | 0 |
AL | Содержимое этого регистра равно 0, если данному дисководу соответствует только одно логическое устройство, или номеру логического дисковода, который будет использоваться в последующих операциях ввода/вывода (1 - А:, 2 - В: и т. д.) |
Выполнение с ошибкой:
Регистр | Содержание |
CF | 1 |
AX | 01h - запрошена несуществующая функция; 0Fh - неправильный идентификатор дисковода |
Последние две команды предназначены для работы с логическими дисководами. На одном физическом дисководе операционная система MS-DOS может образовать несколько логических дисков. Эти команды могут использоваться программами, например, для выдачи сообщения о необходимости заменить дискету при переходе от одного логического устройства к другому, если эти устройства расположены на одном физическом накопителе.