# 01H Установить информацию об устройстве
Вызов:
Регистр | |
AH | 44h |
AL | 01h |
BX | Индекс файла (handle) |
DH | 0 |
DL | Устанавливаемая информация (биты 0-7 слова информации об устройстве, описанного выше) |
Возврат без ошибки:
Регистр | |
CF | 0 |
Возврат с ошибкой:
Регистр | ||
CF | 1 | |
AX | 01h - запрошена несуществующая функция;
06h - BX содержит несуществующий handle. |
Эта подфункция позволяет устанавливать некоторые биты в слове информации об устройстве.
В зависимости от установки бита 5 (двоичный/ASCII) драйвер по-разному выполняет команды ввода-вывода.
В режиме ASCII обмен с драйвером символьного устройства выполняется по байтам (содержимое поля count в запросе всегда равно 1). Если Вам надо обслуживать быстродействующее устройство ввода/вывода, такой посимвольный обмен может оказаться слишком медленным. В этом случае Вы можете установить бит 5 в единицу и выполнять обмен в двоичном режиме. Разумеется, Вам придется самостоятельно отслеживать управляющие символы.
Ниже мы приведем пример программы, которая сначала устанавливает ASCII-режим для драйвера, описанного выше, выводит на него 8 символов, затем выполняет аналогичную операцию в двоичном режиме. Драйвер при каждом обращении к нему для ввода или вывода выдает сообщение на экран. Запустив программу (и не забыв подключить драйвер), Вы увидите, что в ASCII-режиме для записи или чтения восьми символов драйвер вызывается восемь раз, а в двоичном режиме - только один раз.
#include <io.h> #include <conio.h> #include <stdio.h> #include <fcntl.h> #include <sys\types.h> #include <sys\stat.h> #include <malloc.h> #include <errno.h> #include <dos.h>
int main(void);
union REGS inregs, outregs; struct SREGS segregs;
int main(void) {
char buf[100]; int io_handle; unsigned count;
// Открываем устройство с именем IODRIVER
if( (io_handle = open("IODRIVER", O_RDWR)) == - 1 ) {
// Если открыть не удалось, выводим // код ошибки
printf("Ошибка при открытии устройства %d",errno); return errno; }
// Читаем 8 байт из устройства в буфер buf
if( (count = read(io_handle, buf, 8)) == -1 ) {
// Если при чтении произошла ошибка, // выводим ее код
printf("Ошибка чтения %d",errno); return errno; }
// Закрываем прочитанную строку нулем // для последующего вывода функцией printf
buf[8]=0;
printf("\n___ Введена строка: %s ___",buf);
// Выводим только что прочитанные данные // обратно на то же устройство
if( (count = write(io_handle, buf, 8)) == -1 ) {
// Если при записи произошла ошибка, // выводим ее код
printf("Ошибка записи %d",errno); return errno; }
// Получаем информацию об устройстве
inregs.h.ah = 0x44; inregs.h.al = 0; inregs.x.bx = io_handle; intdos( &inregs, &outregs ); if(outregs.x.cflag == 1) {
// При ошибке выводим ее код
printf("IOCTL error %x\n",&outregs.x.ax); exit(-1); }
// Выводим слово информации об устройстве на экран
printf("\nDevice Information: %04X\n", outregs.x.dx);
// Устанавливаем в 1 бит 5 (переключаем драйвер // в двоичный режим обмена данными
inregs.x.dx = (outregs.x.dx | 0x0020) & 0x00ff;
// Устанавливаем слово информации об устройстве
inregs.h.ah = 0x44; inregs.h.al = 1; inregs.x.bx = io_handle; intdos( &inregs, &outregs ); if(outregs.x.cflag == 1) {
// При ошибке выводим код ошибки
printf("IOCTL error %x\n",&outregs.x.ax); exit(-1); }
// Выводим слово информации об устройстве на экран
printf("\nDevice Information: %04X\n", outregs.x.dx);
// Читаем 8 байт из устройства в буфер buf // Обмен теперь производится в двоичном режиме
if( (count = read(io_handle, buf, 8)) == -1 ) {
// Если при чтении произошла ошибка, // выводим ее код
printf("Ошибка чтения %d",errno); return errno; }
// Закрываем прочитанную строку нулем // для последующего вывода функцией printf
buf[8]=0;
printf("\n___ Введена строка: %s ___",buf);
// Выводим только что прочитанные данные // обратно на то же устройство
if( (count = write(io_handle, buf, 8)) == -1 ) {
// Если при записи произошла ошибка, // выводим ее код
printf("Ошибка записи %d",errno); return errno; }
// Закрываем устройство
close(io_handle);
exit(0); }