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

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

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

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

4.1. Получение различной информации

С помощью описанных ниже подфункций программа может получить разнообразную информацию об открытом файле или устройстве.

Состояние открытого файла и конфигурация устройства

С помощью подфункции 00h, описанной в предыдущем томе, можно получить информацию об открытом файле или о конфигурации устройства по его идентификатору.

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

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

Определение момента достижения конца файла

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

Для проверки условия "Конец файла" или готовности устройства можно использовать следующую функцию:

/**
*  heof
*
*  Проверить условие "Конец файла"
*
*  Функция позволяет проверить факт достижения
*  конца файла или готовность устройства
*
*  int heof(int handle);
*
*  handle - идентификатор файла или устройства,
*           для которого необходимо получить
*           информацию о состоянии
*
* Возвращаемо значение;
*  0      - конец файла не достигнут (для файла),
*           устройство готово (для устройства);
*
*  1      - достигнут конец файла (для файла),
*           устройство не готово (для устройства);
*
*  -1     - произошла ошибка.
**/
int heof(int handle) 
{
  union REGS reg;

  // Заполняем регистровые структуры для вызова
  // прерывания DOS INT 21h. Код используемой
  // подфункции - 06h
  reg.x.ax = 0x4406;
  reg.x.bx = handle;

  // Вызываем прерывание
  intdos(&reg, &reg);

  // Проверяем флаг переноса
  if(reg.x.cflag == 0) 
  {
    // Если флаг переноса сброшен в 0, ошибок нет.
    if(reg.h.al == 0) return(1);
    else return(0);
  }

  // Если флаг переноса установлен в 1, возвращаем
  // признак ошибки
  else return(-1);
}

Вы можете использовать эту функцию аналогично функции eof().

Расположение открытого файла или устройства

Подфункция 0Ah функции 44h прерывания INT 21h поможет программе, работающей в сети, определить расположение открытого файла или устройства - на рабочей станции или на сервере.

Перед вызовом запишите в регистр BX идентификатор проверяемого файла или устройства.

После возврата из подфункции регистр DX содержит слово атрибутов для файла или устройства. Если самый старший бит в этом слове равен 0, то файл или устройство является локальным и расположено на рабочей станции. Если же этот бит равен 1, то файл или устройство удаленное и находится на сервере (подключено к серверу, если проверяется устройство).

Обычно программы составляют таким образом, чтобы их работа не зависела от расположения файлов и дисков. Но если такая информация вам когда-либо понадобится, вы можете воспользоваться подфункцией 0Ah.

Аналогично для проверки расположения дискового устройства можно использовать подфункцию 09h.

Перед вызовом запишите в регистр BL код устройства (0 - текущий диск, 1 - А:, 2 - В:, и т. д.). Двенадцатый бит регистра DX после вызова этой функции покажет вам расположение устройства: 0 - локальное, 1 - удаленное.

Возможность замены носителя данных

Для проверки возможности замены носителя данных в устройстве вы можете воспользоваться подфункцией 08h. Используя эту подфункцию, вы сможете отличить НГМД от НМД. Это может вам пригодиться, например, при выполнении операции форматирования, так как форматирование НГМД и НМД выполняется по-разному.

Перед вызовом подфункции 08h запишите код устройства в регистр BL (0 - текущий диск, 1 - А:, 2 - В:, и т. д.). Если носитель данных сменный, то после выполнения подфункции регистр AL будет содержать 0, в противном случае - 1.

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

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