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

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

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

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

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

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

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

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

Эта программа написана на языке ассемблера (листинг 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    

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

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