| 特性 | 靜態 VxD | 動態 VxD |
|---|---|---|
| 載入時機 | 系統開機 (由 VMM 載入) | 執行期隨需載入 (CreateFile, VxDCall) |
| 載入觸發 | 1. INT 2Fh/1605h 呼叫 2. 登錄鍵值 StaticVxD 3. SYSTEM.INI [386Enh] device= | 1. 放入 \SYSTEM\IOSUBSYS (IO 子系統) 2. VxDCall VxD 動態載入服務 3. Ring 3 CreateFile("\\.\vxdname.vxd") |
| 初始化訊息 | Sys_Critical_Init → Device_Init → Init_Complete | Sys_Dynamic_Device_Init (僅此一項) |
| 卸載訊息 | System_Exit2 → Sys_Critical_Exit2 | Sys_Dynamic_Device_Exit |
| 轉換方法 | — | 在 .def 加入 VxD NAME DYNAMIC |
初始化失敗必須設定 Carry Flag 並返回錯誤碼,VMM 將中止該 VxD 載入。
卸載順序與初始化順序相反(後載入先卸載),確保依賴關係安全:
舊版 System_Exit/Sys_Critical_Exit 不保證反初始化順序,可能導致依賴服務已卸載而崩潰。新版 VxD 必須使用帶「2」的版本。
| 類別 | 訊息 | 說明 |
|---|---|---|
| 虛擬機管理 | Create_VM | 新 VM 建立 (EBX = 新 VM handle) |
| VM_Critical_Init | VM 關鍵初始化 | |
| VM_Suspend / VM_Resume | VM 暫停/繼續 (切換焦點時) | |
| Close_VM_Notify | VM 即將關閉通知 | |
| Destroy_VM | VM 銷毀完成 | |
| VM_Terminate / VM_Terminate2 | VM 終止 (Terminate2 為新版) | |
| ... | 其他:電源管理、除錯、檔案系統等 |
VxD 應選擇性處理感興趣的訊息,忽略其他。
; 代碼段
VXD_LOCKED_CODE_SEG ; 鎖定代碼段 (常駐)
VXD_PAGEABLE_CODE_SEG ; 可分頁代碼段 (可換出)
VXD_STATIC_CODE_SEG ; 靜態代碼段 (初始化後丟棄)
; 資料段
VXD_LOCKED_DATA_SEG
VXD_PAGEABLE_DATA_SEG
VXD_STATIC_DATA_SEG
原則:中斷處理、高優先級回呼、分頁錯誤處理 → 鎖定段;一般功能 → 可分頁段。
BeginProc MyFunction
; 函數主體
EndProc MyFunction
BeginProc MyFunc, HIGH_PRIORITY 等屬性| 類型 | 呼叫方式 | 參數傳遞 | 返回值 | 命名慣例 |
|---|---|---|---|---|
| 暫存器呼叫 | VMMCall / VxDCall | 暫存器 (EAX, EBX, ECX, EDX, ESI, EDI, EBP...) | 暫存器 (通常 EAX, 旗標 CF) | 無前綴 (如 Get_Sys_VM_Handle) |
| 堆疊呼叫 | VMMCall _Service | 堆疊 (右至左 push) | EAX | 底線前綴 (如 _HeapAllocate) |
巨集語法:
VMMCall ServiceName ; 暫存器呼叫
VMMCall _StackService, ; 堆疊呼叫,參數用角括號包圍
早期 MASM 版本 offset 在 VxD 產生錯誤位址,故引入 OFFSET32 巨集(等同 offset flat:)。現代 MASM 6.14+ 已修正,但為相容性建議仍使用 OFFSET32。
.data
VxDName db "\\.\MyDynamic.vxd", 0
.code
invoke CreateFile, addr VxDName, 0, 0, 0, 0, FILE_FLAG_DELETE_ON_CLOSE, 0
mov hDevice, eax
; ... 使用 DeviceIoControl 通訊 ...
invoke CloseHandle, hDevice ; FILE_FLAG_DELETE_ON_CLOSE 觸發卸載
\\.\VxD完整路徑名FILE_FLAG_DELETE_ON_CLOSE:關閉控制代碼時自動卸載 VxDW32_DeviceIoControl:首次 CreateFile 觸發,返回 EAX=0 表示成功;後續 DeviceIoControl 也發送此訊息。Sys_Dynamic_Device_InitSys_Dynamic_Device_Exit動態 VxD 載入後,享有與靜態 VxD 相同的權限(除初始化/卸載訊息不同)。
CLASS 'LCODE' ... SHARED 或連結器 /SECTION:.bss,S。CB_Signature == "VMcb" 確認有效性。VxD 是 Windows 9x 核心擴充機制,直接運行於 Ring 0,擁有最高權限。掌握其初始化/卸載序列、控制訊息分派、段屬性管理、暫存器呼叫慣例、動態載入機制,是進行 9x 核心層開發、逆向工程、安全研究的基石。雖然 NT 內核採用 WDM/KMDF 架構,但 VxD 的許多設計哲學(分層、服務導向、動態載入)在現代驅動模型中仍有回響。