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

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

© Александр Фролов, Григорий Фролов
Том 1, книги 1-2, М.: Диалог-МИФИ, 1991.

[Назад] [Содеожание]

6.7. Драйвер системных часов 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);
}
[Назад] [Содеожание]