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

Windows VxD 開發入門指南 (上):概念、結構與創建流程

     編輯:VC 教學

什麼是 VxD?

VxD (Virtual Device Driver) 是 32 位 Ring 0 可執行模組,管理硬體/軟體資源,實現多任務下的資源共享與虛擬化。Windows 95 內建大量標準 VxD (如 VPICD、V86MMGR、VTDAPI),若硬體/軟體需特殊支援,須自行開發。

VxD 類型

  • 靜態 VxD:開機由 VMM 自動載入 (註冊表 HKLM\System\CurrentControlSet\Services\VxD 或 SYSTEM.INI [386Enh] 段)。
  • 動態 VxD:應用程式運行時透過 CreateFile("\\\\.\\VXDNAME") + DeviceIoControl 載入/卸載,適合即插即用設備。

創建 VxD 完整流程

  1. 研讀硬體手冊:時序、寄存器映射、中斷號、DMA 通道。
  2. 編寫核心代碼:
    • 控制分派程序 (Control Proc) — 處理 VMM 系統控制消息。
    • VxD 服務 — 供其他 VxD 調用 (通過 INT 20h 服務號)。
    • API 入口 — 供 Ring 3 應用調用 (透過 VxDCall/DeviceIoControl)。
  3. 建立模組定義文件 (.def):指定模組名、導出 DDB (Device Descriptor Block) 符號。
  4. 組譯/編譯鏈接:ML (MASM) + Link,或 VToolsD (C/C++) + NMAKE 生成 .386 (實際為線性可執行 LE 格式)。
  5. 調試:使用 **SoftICE** + 調試版 Windows 95 (含 VMM 符號表),設置斷點於控制分派、中斷處理、服務入口。
  6. 製作安裝包:編寫 .inf 文件,複製 VxD 到 %windir%\system\iosubsys,修改註冊表載入項,必要時註冊設備類/類安裝程序。
  7. 發布:打包 INF、VxD、說明文件、卸載程式。

開發者必備知識儲備

  • **作業系統原理**:地址空間、執行上下文、鎖/信號量、進程間通訊、異步事件處理。
  • **Intel x86 架構**:寄存器集、保護模式、分頁機制、虛擬 8086 模式、特權級轉換 (Call Gate/Task Gate/Interrupt Gate)。
  • **VMM 服務介面**:熟練查閱 VMM.H/VXDWRAPS.H,知道哪個服務解決哪類問題。

VxD 框架骨架 (C 風格)

// 段聲明
VXD_LOCKED_CODE_SEG   // 不可分頁代碼段
VXD_LOCKED_DATA_SEG   // 不可分頁數據段
VXD_PAGEABLE_CODE_SEG // 可分頁代碼段
VXD_PAGEABLE_DATA_SEG // 可分頁數據段
VXD_ICODE_SEG         // 實模式初始化代碼
VXD_IDATA_SEG         // 實模式初始化數據
VXD_PCODE_SEG         // 保護模式初始化代碼
VXD_PDATA_SEG         // 保護模式初始化數據
VXD_STATIC_CODE_SEG   // 靜態代碼段 (動態卸載後保留)
VXD_STATIC_DATA_SEG   // 靜態數據段
VXD_DEBUG_ONLY_CODE_SEG
VXD_DEBUG_ONLY_DATA_SEG

// 設備描述塊 (DDB) - VMM 識別 VxD 的關鍵
DDB MyVxD_DDB = {
    sizeof(DDB),           // cbSize
    0,                     // lpszName (由 VMM 填充)
    0x00010000,            // Version (Major.Minor)
    MyVxD_Control,         // Control Proc 入口
    0,                     // VxD ID (VMM 分配)
    0,                     // Flags
    MyVxD_ServiceTable,    // 服務表指針
    0,                     // API 入口表 (可選)
    0                      // 保留
};

// 控制分派程序
BOOL __cdecl MyVxD_Control(SYSCTRLMSG msg, DWORD ref) {
    switch (msg) {
        case Sys_Critical_Init:  // 禁用中斷,極速初始化
            return InitCritical(ref);
        case Device_Init:        // 中斷已啟用,可操作硬體
            return InitDevice(ref);
        case Init_Complete:      // 系統啟動完成
            return InitComplete(ref);
        case Begin_PM_App:       // Win32 應用啟動
        case End_PM_App:         // Win32 應用結束
        case Sys_VM_Init:        // 新 VM 創建
        case Sys_VM_Terminate:   // VM 銷毀
            // 分配/釋放每 VM 上下文
            break;
        // ... 其他消息
    }
    return TRUE;
}

下一步預告

下篇將深入講解:實模式/保護模式初始化細節、服務表定義與調用約定 (Register-based vs C-based)、中斷/I/O/頁錯誤回調註冊、API 導出與 Ring 3 調用約定、動態載入/卸載機制、INF 安裝腳本編寫、SoftICE 實戰調試技巧。

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