Работа с драйвером символьного устройства


// Данная прорамма использует прерывание 80h, // которое устанавливается демонстрационным // драйвером. Для правильной установки файл // CONFIG.SYS должен содержать, например, // такую строку для подключения драйвера: // // device=e:\sysprg\devdrv.sys 1 80 378 379 37a 37a // // Число 80 означает номер используемого прерывания.

#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], ch; int io_handle; unsigned count;

// Открываем устройство с именем DEVDRIVR

if( (io_handle = open("DEVDRIVR", O_RDWR)) == - 1 ) {

// Если открыть устройство не удалось, выводим // код ошибки

printf("Ошибка при открытии устройства %d",errno); return errno; }

// Читаем 8 байт из устройства в буфер buf

printf("\nВведите 8 символов с клавиатуры\n");

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; }

// Вводим строку IOCTL из устройства

printf("\nВведите строку IOCTL (8 символов): ");

inregs.h.ah = 0x44; inregs.h.al = 2; inregs.x.bx = io_handle; inregs.x.dx = (unsigned)buf; inregs.x.cx = 8; intdos( &inregs, &outregs ); if(outregs.x.cflag == 1) {

// При ошибке выводим код ошибки

printf("IOCTL error %x\n",&outregs.x.ax); exit(-1); } buf[8]=0; printf("\n___ Введена строка IOCTL: %s ___",buf);

// Выводим строку IOCTL на устройства из buf

printf("\nВыведена строка IOCTL: ");

inregs.h.ah = 0x44; inregs.h.al = 3; inregs.x.bx = io_handle; inregs.x.dx = (unsigned)buf; inregs.x.cx = 8; intdos( &inregs, &outregs ); if(outregs.x.cflag == 1) {

// При ошибке выводим код ошибки

printf("IOCTL error %x\n",&outregs.x.ax); exit(-1); }

printf("\n\n\nПроверяем вызов прерывания." "\n" "\nНажмите любую клавишу...\n\n"); getch();

printf("\nКоманда записи:\n");

inregs.h.ah = 0x0; /* WRITE */ inregs.h.bh = 0x777; inregs.h.bl = 0x13; int86( 0x80, &inregs, &outregs );

printf("\nКоманда чтения:\n");

inregs.h.ah = 0x1; /* READ */ inregs.h.bh = 0x776; int86( 0x80, &inregs, &outregs ); ch=outregs.h.bl;

printf("Полученное значение: %x\n",ch);

printf("\nНеизвестная команда:\n");

inregs.h.ah = 0x2; /* ??? */ int86( 0x80, &inregs, &outregs );

// Закрываем устройство close(io_handle); exit(0); }



Содержание раздела