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

Windows 9x VxD 驅動程式開發:LE 格式與段結構完整指南

     編輯:組合語言

前言

虛擬裝置驅動程式(VxD)是 Windows 9x 核心架構的關鍵組件。本文完整解析 VxD 的線性可執行檔(LE)格式、段類型分類、模組定義檔(.DEF)撰寫、原始碼結構與建置流程,為開發 Windows 95/98 核心模組奠定堅實基礎。

LE 檔案格式與段類型

VxD 採用 Linear Executable (LE) 格式,源自 OS/2 2.0,同時包含 16 位與 32 位程式碼,滿足實模式初始化與保護模式執行的雙重需求。段依運行屬性分類:

段類型用途特性
LCODE頁面鎖定程式碼/資料永駐記憶體,硬體中斷處理常式必須放此段
PCODE可分頁程式碼VMM 可依需求換出至磁碟,大多數一般程式碼宜置於此
PDATA可分頁資料同 PCODE,非即時資料首選
ICODE初始化專用程式碼初始化完成後由 VMM 釋放記憶體
DBOCODE除錯專用程式碼/資料僅除錯版載入,含診斷訊息處理
SCODE靜態程式碼/資料即使 VxD 卸載仍保留,供動態載入/卸載的 VxD 保存狀態
RCODE實模式初始化含 16 位實模式程式碼/資料
16ICODE16 位保護模式初始化複製至 V86 模式用,避免編譯器產生 32 位指令
MCODE鎖定訊息字串支援多國語言版本建構

標準模組定義檔 (.DEF) 範本

VXD MYVXD
SEGMENTS
_LPTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_LTEXT  CLASS 'LCODE' PRELOAD NONDISCARDABLE
_LDATA  CLASS 'LCODE' PRELOAD NONDISCARDABLE
_TEXT   CLASS 'LCODE' PRELOAD NONDISCARDABLE
_DATA   CLASS 'LCODE' PRELOAD NONDISCARDABLE
CONST   CLASS 'LCODE' PRELOAD NONDISCARDABLE
_TLS    CLASS 'LCODE' PRELOAD NONDISCARDABLE
_BSS    CLASS 'LCODE' PRELOAD NONDISCARDABLE
_LMGTABLE CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL
_LMSGDATA CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL
_IMSGTABLE CLASS 'MCODE' PRELOAD DISCARDABLE IOPL
_IMSGDATA  CLASS 'MCODE' PRELOAD DISCARDABLE IOPL
_ITEXT   CLASS 'ICODE' DISCARDABLE
_IDATA   CLASS 'ICODE' DISCARDABLE
_PTEXT   CLASS 'PCODE' NONDISCARDABLE
_PMSGTABLE CLASS 'MCODE' NONDISCARDABLE IOPL
_PMSGDATA  CLASS 'MCODE' NONDISCARDABLE IOPL
_PDATA   CLASS 'PDATA' NONDISCARDABLE SHARED
_STEXT   CLASS 'SCODE' RESIDENT
_SDATA   CLASS 'SCODE' RESIDENT
_DBOSTART CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
_DBOCODE  CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
_DBODATA  CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
_16ICODE CLASS '16ICODE' PRELOAD DISCARDABLE
_RCODE   CLASS 'RCODE'
EXPORTS
MYVXD_DDB @1

關鍵規則

  • VxD 名稱必須全大寫,否則僅載入不執行任何功能。
  • 同一 CLASS 的多個段會合併為單一邏輯段(如 _LTEXT、_LDATA 同屬 LCODE)。
  • EXPORTS 僅匯出一個符號:裝置描述區塊 DDB(命名慣例:VxD名稱_DDB)。
  • 組合語言專案可刪除未使用的段定義以消除連結器警告。

VxD 原始碼結構與核心巨集

.386p
include vmm.inc

DECLARE_VIRTUAL_DEVICE MYVXD, 1, 0, MYVXD_Control, \
    UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER

