MS-DOS Device Driver >> Assembly >> Basic

基本觀念


DOS驅動程式分為Char和Block兩種類型,這樣的類型跟Linux驅動程式其實很類似,Char指的就是資料是以1 Byte作為傳輸的單位,而Block則是以多個Bytes為傳輸單位,如:磁碟機就是以512 Bytes作為傳輸的單位,需要注意的是,這兩種不同類型的驅動程式,其支援的I/O Request Packet(IRP)也不相同,所以在撰寫DOS驅動程式前,必須先決定使用Char還是Block的驅動程式,若不知道該選擇哪一種類型作為開發,那就選擇Char驅動程式。

DOS驅動程式的進入點是Strategy Callback副程式,所有的呼叫動作一律透過該Callback副程式開始執行,而該Callback副程式是在驅動程式的檔頭資訊宣告,系統在載入驅動程式時,才知道該Callback副程式的位置,進而透過該Callback副程式初始化驅動程式,該檔頭資訊包含如下欄位:

Name Type
NextDriver Double Word
Attribute Word
Strategy Word
Interrupt Word
DriverName 8 Bytes

基本程式架構如下

;//===========================================================================
;// Copyright (c) 2016 by Steward Fu
;// All rights reserved
;//===========================================================================
cseg segment para public 'code'  
 FirstDOS proc far
  assume cs:cseg, es:cseg, ds:cseg    
  Header:
   NextDriver dd -1
   Attribute  dw 8000h
   Strategy   dw MyStrategy
   Interrupt  dw MyInterrupt
   DriverName db 'FirstDOS'

  MyStrategy:
   ret

  MyInterrupt:
   ret  
 FirstDOS endp
cseg ends
end

NextDriver是指向下一個在本檔案中的驅動程式位置,如果一個檔案僅包含一個驅動程式,則此欄位就設定成-1即可
Attribute是描述驅動程式的屬性,它本身是一個16 Bits的資料型態,如下列表:

Bit Value Description DOS
0 1
1
(CHAR)Standard Input Device
(BLOCK)Generic IOCTL
2.0+
3.2~4.xx
1 1
1
Standard Output Device
(BLOCK)32-bit Sector Addresses
2.0+
4.0~5.0
2 1 Null Device 2.0+
3 1 Clock Device 2.0+
4 1 Fast Console I/O 2.0
5 0 Undefined
6 1
1
(BLOCK)Get/Set Logical Device
Generic IOCTL
3.2+
3.3~5.0
7 1 IOCTL Query
8 0 Undefined
9 0 Undefined
10 0 Undefined
11 1 Open/Close/Removable Media 3.0+
12 0 Undefined
13 0
1
1
(BLOCK)IBM Format
(BLOCK)Non-IBM Format
(CHAR)Output Til Busy
2.0+
2.0+
3.0+
14 1 IOCTL 2.0+
15 0
1
BLOCK
CHAR
2.0+
2.0+

StrategyInterrupt這兩個欄位分別指向Strategy和Interrupt Callback副程式位址,DOS系統呼叫驅動程式是採取兩個階段的呼叫方式,所謂兩個階段的意思就是,當DOS要呼叫驅動程式做事情時,DOS會先呼叫Strategy Callback副程式並且把要傳遞給驅動程式的資料放在ES:BX位置,所以,Strategy Callback副程式就類似預處理動作,呼叫完Strategy Callback副程式後,DOS便接著呼叫Interrupt Callback副程式,當Interrupt Callback副程式被呼叫時,驅動程式本身就必需去參考剛剛Strategy Callback副程式儲存在ES:BX的資料,這樣驅動程式就會知道系統要它去執行什麼樣的動作,而ES:BX資料就是所謂的I/O Request Packet(IRP)
DriverName是驅動程式的名稱,該名稱就是提供給應用程式開啟的名稱,如:COM1就是驅動程式提供給應用程式開啟COM Port1的名稱,這些名稱可以使用:mem /d | more指令查看,它必須是剛好八個字元,不足八個字元時,其餘字元要補上空白字元


返回上一頁