Операционная система MS-DOS
© Александр Фролов, Григорий Фролов
Том 1, книги 1-2, М.: Диалог-МИФИ, 1991.
Операционная система содержит в своем составе
драйвер системных часов. Это драйвер символьного
устройства, имя устройства - 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);
}
![[Назад]](prev.gif) |
![[Содеожание]](sod.gif) |
|