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

裝置驅動程式列舉工具:DEV.ASM 原始碼深度解析

     編輯:組合語言

前言

DEV.ASM 是一個實用的 DOS 系統工具,用於掃描並顯示系統中所有已安裝字元/區塊裝置驅動程式的標頭資訊。它直接走訪 DOS 內部裝置鏈結串列,無需呼叫高階 API,展示了對 DOS 內部資料結構的深度理解。

程式架構與流程

dev proc far
 push ds; xor ax,ax; push ax  ; 保存 PSP:0 以便返回 DOS
 mov ax,data; mov ds,ax; mov es,ax
 mov ah,30h; int 21h          ; 取得 DOS 版本
 cmp al,2; jae dev1           ; 需 DOS 2.0+
 ...
 dev1: mov ah,15; mov dx,offset nulfcb; int 21h  ; 開啟 NUL 裝置
 ...
 ; 從 NUL FCB 保留區取得裝置鏈指標 (DOS 2.x/3.x 位移不同)
 dev5: call prdev              ; 列印裝置資訊
 les bx,dword ptr es:[bx]      ; 取得下一個裝置標頭
 cmp bx,-1; jne dev5           ; -1 為串列結束
 ...
dev endp

核心技術亮點

1. 取得裝置鏈首指標的巧妙方法

程式先開啟 NUL 裝置 (AH=0Fh),DOS 會在 FCB 保留區填入該裝置驅動程式標頭的雙字指標。位移因 DOS 版本不同而異:

  • DOS 2.x:NULFCB+25h (offset), +27h (segment)
  • DOS 3.x+:NULFCB+26h (offset), +28h (segment)

利用 NUL 裝置必然存在的特性,避免硬編碼系統變數位址,極具移植性。

2. 裝置標頭結構解析

; 裝置標頭結構 (每個驅動程式開頭)
DWORD  下一個裝置標頭指標 (ES:BX)
WORD   屬性字
WORD   策略進入點
WORD   中斷處理進入點
; 字元裝置:8 位元組名稱
; 區塊裝置:單元數 (BYTE) + 類型標記

prdev 程序依屬性字 Bit 15 (08000h) 區分字元/區塊裝置:

  • 字元裝置:列印 8 字元名稱,類型 'C'
  • 區塊裝置:列印單元數 (0-9, A-Z),類型 'B'

3. 十六進位轉 ASCII 顯示

hexasc (Word) → btoa (Byte) → ascii (Nibble) 三層呼叫,將位址、屬性、策略/中斷指標轉為 4 位元組十六進位字串顯示。ascii 使用經典 ADD AL,'0'; CMP AL,'9'; JLE ...; ADD AL,'A'-'9'-1 技巧處理 0-9/A-F。

4. 版本相容性處理

程式開頭檢查 DOS 版本 (AL≥2),並根據版本選擇 FCB 位移,展示良好的版本適應能力。

輸出範例解讀

Addr Attr Str Int Type Units Name
XXXX:XXXX XXXX XXXX XXXX X XX  NAME
...
End of device chain.
  • Addr:裝置標頭段址:偏移
  • Attr:屬性字 (Bit 15=字元裝置, Bit 14=IOCTL 支援, Bit 13=非 IBM 格式...)
  • Str/Int:策略/中斷處理常式位址
  • Type:'C' 字元 / 'B' 區塊
  • Units/Name:區塊裝置單元數 / 字元裝置名稱

歷史背景與價值

1984 年 Ray Duncan 編寫,發表於《PC Magazine》或同類技術刊物。當時 DOS 缺乏內建列舉驅動程式工具,DEV 填補此缺口,幫助開發者除錯驅動程式、分析系統配置、理解裝置命名空間。其核心演算法 (走訪鏈結串列、解析標頭結構) 在現代驅動程式開發框架 (WDM/KMDF/UMDF) 中仍以不同形式存在。

結語

DEV.ASM 以約 150 行程式碼實現完整的裝置驅動程式列舉器。它展示了:DOS 內部資料結構逆向工程、版本相容性處理、底層輸出格式化、系統程式設計的簡潔哲學。對於學習作業系統內核資料結構、驅動程式架構、組合語言系統工具開發的開發者,這是極佳的教學案例。

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