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

Список загружаемых драйверов устройств


Все драйверы, резидентные или подключенные к операционной системе во время обработки файла CONFIG.SYS, связаны в список. Первый драйвер - это так называемый NUL-драйвер - располагается всегда непосредственно после векторной таблицы связи. Подробно о драйверах будет рассказано во второй книге, а сейчас мы кратко опишем, как проследить цепочку загруженных драйверов и получить некоторые сведения об этих драйверах.

Драйвер - это программа, которая занимает не более одного сегмента (64 килобайта) и имеет в самом начале специальный заголовок. Заголовок драйвера имеет следующий формат:



(0) 4 next указатель на заголовок следующего драйвера. Если смещение адреса следующего драйвера равно FFFF, это последний драйвер в цепочке
(+4) 2 attrib атрибуты драйвера
(+6) 2 strateg смещение программы стратегии драйвера
(+8) 2 interrupt смещение программы обработки прерывания для драйвера
(+10) 8 dev_name имя устройства для символьных устройств или количество обслуживаемых устройств для блочных устройств.

Мы приведем программу, которая сканирует список драйверов и выводит на стандартное устройство вывода адрес драйвера, его атрибуты, имя устройства для символьных устройств и количество обслуживаемых устройств для блочных драйверов.

Эта программа написана на языке ассемблера.

; Программа выводит информацию о загруженных драйверах

; ; Mакроопределение печатает символы на экране ; @@out_ch MACRO c1,c2,c3,c4,c5 mov ah,02h IRP chr,<c1,c2,c3,c4,c5> IFB <chr> EXITM ENDIF mov dl,chr int 21h ENDM ENDM

.MODEL tiny DOSSEG

.STACK 100h

.DATA

msg DB 13,10,"Device Drivers Information V1.00", 13, 10 DB "Copyright (C)Frolov A.,1990",13,10,13,10 DB "Address Attr Device Name",13,10 DB "------- ---- -----------",13,10 DB "$"

bl_msg DB "------> Block Device, Number of Units: ","$"

.CODE .STARTUP

mov ah, 9h ; Выводим заголовок mov dx, OFFSET msg int 21h

mov ah,52h ; Получаем адрес первого int 21h ; драйвера в цепочке add bx,22h ; es:bx - адрес первого драйвера


dr_loop: call show_driver_info ; выводим параметры ; драйвера

cmp WORD PTR es:[bx+2], 0ffffh ; последний ? jz end_of_driver_list cmp WORD PTR es:[bx], 0ffffh jz end_of_driver_list

mov ax,es:[bx] ; получаем адрес следующего mov cx,es:[bx+2] ; драйвера mov bx,ax mov es,cx

jmp dr_loop

end_of_driver_list:

.EXIT 0

show_driver_info proc near ;es:bx - адрес драйвера

push es push bx

mov ax,es ; выводим адрес драйвера call Print_word @@out_ch ':' mov ax,bx call Print_word @@out_ch ' ',' '

mov ax,es:[bx+4] ; выводим атрибут драйвера call Print_word @@out_ch ' ',' '

test WORD PTR es:[bx+4],8000h ; проверяем, это ; символьный jz is_block ; драйвер или ; блочный

mov cx,8 ; для символьного выводим mov si,bx ; имя драйвера pr_name: mov al,BYTE PTR es:[si+10] @@out_ch al inc si loop pr_name jmp nxt

is_block:

mov ah, 9h ; для блочного драйвера mov dx, OFFSET bl_msg ; выводим количество int 21h ; логических устройств, mov al,BYTE PTR es:[bx+10] ; которые ; обслуживает mov ah,0 ; этот драйвер call Print_word

nxt:

@@out_ch 13,10

pop bx pop es

ret show_driver_info endp

; Вывод на экран содержимого регистра AX

Print_word proc near ;-------------------- push ax push bx push dx ; push ax mov cl,8 rol ax,cl call Byte_to_hex mov bx,dx @@out_ch bh @@out_ch bl ; pop ax call Byte_to_hex mov bx,dx @@out_ch bh @@out_ch bl ; pop dx pop bx pop ax ret Print_word endp ; Byte_to_hex proc near ;-------------------- ; al - input byte ; dx - output hex ;-------------------- push ds push cx push bx ; lea bx,tabl mov dx,cs mov ds,dx ; push ax and al,0fh xlat mov dl,al ; pop ax mov cl,4 shr al,cl xlat mov dh,al ; pop bx pop cx pop ds ret ; tabl db '0123456789ABCDEF' Byte_to_hex endp ;

END

Если запустить эту программу, она выведет на экран сведения о всех загруженных драйверах:

Device Drivers Information V1.00 Copyright (C)Frolov A.,1990

Address Attr Device Name ------- ---- ----------- 02C1:0048 8004 NUL 112F:0000 8800 RBUSDRIV 10E4:0000 0800 ------> Block Device, Number of Units: 0001 0D86:0000 C800 SMARTAAR 0CC7:0000 A000 XMSXXXX0 0BA5:0000 6842 ------> Block Device, Number of Units: 0003 0070:016E 8013 CON 0070:0180 8000 AUX 0070:0192 A040 PRN 0070:01A4 8008 CLOCK$ 0070:01B6 0842 ------> Block Device, Number of Units: 0003 0070:01CA 8000 COM1 0070:01DC A040 LPT1 0070:01EE A040 LPT2 0070:0200 A040 LPT3 0070:0212 8000 COM2 0070:0224 8000 COM3

К этой картинке мы еще вернемся при обсуждении процесса загрузки драйверов.


Содержание раздела