По правилам DOS, кодова частина драйвера складається з двох секцiй, що називаються секцiєю стратегiї i секцiєю обробки переривань. Поля strat_off i intr_off заголовку мiстять змiщення цих секцiй від початку драйвера. Стаття name для символьного влаштування містить iм'я влаштування (можливо, доповнене прогалинами ), а для блокового – перший байт цього поля мiстить кiлькiсть приладiв, що пiдтримуються драйвером.
За допомогою поля next, яке заповнюється системою при завантаженнi драйвера, всi драйвери ( системнi i встановленнi ) зв'язуються в список. Початок цього списку - заголовок драйвера Nul в Cvt. Значення 0xffff в частині змiщення поля next є ознакою кiнця списку ( також ознака кiнця використовується i в списках, що утворюються iншими керуючими блоками ). Головна програма прикладу ловить цей список.
Частина тексту програми, яка була змінена для індивідуального завдання:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
main() {
int c,s,count,b,d;
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
d=0;
s=0;
b=0;
. . . . . . . . . . . . . . . . .
if (drv->attr&0x8000)
{cout<<"(1) ";
count++;}
else cout<<"(0) ";
textattr(13);
if (drv->attr&0x8000)
{ for (i=0;i<8; cprintf("%c",drv->name[i++]));
s++;
}
else
{ b++;
cprintf("блочный - %d",drv->name[0]);
}
cprintf("\n\r"); y=0;
while ((c=getch())==Enter)FlDrv();
if (c==0) getch();
drv=drv->next; /* адрес след.драйвера */
d++;
cc++;
}
textattr(10);
cprintf("Всего драйверов: %d ",d);
cprintf("\nСимвольных драйверов - %d",s);
cprintf("\nБлочных драйвер - %d",b);
cprintf("\n\r");
textattr(12+128);
cprintf("Конец списка. Нажмите любую клавишу...\n");
getch();
textattr(7);
}
Результати:
_______________ Лабораторная работа N12 _______________
_______________ Просмотр списка драйверов. _______________
Нажимайте <SpaceBar> ,а для рассмотрения атрибутов <Enter>.
Список драйверов устройств :
1 Адрес - 00C9:0048 атрибуты - 8004(1) NUL
2 Адрес - 07F1:0000 атрибуты - D000(1) IFS$HLP$
3 Адрес - 0737:0000 атрибуты - C840(1) DblBuff$
4 Адрес - 06F1:0000 атрибуты - A000(1) XMSXXXX0
5 Адрес - 0288:0000 атрибуты - C053(1) CON
6 Адрес - 0254:0000 атрибуты - 8000(1) SETVERXX
7 Адрес - 0070:0016 атрибуты - 8013(1) CON
8 Адрес - 0070:0028 атрибуты - 8000(1) AUX
9 Адрес - 0070:003A атрибуты - A0C0(1) PRN
10 Адрес - 0070:004C атрибуты - 8008(1) CLOCK$
11 Адрес - 0070:005E атрибуты - 08C2(0) блочный - 5
12 Адрес - 0070:006A атрибуты - 8000(1) COM1
13 Адрес - 0070:007C атрибуты - A0C0(1) LPT1
14 Адрес - 0070:008E атрибуты - A0C0(1) LPT2
15 Адрес - 0070:00A0 атрибуты - A0C0(1) LPT3
16 Адрес - 0070:012D атрибуты - C000(1) CONFIG$
17 Адрес - 0070:00B8 атрибуты - 8000(1) COM2
18 Адрес - 0070:00CA атрибуты - 8000(1) COM3
19 Адрес - 0070:00DC атрибуты - 8000(1) COM4
20 Адрес - 0BDA:0000 атрибуты - C800(1) mscd$$$$
21 Адрес - 0BD5:0000 атрибуты - C000(1) EMMXXXX0
Vsego driverov: 21
Simvolnih driverov - 20
Blochnih driverov - 1
Конец списка. Нажмите любую клавишу...
Висновки: В ході лабораторної роботи я змінив текст початкової програми для того, щоб подивитися список всіх (блочних і символьних) драйверiв, які в даний час знаходяться на даній ЕОМ.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.