首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

DRIVER:MS-DOS 可安裝裝置驅動程式完整範本

     編輯:組合語言

前言:從 HDR 框架到完整驅動程式骨架

承接 HDR.ASM (ID 13299) 的標頭與策略/中斷框架,DRIVER.ASM (Ray Duncan, 1985) 提供一個功能完整 (雖為存根) 的字元裝置驅動程式範本:包含標頭、屬性字解析、請求標頭結構、策略/中斷常式、16 大命令碼分派表、狀態字定義、錯誤/完成出口集中處理、初始化常式。所有實際裝置操作常式 (Input, Output, Ioctl 等) 僅為 `JMP Done` 存根,但架構完整可直接擴充為真實驅動程式 (如序列埠、平行埠、虛擬磁碟、鍵盤過濾器)。

驅動程式標頭

Header dd -1              ; 串列結尾
 dw 8000h                 ; 字元裝置, Bit 15=1
 dw Strat                 ; 策略常式
 dw Intr                  ; 中斷常式
 db 'DRIVER '             ; 裝置名稱 (8 字元)

屬性字位定義 (註解詳盡):Bit 15=字元, Bit 14=IOCTL, Bit 13=非 IBM 格式, Bit 11=Open/Close/Removable, Bit 3=Clock, Bit 2=NUL, Bit 1=StdOut, Bit 0=StdIn。

請求標頭結構

Request struc
Rlength db ?          ; 長度
Unit db ?             ; 單元號
Command db ?          ; 命令碼
Status dw ?           ; 狀態字
Reserve db 8 dup (?)
Media db ?            ; 媒體描述符
Address dd ?          ; 緩衝區位址
Count dw ?            ; 計數
Sector dw ?           ; 起始扇區 (區塊裝置)
Request ends

策略常式

Strat proc far
 mov word ptr cs:[RH_Ptr], bx
 mov word ptr cs:[RH_Ptr+2], es
 ret
Strat endp

僅儲存 ES:BX (請求標頭遠端指標) 至本地變數 RH_Ptr。

中斷常式與命令分派

Intr proc far
 push ax, bx, cx, dx, ds, es, di, si, bp
 push cs; pop ds           ; 設定本地資料段
 les di, [RH_Ptr]          ; ES:DI -> 請求標頭
 mov bl, es:[di.Command]   ; 取得命令碼
 xor bh, bh
 cmp bx, Max_Cmd           ; Max_Cmd=15 (DOS 3.x)
 jg Unk_Command
 shl bx, 1
 jmp word ptr [bx+Dispatch] ; 分派表跳轉
... (錯誤/完成出口) ...
Intr endp

分派表

Dispatch:
 dw Init           ; 0
 dw Media_Chk      ; 1
 dw Build_Bpb      ; 2
 dw Ioctl_Inp      ; 3
 dw Input          ; 4
 dw Nd_Input       ; 5
 dw Inp_Stat       ; 6
 dw Inp_Flush      ; 7
 dw Output         ; 8
 dw Outp_Vfy       ; 9
 dw Outp_Stat      ; 10
 dw Outp_Flush     ; 11
 dw Ioctl_Outp     ; 12
 dw Dev_Open       ; 13
 dw Dev_Close      ; 14
 dw Rem_Media      ; 15

統一出口處理

Unk_Command:
 mov al, 3              ; 未知命令錯誤碼
Error:
 mov ah, 81h            ; Error + Done bits
 jmp Exit
Done:
 mov ah, 1              ; Done bit only
Exit:
 lds bx, cs:[RH_Ptr]
 mov ds:[bx.Status], ax ; 寫入狀態字
 pop bp, di, si, es, ds, dx, cx, bx, ax
 ret

所有常式最終跳轉 `Error` (帶錯誤碼 AL) 或 `Done`,由 `Exit` 統一寫入狀態字、恢復暫存器、返回。極佳的結構化錯誤處理模式。

各命令存根與參數說明

每個常式註解詳細列出請求標頭偏移對應參數:

  • Media_Chk (1):區塊裝置媒體檢查,回傳媒體變更狀態 (-1=已變更, 0=不確定, 1=未變更) 於 Request Header+14。
  • Build_Bpb (2):建立 BIOS Parameter Block,回傳 BPB 指標陣列於 Request Header+18。
  • Ioctl_Inp/Outp (3/12):IOCTL 讀寫,僅屬性字 Bit 14=1 時被呼叫,無錯誤檢查。
  • Input/Output (4/8):一般讀寫,參數:Media, Address, Count, Sector。
  • Nd_Input (5):字元裝置非破壞性讀取,回傳下一字元於 Request Header+13。
  • Inp_Stat/Outp_Stat (6/10):輸入/輸出狀態,設定 Busy 位 (1=需等待硬體, 0=緩衝區有資料/可立即寫入)。
  • Inp_Flush/Outp_Flush (7/11):清空緩衝區。
  • Dev_Open/Dev_Close (13/14):DOS 3+ 開啟/關閉裝置,管理參考計數、發送初始化/結束字串。
  • Rem_Media (15):DOS 3+ 可移動媒體查詢,回傳 Busy=0 (可移除) 或 1 (固定)。

初始化常式

Init:
 push es, di
 mov ah, 9
 mov dx, offset Ident
 int 21h                 ; 列印簽名
 pop di, es
 mov word ptr es:[di.Address], offset Init
 mov word ptr es:[di.Address+2], cs
 jmp Done                ; 釋放 Init 佔用記憶體

初始化常式可呼叫 DOS 服務 01-0Ch, 30h。此處將首個可用記憶體設為 `Init` 自身位址,使初始化碼記憶體在驅動程式載入完成後被回收。

完整原始碼架構

code segment public 'CODE'
driver proc far
assume cs:code,ds:code,es:code
org 0
Max_Cmd equ 15
... (屬性字位定義註解) ...
Header ...
RH_Ptr dd ?
Ident db ...
Dispatch ...
Request struc ... ends
Strat ...
Intr ... (含分派、出口、16 個存根、Init)
Driver endp
code ends
end

教學價值與擴展指南

  • 完整驅動程式骨架:可直接作為序列埠 (COM)、平行埠 (LPT)、虛擬磁碟 (RAMDISK)、鍵盤/滑鼠過濾器、加密磁碟等驅動程式的起始碼。
  • 字元 vs 區塊裝置:屬性字 Bit 15 區分;字元裝置支援 Input/Output/Status/Flush/Open/Close/IOCTL;區塊裝置支援 MediaChk/BuildBPB/Input/Output/RemMedia。
  • 狀態字位操作:`Error (8000h) | Done (0100h) | Busy (0200h) | ErrorCode` 位運算組合,現代 NTSTATUS/HRESULT 同源設計。
  • 請求標頭副本機制:Strategy 複製→本地處理→Interrupt 複製回 — 避免共享緩衝區競態,支援佇列多重請求 (DOS 3+ 支援)。
  • 初始化記憶體回收:`Init` 結束時將可用記憶體指標設為自身位址,釋放初始化碼空間 — 現代驅動程式 `DriverEntry` 返回後編譯器/連結器自動丟棄 `INIT` 區段代碼,同樣原理。

DRIVER.ASM 雖為存根,但其架構嚴謹、註解詳盡、覆蓋 DOS 2.x/3.x 所有命令碼,是學習裝置驅動程式模型、中斷處理、參數驗證、錯誤傳播、記憶體管理的黃金範本。現代 Windows WDF/KMDF、Linux `file_operations`、UEFI Driver Binding 皆可見其架構基因。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved