驅動程式 - MS-DOS Device Driver (MDD) - 教學說明 - 1. 檔頭資訊



驅動程式的檔頭資訊是用來設定Callback副程式以及描述驅動程式的屬性

欄位 長度 描述
NextDriver 4 Bytes 指向下一個驅動程式的位置,如果沒有下層驅動程式,設定-1即可
Attribute 2 Bytes 描述驅動程式的屬性
Strategy 2 Bytes Callback副程式
Interrupt 2 Bytes Callback副程式
DriverName 8 Bytes 驅動程式的名稱,可以使用mem /d指令查看,不足8個字元時,其餘要補上空白字元

Attribute的欄位屬性

位元 說明
0 0 - Not Standard Input Device
1 - Standard Input Device
1 0 - Not Standard Output Device
1 - Standard Output Device
2 0 - Not NUL Device
1 - NUL Device
3 0 - Not Clock Device
1 - Clock Device
4 0 -
1 - Fast Console I/O
5 0 -
1 - Reserved
6 0 -
1 - Generic IOCTL
7 0 -
1 - IOCTL Query
8 0 -
1 - Reserved
9 0 -
1 - Reserved
10 0 -
1 - Reserved
11 0 - Not Support Removable Media
1 - Supports Removable Media
12 0 -
1 - Reserved
13 0 - IBM Format Block Device
1 - Non-IBM Format Block Device
14 0 - Not Support IOCTL
1 - Supports IOCTL
15 0 - Block Device
1 - Character Device

範例如下:

cseg segment para public 'code'
    MyDriver proc far
        assume cs:cseg, es:cseg, ds:cseg
        NextDriver dd -1
        Attribute  dw 8000h
        Strategy   dw MyStrategy
        Interrupt  dw MyInterrupt
        DriverName db 'MyDriver'

    MyStrategy:
        ret

    MyInterrupt:
        ret  
    MyDriver endp
cseg ends
end

系統呼叫驅動程式是採取兩個階段的呼叫方式,所謂兩個階段的意思就是,系統會先呼叫Strategy Callback副程式並且把要傳遞給驅動程式的資料放在ES:BX位址,所以,Strategy Callback副程式就類似預處理動作,呼叫完Strategy Callback副程式後,系統接著呼叫Interrupt Callback副程式,當Interrupt Callback副程式被呼叫時,驅動程式本身就必需去參考剛剛Strategy Callback副程式儲存的ES:BX資料,這樣驅動程式就會知道系統要它去執行什麼樣的Command,而ES:BX資料就是所謂的I/O Request Packet(IRP)