Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

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

© Александр Фролов, Григорий Фролов
Том 1, книги 1-2, М.: Диалог-МИФИ, 1991.

[Назад] [Содержание] [Дальше]

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

Все драйверы, резидентные или подключенные к операционной системе во время обработки файла 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    

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

[Назад] [Содеожание] [Дальше]