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

Windows 9x 虛擬設備驅動程式 (VxD) 設計全解析:架構、VToolsD 與實戰案例

     編輯:VC 教學

歷史定位與現狀

VxD (Virtual Device Driver) 是 Windows 95/98/Me 核心層 (Ring 0) 驅動模型。Windows 2000/XP 以降全面轉向 WDM/KMDF/UMDF,**VxD 已淘汰**,本文僅供維護舊系統、研究作業系統原理、或嵌入式 Windows 9x 專案參考。

Windows 9x 虛擬機架構

  • System VM:單一 32 位保護模式環境,載入所有 Win32 應用/DLL,各進程擁有獨立 4GB 線性地址空間 (共享系統區)。
  • DOS VM:每個 DOS 應用獨享一個虛擬 8086 環境 (1MB 實模式地址空間),VxD 負責虛擬化硬體資源(如 INT 21h、I/O 埠)。
  • VMM (Virtual Machine Manager):Ring 0 核心,調度 VM、管理頁表、提供系統服務(記憶體、中斷、I/O 攔截、同步物件)。

VxD 核心特性

  • 運行在 **Ring 0**,擁有最高權限:直接訪問硬體 I/O、物理記憶體、IDT/GDT、CR0/CR3 等控制寄存器。
  • 以 **靜態載入** (註冊表/ SYSTEM.INI) 或 **動態載入** (CreateFile/DeviceIoControl) 方式存在。
  • 通過 **DDB (Device Descriptor Block)** 向 VMM 註冊:控制入口、服務表、API 入口。
  • 代碼/數據分段:實模式初始化、保護模式初始化、可分頁、不可分頁、靜態、僅調試 — 共 12 段。

VMM 提供的核心服務分類

服務類別代表功能
事件服務Sys_VM_Init, Device_Init, Init_Complete, Sys_VM_Terminate...
記憶體管理_PageAllocate, _PageFree, _MapIntoV86, _PhysToVirt...
I/O 攔截Hook_V86_Int_Chain, Hook_PM_Fault, Simulate_IO...
同步物件Create_Semaphore, Wait_Semaphore, Signal_Semaphore, Critical_Section...
調試服務Debug_Printf, Break_Point, Trace_Out...
配置管理OpenRegistryKey, Get_Registry_Value, Set_Registry_Value...

開發工具鏈:VToolsD

  • QuickVxD:向導生成 .h/.cpp/.mak 框架,含控制分派、服務表、API 存根。
  • C Runtime + C++ Class Library:封裝 VMM 服務為 C++ 類,支援 new/delete、STL 子集、異常處理 (需小心)。
  • VxDLoad / VxDView:動態載入/卸載、查看已載入 VxD 狀態。
  • 調試器:**SoftICE for Windows 95/98** (唯一可靠的 Ring 0 符號級調試器)。

實戰案例:可視電話音頻卡 VxD 設計要點

  1. 硬體資源虛擬化:攔截 I/O 埠 (編碼器控制)、IRQ (數據就緒中斷)、DMA/總線主控緩衝區。
  2. 多 VM 狀態隔離:每個 VM 維護獨立設備上下文 (Context) — 采樣率、增益、緩衝區指針,VMM 自動切換。
  3. 即時數據流:中斷處理程序 (不可分頁段) 將硬體 FIFO 數據拷入環形緩衝區,喚醒等待的應用執行緒 (事件/信號量)。
  4. 應用介面 (API):導出 OpenDevice/CloseDevice/StartCapture/StopCapture/SetFormat/GetBuffer 供 Ring 3 應用呼叫 (通過 DeviceIoControl 或 VxDCall)。
  5. 電源管理:響應 Sys_Power_Event 保存/恢復硬體狀態。

關鍵開發難點與對策

結語

VxD 開發是「在鋼絲上跳舞」:擁有無限權力,也承擔無限風險。理解其架構有助於掌握現代 Windows 驅動模型 (WDF) 的設計哲學 — **權力最小化、隔離最大化、聲明式配置、框架托管生命週期**。若無特殊歷史包袱,**請直接投入 WDF/KMDF 開發**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
難點對策
Ring 0 崩潰 = 系統藍屏極度謹慎指針解引用;大量使用 VMM 服務驗證指針有效性;SoftICE 單步調試
分頁錯誤在中斷/鎖區段所有中斷處理、鎖區段代碼/數據必須鎖定在物理記憶體 (不可分頁段)
多處理器 (舊) / 重入使用 VMM 同步物件 (Mutex/Semaphore) 保護共享數據
與其他 VxD 衝突遵循 VMM 載入順序、服務號分配規範;使用 DAA (Device Access Architecture) 統一介面