Системное программное обеспечение персональных ЭВМ


Пример 5



Пример 5

/*== ПРИМЕР 13.1 ==*/ /*================= Просмотр списка драйверов ============*/ #include <dos.h> #define byte unsigned char #define word unsigned int #define ATR(x,z) if(drv->attr&x){printf(" %s\n",z);y++;} #define DA(x,y) (struct DR_HEAD *)MK_FP(x,y); struct DR_HEAD { /* заголовок драйвера */ struct DR_HEAD *next; word attr, strat_addr, intr_addr; char name[8]; } *drv; /* адрес текущего драйвера */ struct DR_HEAD *clock, *con; /* Адреса CLOCK$ и CON */ union REGS rr; struct SREGS sr; int i, y, y1; main() { /* получение адреса CVT */ rr.h.ah=0x52; intdosx(&rr,&rr,&sr); /* адрес драйвера часов */ clock=DA(peek(sr.es,rr.x.bx+10),peek(sr.es,rr.x.bx+8)); /* адрес драйвера консоли */ con=DA(peek(sr.es,rr.x.bx+14),peek(sr.es,rr.x.bx+12)); /* адрес NUL-драйвера */ drv=DA(sr.es,rr.x.bx+34); printf("\nСписок драйверов устройств\n"); while(FP_OFF(drv)!=0xffff) { printf("Адрес - %Fp атрибуты - %04X ", drv,drv->attr); if (drv->attr&0x8000) for (i=0;i<8; printf("%c",drv->name[i++])); else printf("блочный - %d",drv->name[0]); printf("\n"); y=0; if (drv==clock) { printf(" активный CLOCK$\n"); y++; } if (drv==con) { printf(" активный CON\n"); y++; } if (drv->attr&0x8000) { ATR(1,"консоль ввода") ATR(2,"консоль вывода") ATR(4,"нулевое устройство") ATR(8,"CLOCK$ (часы)") ATR(0x2000,"поддерживает OUB") } else { ATR(2,"32-байтный адрес сектора") ATR(0x2000,"читает media FAT") } ATR(0x40,"поддерживает функции DOS 3.2") ATR(0x800,"поддерживает Open/Close") ATR(0x4000,"поддерживает IOCTL") y=(y1=wherey())-y; getch(); for(i=y;i<y1;gotoxy(1,i++),clreol()); gotoxy(1,y); drv=drv->next; /* адрес след.драйвера */ } printf("Конец списка. Нажмите любую клавишу...\n"); getch(); }

Проанализировав результаты выполнения этой программы, читатель может прийти к следующим выводам. Пустой (NUL) драйвер, который состоит из одного заголовка выполняет единственную функцию - быть "головой" списка драйверов. Системные драйверы (драйверы, включенные в файл IO.SYS) образуют исходный список драйверов. Драйверы, устанавливаемые после них (по команде DEVICE в CONFIG.SYS), включаются в начало этого списка - сразу после NUL-драйвера. Таким образом, если устанавливаемый драйвер имеет то же имя, что и системный, то выбираться при обращении по этому имени будет устанавливаемый драйвер, так как он находится ближе к началу списка. При обращениях к драйверам CON и CLOCK$ поиск в списке не выполняется, для ускорения обращения их адреса выбираются из CVT.




- Начало -  - Назад -  - Вперед -