Begin_Control_Dispatch MYVXD
    Control_Dispatch Device_Init, OnDeviceInit
    Control_Dispatch Sys_Critical_Init, OnCriticalInit
End_Control_Dispatch MYVXD

end

巨集詳細說明

  • DECLARE_VIRTUAL_DEVICE Name, MajorVer, MinorVer, CtrlProc, DeviceID, InitOrder, V86Proc, PMProc, RefData
    • Name:≤8 字元大寫,唯一識別碼,DDB 自動命名為 Name_DDB。
    • CtrlProc:裝置控制函數入口,慣例 Name_Control。
    • DeviceID:導出服務或實模式通知需向 Microsoft 申請唯一 ID,否則用 UNDEFINED_DEVICE_ID。
    • InitOrder:載入順序,值越小越早載入;依賴其他 VxD 服務者須設較大值。可用 UNDEFINED_INIT_ORDER。
  • Begin_Control_Dispatch / End_Control_Dispatch:定義控制函數,自動置於 VxD_LOCKED_CODE_SEG。
  • Control_Dispatch Message, Handler:掛載控制訊息處理常式(如 Device_Init、Sys_Critical_Init)。

段定義巨集對照表 (vmm.inc)

段名稱巨集開頭巨集結尾
_LTEXTVxD_LOCKED_CODE_SEGVxD_LOCKED_CODE_ENDS
_PTEXTVxD_PAGEABLE_CODE_SEGVxD_PAGEABLE_CODE_ENDS
_DBOCODEVxD_DEBUG_ONLY_CODE_SEGVxD_DEBUG_ONLY_CODE_ENDS
_ITEXTVxD_INIT_CODE_SEGVxD_INIT_CODE_ENDS
_LDATAVxD_LOCKED_DATA_SEGVxD_LOCKED_DATA_ENDS
_IDATAVxD_IDATA_SEGVxD_IDATA_ENDS
_PDATAVxD_PAGEABLE_DATA_SEGVxD_PAGEABLE_DATA_ENDS
_STEXTVxD_STATIC_CODE_SEGVxD_STATIC_CODE_ENDS
_SDATAVxD_STATIC_DATA_SEGVxD_STATIC_DATA_ENDS
_DBODATAVxD_DEBUG_ONLY_DATA_SEGVxD_DEBUG_ONLY_DATA_ENDS
_16ICODEVxD_16BIT_INIT_SEGVxD_16BIT_INIT_ENDS
_RCODEVxD_REAL_INIT_SEGVxD_REAL_INIT_ENDS

建置流程

; 組譯
ml -coff -c -Cx -DMASM6 -DBLD_COFF -DIS_32 myvxd.asm

; 連結
link -vxd -def:myvxd.def myvxd.obj

; Makefile 範例
NAME=myvxd
$(NAME).vxd: $(NAME).obj
    link -vxd -def:$(NAME).def $(NAME).obj
$(NAME).obj: $(NAME).asm
    ml -coff -c -Cx -DMASM6 -DBLD_COFF -DIS_32 $(NAME).asm
  • -coff:COFF 目標檔格式
  • -c:僅組譯不連結
  • -Cx:保留大小寫
  • -D:定義條件組譯巨集(相當於 C 的 #define)
  • -vxd:產生 VxD 檔案
  • -def:指定模組定義檔

開發環境取得

  • Windows 98 DDK:免費下載自 Microsoft(含 MASM 6.11d,建議升級至最新版)
  • Windows 95 DDK:僅限 MSDN 訂閱者
  • 必要庫檔:vmm.inc、vwin32.inc、shell.inc 等

總結

VxD 開發的核心在於理解 LE 格式的段屬性、正確撰寫 .DEF 檔、善用 vmm.inc 巨集建構標準架構、並在適當的控制訊息(Sys_Critical_Init、Device_Init、Init_Complete)中完成初始化。掌握這些基礎,即可進一步開發硬體驅動、檔案系統過濾器、系統監控等核心模組。

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