Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

[Назад] [Содеожание] [Дальше]

6.5. Функция управления устройствами IOCTL

После обзора команд перейдем к описанию функции 44h прерывания INT 21h . Эта функция предназначена для управления вводом/выводом и обладает широкими возможностями.

Мы рассмотрим средства управления устройствами ввода/вывода IOCTL . Использование IOCTL - обычный метод организации связи с устройствами или получения информации об открытых файлах.

Описания будут приводиться в порядке номеров подфункций функции 44h прерывания INT 21h .

Получить конфигурацию устройства (4400h)

Вызов:

Регистр Содержание
AH 44h
AL 00h
BX Идентификатор устройства (handle). Это значение, которое операционная система возвращает при открытии файла или устройства и которое она затем использует для доступа к открытому файлу или устройству

Выполнение без ошибки:

Регистр Содержание
CF 0
DX Конфигурация устройства

Выполнение с ошибкой:

Регистр Содержание
CF 1
AX 01h - запрошена несуществующая функция;05h - доступ запрещен;
06h - BX содержит несуществующий или неоткрытый идентификатор устройства

Функция возвращает в регистре DX слово конфигурации устройства, которое имеет следующий формат:

Бит Значение
0 Это устройство является стандартным устройством ввода
1 Стандартное устройство вывода
2 NUL-устройство
3 Часы
4 Специальное устройство
5 1 - двоичный режим работы;
0 - режим ASCII
6 0 - при чтении достигнут конец файла
7 1 - это слово информации относится к устройству (идентификатор относится к устройству);
0 - слово информации относится к файлу
8-10 Зарезервировано
11 1 - Устройство поддерживает команды открытия/закрытия
12 Сетевое устройство
13 Устройство поддерживает вывод до состояния занятости
14 Устройство может обрабатывать управляющие строки IOCTL , посылаемые подфункциями 2, 3, 4, 5 функции 44h. Подфункция 1 функции 44 h может только прочитать, но не установить этот бит
15 Зарезервировано

Если при вызове этой подфункции регистр BX содержит идентификатор файла, формат информации, получаемой в регистре DX, будет следующий:

Бит Значение
0-5 Номер дискового устройства (0 - А:, 1 - В: и т. д.)
6 0 - была запись в выходной файл
7 1 - это слово информации относится к устройству (так как данный идентификатор относится к устройству);
0 - слово информации относится к файлу
8-11 Зарезервировано
12 Сетевое устройство
13-14 Зарезервировано
15 1 - файл является удаленным (при работе в сети)

Особое внимание следует обратить на бит 5 слова информации об устройстве. Этот бит определяет режим обмена данными между операционной системой и драйвером: двоичный или символьный. В двоичном режиме управляющие символы <Ctrl+C>, <Ctrl+P>, <Ctrl+S>, <Ctrl+Z> интерпретируются как обычные данные.

Установить слово конфигурации устройства (4401h)

Вызов:

Регистр Содержание
AH 44h
AL 01h
BX Идентификатор файла
DH 0
DL Биты 0-7 нового слова конфигурации устройства

Выполнение без ошибки:

Регистр Содержание
CF 0

Выполнение с ошибкой:

Регистр Содержание
CF 1
AX 01h - запрошена несуществующая функция;05h - доступ запрещен;
06h - BX содержит несуществующий идентификатор устройства;0Dh - неправильные данные

Эта подфункция позволяет устанавливать некоторые биты в слове конфигурации устройства.

В зависимости от установки бита 5 драйвер выполняет команды ввода/вывода различным образом.

В режиме ASCII обмен с драйвером символьного устройства выполняется по байтам (содержимое поля count в запросе всегда равно 1). Если вам надо обслуживать быстродействующее устройство ввода/вывода, такой обмен может оказаться слишком медленным. В этом случае вы можете установить бит 5 в единицу и выполнять обмен в двоичном режиме. Разумеется, вам придется самостоятельно отслеживать все управляющие символы.

Чтение управляющей информации для символьных устройств (4402h)
Запись управляющей информации для символьных устройств (4403h)

Вызов:

Регистр Содержание
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 может образовать несколько логических дисков. Эти команды могут использоваться программами, например, для выдачи сообщения о необходимости заменить дискету при переходе от одного логического устройства к другому, если эти устройства расположены на одном физическом накопителе.

[Назад] [Содеожание] [Дальше]