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+ |
Strategy和Interrupt這兩個欄位分別指向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指令查看,它必須是剛好八個字元,不足八個字元時,其餘字元要補上空白字元