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

深入解析 Windows 95 虛擬設備驅動程序(VxD)開發技術

     編輯:關於VC++

前言:為何要掌握 VxD 技術

早期 Windows 95 時代,著名的 CIH 病毒正是利用 VxD(Virtual Device Driver)技術在核心層級破壞系統。若能徹底掌握 VxD 程式設計,不僅能洞悉病毒運作原理,更能從根源上實現病毒的查殺與防護。本文將系統性介紹 VxD 的架構、開發流程與關鍵技術細節,幫助開發者建立扎實的核心層驅動開發能力。

什麼是 VxD?

VxD 是運行於 Windows 95 核心模式(Ring 0)的 32 位可執行模組,負責管理硬體設備、軟體資源與系統中斷。它讓多個應用程式能安全地共享硬體資源,實現真正的多任務處理。VxD 處理硬體中斷、執行 I/O 操作,並為每個虛擬機(VM)維護獨立的設備狀態,確保應用程式切換時硬體狀態的一致性。

大多數 VxD 管理實體硬體(如磁碟控制器、網卡),也有部分模擬 MS-DOS 驅動程式或 TSR 程式,甚至透過 32 位代碼替代 16 位實模式代碼以提升效能。Intel 處理器在保護模式下執行 32 位 VxD 的效率遠高於虛擬 8086 模式下的 16 位代碼。

標準 VxD 與自訂開發

Windows 95 內建多種標準 VxD(如 V86MMGR、VPICD),支援常見硬體與軟體介面。當標準 VxD 無法滿足特殊硬體需求、或需提供新功能時,開發者需編寫自訂 VxD。Windows 95 DDK 提供大量原始碼範例,是學習與開發的最佳參考。

建立 VxD 的完整步驟

  1. 研讀硬體手冊:掌握目標硬體的寄存器、中斷、I/O 端口與時序細節。
  2. 撰寫核心流程:包含控制程序、VxD 服務與 API 函數。
  3. 建立模組定義檔(.DEF):指定模組名稱並匯出裝置描述區塊(DDB)。
  4. 組譯與連結:生成 .VxD 檔案。
  5. 除錯測試:使用 Debug 版 Windows 95 搭配 SoftICE 等核心除錯器。
  6. 建立安裝檔(INF):處理登錄寫入、檔案複製至 SYSTEM 目錄等部署動作。
  7. 打包發佈:整合文件與安裝程式。

開發前置知識需求

撰寫 VxD 假設開發者具備:

  • 熟練的 x86 組合語言能力
  • 深入理解保護模式、虛擬 8086 模式、平坦記憶體模型
  • 中斷/異常處理、特權級保護、分頁記憶體管理
  • I/O 權限控制與錯誤處理機制
  • 目標硬體與標準 ROM BIOS 的詳細規格

VxD 程式碼架構詳解

五大記憶體區段

區段名稱宏定義用途屬性
VxD_CODEVxD_CODE_SEG / VxD_CODE_ENDS核心控制程序、回呼、服務、API32 位保護模式程式碼(必須)
VxD_DATAVxD_DATA_SEG / VxD_DATA_ENDS裝置描述表、服務表、全域資料32 位保護模式資料(必須)
VxD_ICODEVxD_ICODE_SEG / VxD_ICODE_ENDS僅初始化時使用的程式碼Init_Complete 後被丟棄(可選)
VxD_IDATAVxD_IDATA_SEG / VxD_IDATA_ENDS初始化階段專用資料Init_Complete 後被丟棄(可選)
VxD_REAL_INITVxD_REAL_INIT_SEG / VxD_REAL_INIT_ENDS實模式初始化程式碼與資料VxD 載入最早執行,隨後丟棄(可選)

所有保護模式區段均採用 32 位平坦模型,偏移量由連結器修正。程式碼中需使用 OFFSET32 宏取代傳統 OFFSET。VxD 不得修改 CS/DS/ES/SS,僅可使用 FS/GS。

必要的組譯指令與標頭檔

  • 原始檔開頭必須宣告 .386p 以啟用保護模式指令集。
  • 雖運行於 Ring 0,嚴禁直接修改 GDT/IDT、任務狀態段或控制暫存器(CR0 除 VMCPD 外不得動用)。
  • 核心標頭檔:VMM.INC(VMM 服務與巨集)、DEBUG.INC(除巨集)、VPICD.INC(中斷控制器服務)、SHELL.INC(視窗殼層服務,如 MessageBox)。

VxD 宣告宏:Declare_Virtual_Device

Declare_Virtual_Device MYVXD, 1, 0, MYVXD_Control, \
    MYVXD_Device_ID, MYVXD_Init_Order, \
    MYVXD_V86_API_Handler, \
    MYVXD_PM_API_Handler

此宏完成:命名、版本、初始化順序、控制程序入口、裝置 ID、API 處理器的宣告,並自動建立裝置描述區塊(DDB)於資料區段,產生連結器需匯出的標號(如 MYVXD_DDB)。

裝置 ID 與初始化順序

  • 裝置 ID:標準 VxD 使用預定義 ID;自訂 VxD 需向 Microsoft 申請唯一 ID(0~0x1FF 保留)。無服務/API 者可用 Undefined_Device_ID。
  • 初始化順序:數值越小越早初始化。若需在特定標準 VxD 前/後初始化,可在其預定義順序符號上增減微小值。無順序需求者用 Undefined_Init_Order。

控制程序與系統控制訊息

控制程序透過 Begin_Control_Dispatch、Control_Dispatch、End_Control_Dispatch 宏建立訊息分派表。核心系統控制訊息包括:

  • Sys_Critical_Init:最早收到,中斷關閉,快速完成硬體中斷掛鉤、記憶體申請、讀取 SYSTEM.INI。
  • Device_Init:啟用中斷,分配控制塊、安裝 I/O 攔截與頁錯誤回呼。
  • Init_Complete:最後初始化訊息,此後 VMM 丟棄初始化區段(ICODE/IDATA)。
  • Create_VM / Destroy_VM:虛擬機建立/銷毀時的資料初始化與清理。
  • VM_Init / VM_Suspend / VM_Resume:虛擬機啟動、掛起、恢復時的硬體狀態切換。
  • Set_Device_Focus:執行焦點切換時還原硬體狀態。
  • Sys_Critical_Exit:系統關機前,重設硬體確保安全返回實模式。

完整訊息表尚包含 Begin/End_Message_Mode、Debug_Query、Query_Destroy、Reboot_Processor、Sys_VM_Init/Terminate、System_Exit、VM_Critical_Init、VM_Not_Execute 等,開發者需按需處理。

實戰建議

開發過程中,建議在除錯器控制下載入 VxD,於關鍵中斷處設中斷點,驗證中斷處理邏輯與狀態保存/恢復是否正確。善用 DDK 範例程式碼作為架構參考,可大幅降低試錯成本。

結語

VxD 開發是 Windows 95 核心層程式設計的巔峰技術。雖現代 Windows 已轉向 WDM/KMDF 架構,但 VxD 的設計哲學——核心模式資源管理、虛擬化隔離、中斷與 I/O 的統一抽象——仍對理解作業系統底層運作具有不可替代的教學價值。掌握 VxD,不僅能破解 CIH 等早期病毒迷思,更能奠定系統級開發的堅實基礎。

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