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

Windows VxD 開發進階指南 (下):初始化序列、服務機制與調試實戰

     編輯:VC 教學

VxD 初始化六階段

  1. 載入實模式初始化段,呼叫 RealMode_Init。可檢測硬體、讀取 CMOS/BIOS、決定是否繼續載入、預留物理頁面。完成後段被丟棄。
  2. 載入其餘段至 32 位平坦模式記憶體,丟棄實模式段。
  3. Sys_Critical_Init:硬體中斷**關閉**,極短時間內完成關鍵初始化 (分配全局記憶體、掛鉤關鍵中斷/異常)。
  4. Device_Init:硬體中斷**開啟**,必須已準備好中斷處理程序、I/O 攔截、DMA 緩衝區。
  5. Init_Complete:系統完全啟動,可執行耗時操作 (枚舉設備、啟動背景執行緒)。
  6. 丟棄初始化段:Init 代碼/數據段釋放,不可再訪問。

任何階段返回 Carry Flag = 1 即可中止載入。

實模式初始化細節

  • 運行在 **VM=0, Ring 0, 實模式**,可訪問 BIOS/ROM、DOS 環境、INT 13h/10h/15h 等。
  • 通過 Simulate_Int/Simulate_IO 模擬中斷/I/O。
  • 可呼叫 Allocate_Phys_Memory 為設備預留物理頁 (如 DMA 緩衝區)。
  • 返回結構 RM_INIT_STRUCT 告知 VMM:實例數、物理頁陣列、配置數據指針。

VxD 服務機制:INT 20h 動態鏈接

VxD 不像 DLL 導出符號,而是通過 **服務號** 註冊:

// 定義服務 (汇编巨集)
BeginProc MyService, Service
    mov eax, [esp+4]   ; 參數1
    ; ... 處理
    clc                ; 成功
    ret
EndProc MyService

// 服務表
VxD_Service_Table MyVxD_Services = {
    { SERVICE_ID_MYVXD, MyService }, // 服務號由 VMM 分配
    { 0, 0 }
};

// 其他 VxD 調用
mov eax, SERVICE_ID_MYVXD
mov ebx, 參數
int 20h
; 返回: CF=0 EAX=結果 / CF=1 EAX=錯誤碼

兩種調用約定

約定服務名參數傳遞返回值保存寄存器
Register-based無前綴通用寄存器 (EAX,EBX,ECX,EDX,ESI,EDI)EAX (或 EDX:EAX)除返回值外全保存
C-based以下劃線 _ 開頭堆疊 (32bit 各參數)EAX (或 EDX:EAX)EBX, ESI, EDI, EBP, DS, ES, FS, GS

異步服務 (Async_Service):可在中斷上下文調用,**必須可重入**,**不可呼叫非異步服務/阻塞 VMM 服務**。

中斷、I/O、頁錯誤回調註冊

  • Hook_V86_Int_Chain / Hook_PM_Fault:攔截 V86/保護模式中斷/異常。
  • Simulate_IO / Hook_IO:攔截 IN/OUT 指令 (端口虛擬化)。
  • PageHook:監控特定線性地址頁的讀/寫/執行 (實現斷點、影子記憶體、Copy-on-Write)。
  • 所有回調**必須在不可分頁段**,且**不可呼叫可分頁服務/觸發分頁錯誤**。

API 導出與 Ring 3 調用

在 DDB 中填入 API_Entry_Table 指針,表項格式:

API_ENTRY MyAPIs[] = {
    { "OpenDevice",  OpenDevice_Proc },
    { "CloseDevice", CloseDevice_Proc },
    { 0, 0 }
};

Ring 3 應用透過 VxDCall(0, ServiceID, ...) (需 vwin32.vxd 支援) 或 DeviceIoControl (配合 CreateFile("\\\\.\\VXDNAME")) 調用。

SoftICE 實戰調試技巧

  1. 符號載入:SYMFILE LOAD MYVXD.NMS (由 VToolsD 生成)。
  2. 斷點類型:
    • BPX MyVxD_Control — 所有控制消息入口。
    • BPIO PORT — I/O 埠訪問斷點 (硬體斷點)。
    • BPM ADDRESS — 記憶體讀寫斷點 (頁級)。
    • BPEX INT_NUM — 中斷入口斷點。
  3. 上下文切換:VM 指令查看/切換當前 VM;THREAD 查看執行緒。
  4. 常用命令:DR (寄存器)、D (記憶體)、U (反組譯)、G (運行)、P (單步過 Call)、T (單步進 Call)。

動態載入/卸載與 INF 安裝

  • 動態載入:CreateFile("\\\\.\\MYVXD", 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL) → VMM 載入 VxD,返回偽句柄;CloseHandle → 卸載。
  • INF 關鍵段:
    [Version]
    Signature="$CHICAGO$"
    Class=System
    [DefaultInstall]
    CopyFiles=VxD_Files
    AddReg=VxD_Reg
    [VxD_Files]
    MYVXD.386
    [VxD_Reg]
    HKR,,DevLoader,,*vxd
    HKR,,NTMPDriver,,MYVXD.386
    HKLM,System\CurrentControlSet\Services\VxD\MYVXD,StaticVxD,,MYVXD.386
    

總結

VxD 開發是對 x86 體系結構、Windows 內核調度、即時系統編程的綜合考驗。掌握初始化序列、服務機制、回調約束、調試技巧,即能駕馭 Ring 0 的無限權力。再次強調:**現代開發請轉向 WDF/KMDF/UMDF**,VxD 僅作歷史參考。

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