Операционная система MS DOS

       

Драйвер системных часов CLOCK$


Операционная система содержит в своем составе драйвер системных часов. Это драйвер символьного устройства, имя устройства - CLOCK$. Символ "$" используется для того, чтобы это имя не конфликтовало с именем файла CLOCK.

Характерный признак драйвера системных часов - бит 3 слова атрибутов устройства установлен в 1. Именно этот признак используется DOS для обнаружения драйвера часов, имя CLOCK$ может быть изменено в последующих версиях операционной системы.

Для опроса содержимого часов или для установки часов DOS соответственно читает или записывает шесть байтов информации следующего формата:



Смещение Длина Назначение
(0) 2 Количество дней, прошедших после 1 января 1980 года
(+2) 1 Счетчик минут
(+3) 1 Счетчик часов
(+4) 1 Счетчик сотых долей секунды
(+5) 1 Счетчик секунд

Мы приведем пример программы, которая открывает устройство CLOCK$, задает двоичный режим обмена информацией с ним и вводит 6 байтов, имеющих только что описанную структуру. Показания часов выводятся на экран.

#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) {

int io_handle; unsigned count;

struct { unsigned days; unsigned char min; unsigned char hours; unsigned char sec_per_100; unsigned char sec; } clock_buf;

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

if( (io_handle = open("CLOCK$", O_RDWR)) == - 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); }


// Устанавливаем в 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);

// Читаем 6 байт из устройства в буфер buf // Обмен производится в двоичном режиме

if((count = read(io_handle, &clock_buf, 6)) == -1) {

// Если при чтении произошла ошибка, // выводим ее код

printf("Ошибка чтения %d",errno); return errno; }

printf("\nПолучено от драйвера часов CLOCK$:" "\n" "\nПрошло дней после 01.01.80: %d" "\nМинуты: %d" "\nЧасы: %d" "\nСекунды: %d" "\nСотые доли секунды: %d" "\n", clock_buf.days, clock_buf.min, clock_buf.hours, clock_buf.sec, clock_buf.sec_per_100);

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


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