gotoxy(1,2);
printf("*** Атрибути драйверу %5u ***",cc);
gotoxy(1,3);
if (drv==clock) cprintf(" активний CLOCK$");
if (drv==con) cprintf(" активний CON");
gotoxy(1,4);
if (drv->attr&0x8000)
{
ATR(1,"консоль вводу")
ATR(2,"консоль виводу")
ATR(4,"нульовий прилад")
ATR(8,"CLOCK$ (години)")
ATR(0x2000,"пiдтримуї OUB")
}
else
{
ATR(2,"32-байтна адреса сектора")
ATR(0x2000,"читаї media FAT")
}
ATR(0x40,"пiдтримуї функцi DOS 3.2")
ATR(0x800,"пiдтримуї Open/Close")
ATR(0x4000,"пiдтримуї IOCTL")
gotoxy(1,12);
if (getch()==0) getch();
RmmW(0,1,rx,ry);
gotoxy(xm,ym);
}
main() {
int c;
/* отримання адреси CVT */
rr.h.ah=0x52; intDOS x(&rr,&rr,&sr);
/* адреса драйвера годин */
clock=DA(peek(sr.es,rr.x.bx+10),peek(sr.es,rr.x.bx+8));
/* адреса драйверу консолi */
con=DA(peek(sr.es,rr.x.bx+14),peek(sr.es,rr.x.bx+12));
/* адреса NUL-драйвера */
сlrscr();
printf(" Перегляд списка драйверiв. ");
drv=DA(sr.es,rr.x.bx+34);
gotoxy(8,3);
printf("Нажмiть <SpaceBar> ,а для розгляду атрибутiв",
"драйверу <Enter>.");
gotoxy(28,4);
cc=1;
cprintf("Список драйверiв приладiв :\n\r");
while(FP_OFF(drv)!=0xffff) {
printf("%5u",cc);
printf(" Адреса - %Fp ",drv);
printf(" атрибути - %04X ",drv->attr);
if (drv->attr&0x8000)
for (i=0;i<8; cprintf("%c",drv->name[i++]));
else printf("блочний - %d",drv->name[0]);
printf("\n\r"); y=0;
while ((c=getch())==Enter)FlDrv();
if (c==0) getch();
drv=drv->next; /* адреса наступн.драйвера */
cc++;
}
getch();
}
Результат роботи програми:
1 Адреса - 011c : 0048 атрибути - 8004 Nul
2 Адреса - 02a6 : 0000 атрибути - 8000 Setverxx
3 Адреса - 025d : 0000 атрибути - A000 Xmsxxxx0
4 Адреса - 0070 : 0023 атрибути - 8013 Con
5 Адреса - 0070 : 0035 атрибути - 8000 Aux
6 Адреса - 0070 : 0047 атрибути - A0c0 Prn
7 Адреса - 0070 : 0059 атрибути - 8008 Clock$
8 Адреса - 0070 : 006b атрибути - 08c2 блокова - 4
9 Адреса - 0070 : 007b атрибути - 8000 Com1
10 Адреса - 0070 : 008d атрибути - A0c0 Lpt1
11 Адреса - 0070 : 009f атрибути - A0c0 Lpt2
12 Адреса - 0070 : 00b8 атрибути - A0c0 Lpt3
13 Адреса - 0070 : 00ca атрибути - 8000 Com2
14 Адреса - 0070 : 00dc атрибути - 8000 Com3
15 Адреса - 0070 : 00ee атрибути - 8000 Com4
Висновок: Ознайомилися зі принципом перегляду списку драйверів пристроїв.
Лабораторна робота № 13.
Мета роботи: Перегляд таблиці векторів переривання, що в даний момент знаходяться в ПЕОМ.
Постановка завдання: Визначити, що на даному комп'ютері вектори переривань перехоплені програмами не з складу DOS/BIOS і визначити імена цих програм.
Опис програми:
Головна програма main() виконує нескінченний цикл для обробки кодів нажатих клавіш і в залежності від них викликається функція Printvec() для виводу на екран інформації про вектори переривання. Вихід з даного циклу здійснюється по натиску клавіші Esc.
Функція readvect () читає вектор заданого переривання. Для читання вектору використовуємо функцію 35h DOS (переривання 21h) :
Вхід : Ah = 35h;
Al = номер вектору переривання.
Вихід : ES:BX = адреса програми обробки переривання.
Функція get_memtop() повертає адресу початку ланцюжка MSB csegm. Адресу початку ланцюжка блоків пам'яті можна отримати за допомогою недокументованої функції DOS 0х52. Ця функція повертає в регістри ES:BX деяку адpесу. Віднімаючи з цієї адpеси 2, одержимо адpесу того слова пам'яті, в якому DOS зберігає сегментну адpесу першого MSB в ланцюжку.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.