Операционная система MS-DOS© Александр Фролов, Григорий ФроловТом 1, книги 1-2, М.: Диалог-МИФИ, 1991. 2.5. Список загружаемых драйверов устройствВсе драйверы, резидентные или подключенные к операционной системе во время обработки файла CONFIG.SYS, связаны в список. Первый драйвер - это так называемый NUL-драйвер - располагается всегда непосредственно после векторной таблицы связи. Подробно о драйверах будет рассказано во второй книге, а сейчас мы кратко опишем, как проследить цепочку загруженных драйверов и получить некоторые сведения об этих драйверах. Драйвер - это программа, которая занимает не более одного сегмента (64 килобайта) и имеет в самом начале специальный заголовок. Заголовок драйвера имеет следующий формат:
Мы приведем программу, которая сканирует список драйверов и выводит на стандартное устройство вывода адрес драйвера, его атрибуты, имя устройства для символьных устройств и количество обслуживаемых устройств для блочных драйверов. Эта программа написана на языке ассемблера.
; Программа выводит информацию о загруженных драйверах
;
; 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 К этой картинке мы еще вернемся при обсуждении процесса загрузки драйверов. |

