Таблица 8



Таблица 8

(0) 4next указатель на заголовок следующего драйвера. Если смещение адреса следующего драйвера равно FFFF, это последний драйвер в цепочке
(+4) 2attrib атрибуты драйвера
(+6) 2strateg смещение программы стратегии драйвера
(+8) 2interrupt смещение программы обработки прерывания для драйвера
(+10) 8dev_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

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



- Начало - - Назад - - Вперед -