MS-DOS для программиста© Александр Фролов, Григорий ФроловТом 18, М.: Диалог-МИФИ, 1995, 254 стр. 2.7. Список загружаемых драйверов устройствВсе драйверы, резидентные или подключенные к операционной системе во время обработки файла config.sys , связаны в список. Первый драйвер - это так называемый NUL-драйвер . Он располагается в памяти всегда непосредственно после векторной таблицы связи. Подробно о драйверах будет рассказано отдельной главе, а сейчас мы кратко опишем, как проследить цепочку загруженных драйверов и получить некоторые сведения об этих драйверах. Драйвер - это программа, которая занимает только один сегмент (64 Кбайт) и имеет в самом начале специальный заголовок. Заголовок драйвера имеет следующий формат:
Мы приведем программу, которая сканирует список драйверов и выводит на стандартное устройство вывода адрес драйвера, его атрибуты, имя устройства для символьных устройств и количество обслуживаемых устройств (только для блочных драйверов). Эта программа написана на языке ассемблера (листинг 2.6). Листинг 2.6. Файл drvlist\drvlist.asm ; Программа выводит информацию о загруженных драйверах ; ; Эта макрокоманда выводит символы на экран ; @@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 .DATA msg DB 13,10,"Device Drivers Information V1.1", 13, 10 DB "(C) Фролов А.В., 1995",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 Для трансляции приведенного в листинге 2.5 исходного текста мы использовали пакетный файл, запускающий Turbo Assembler и Turbo Linker, которые входят в состав Borland C++ версий 3.0 и 3.1 (листинг 2.7). Листинг 2.7. Файл drvlist\mk.bat tasm drvlist tlink drvlist /t Если запустить программу DRVLIST, она выведет на экран список всех загруженных драйверов и сведения о них: Device Drivers Information V1.1 (C) Фролов А.В., 1995 Address Attr Device Name ------- ---- ----------- 011C:0048 8004 NUL 0E5D:2192 08C2 --------> Block Device, Number of Units: 0004 DD61:0000 C053 CON EC03:0000 D000 IFS$HLP$ C94C:0000 C800 MITSUMI 02CB:003A C000 $MMXXXX0 02CB:0000 C000 EMMQXXX0 0282:0000 A000 XMSXXXX0 025D:0000 8000 SETVERXX 0070:0023 8013 CON 0070:0035 8000 AUX 0070:0047 A0C0 PRN 0070:0059 8008 CLOCK$ 0070:006B 08C2 --------> Block Device, Number of Units: 0004 0070:007B 8000 COM1 0070:008D A0C0 LPT1 0070:009F A0C0 LPT2 0070:00B8 A0C0 LPT3 0070:00CA 8000 COM2 0070:00DC 8000 COM3 0070:00EE 8000 COM4 К этому списку мы еще вернемся при обсуждении процесса загрузки драйверов. |