VxD (Virtual Device Driver) 是 32 位 Ring 0 可執行模組,管理硬體/軟體資源,實現多任務下的資源共享與虛擬化。Windows 95 內建大量標準 VxD (如 VPICD、V86MMGR、VTDAPI),若硬體/軟體需特殊支援,須自行開發。
HKLM\System\CurrentControlSet\Services\VxD 或 SYSTEM.INI [386Enh] 段)。CreateFile("\\\\.\\VXDNAME") + DeviceIoControl 載入/卸載,適合即插即用設備。DDB (Device Descriptor Block) 符號。.386 (實際為線性可執行 LE 格式)。.inf 文件,複製 VxD 到 %windir%\system\iosubsys,修改註冊表載入項,必要時註冊設備類/類安裝程序。VMM.H/VXDWRAPS.H,知道哪個服務解決哪類問題。// 段聲明
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 實戰調試技巧。