VxD (Virtual Device Driver),即虛擬裝置驅動程式,運行於處理器 Ring 0 特權層級,可執行任何處理器指令、存取機器中任何資料暫存器。VxD 作為 Windows 9x 系統與實體裝置間的介面,擴展了 Windows 核心服務,能存取與控制實際硬體環境。
隨著 Windows 2000 和新一代裝置驅動模型 (WDM) 推出,預期 VxD 將逐漸過時,但現實是 Windows 98 系統仍佔據 90% 以上市場份額。如何掌握省時高效開發 VxD 的方法,成為程式設計師迫切需求。
device=VxD檔名,每次修改都得重新開機,漫長等待讓人無法忍受作者在開發「護花使者」反黃軟體時,採用 VtoolsD 3.0 撰寫檔案保護 VxD 模組。VtoolsD 3.0 是 Compuware 公司開發的軟體套件,包含實用工具:
點擊「開始/Numega VtoolsD/QuickVxD」,開啟 QuickVxD,選取 Device Parameters 設定 Device Name = MY;選取 Output Files,按下 Generate Now 產生 VxD 框架原始程式,包含 3 個檔案:.h 標頭檔、.c/.cpp 程式碼檔、.mak 專案檔。將這 3 個檔案複製到 E:\my\ 目錄。
在 VC 6.0 中新建工作空間檔案:選擇 File/New,選擇 Project 標籤,點擊 Makefile,Project Name 輸入 my,Location 輸入 E:\my(專案名稱與目錄名保持一致)。按 OK,在 Output 中將原本的 my.exe 改為 my.vxd,按 Finish。VC 6.0 自動產生 my.dsp 專案檔和 my.dsw 工作空間檔。之後可用 VC 6.0 編譯器產生 VxD:點擊 Build/Build my.vxd。
在 Workspace 視窗選擇 FileView 頁面,右鍵點擊 Source Files,選擇 Add Files to Folder,加入 MY.cpp;同理加入 MY.h。此時可透過 Workspace 視窗觀察 VxD 類別,點擊 Class View 頁面可見 my.vxd 的 3 個類別:MyDevice、MyThread、MyVm。編輯 VxD 程式碼時,不再需要命令列的 EDIT.COM。
為更方便工作,需設定瀏覽資訊以使用 F12 查看類別定義與參考:
nmake /f "my.mak" BROWSE=1MYMY.bsc此時右鍵點擊原始碼視窗,捷徑選單會出現「Goto Definition of」和「Goto Reference of」兩個選項。
偵錯 VxD 原始碼時常用 dprintf() 或 dout<< 輸出偵錯資訊。Debug Monitor 可動態裝卸並顯示 VxD 偵錯資訊。點擊 VC 6.0 選單 Tools/Customize...,選擇 Tools 項,輸入新選單名稱「VxD Monitor」,設定 Command: C:\Program Files\NuMega\VtoolsD\Bin\monitor.exe,即可加入工具選單。偵錯時點擊此選單執行 Debug Monitor,選擇 File/Open Driver... 載入要偵錯的 VxD;選擇 File/Start Drive 執行 VxD,Debug Monitor 視窗即可顯示偵錯資訊。此功能相當於 VC 6.0 的 TRACE()。偵錯完畢退出 Debug Monitor 時,務必先點擊 File/Stop Driver 停止 VxD,否則再次進入必定導致系統當機。
軟體升級時,檔案版本資訊至關重要。VC 6.0 無法設定 VxD 版本資訊,只能透過 VxdVer 手動設定。作者嘗試透過 VC 6.0 加入版本資訊(修改標頭檔、設定 Resource Files)均失效。經查詢資料與摸索,找到設定方法:
若要產生的 VxD 是 MY.vxd,用 EDIT 新建同名 MY.vrc,以「護花使者」檔案防刪模組 antidel.vxd 為例,MY.vrc 內容如下:
CompanyName = "https://www.bianceng.cn"
FileDescription = "antidel file"
FileVersion = "Version 1.01"
InternalName = "ANTIDEL"
LegalCopyright = "mafeitao@371.net"
OriginalFilename = "antidel.vxd"
ProductName = "antidel"
ProductVersion = "Version 1.01"
Translation = 0x409, 0x4E4
存檔離開,命令列執行:VxdVer.exe my.vcr my.res,再用 VC 6.0 重新編譯 MY.vxd,版本資訊即設定成功。
以前覺得編寫 VxD 很難,掌握方法其實不難。希望本文能為大家帶來幫助。有興趣的朋友可造訪作者網頁:https://iflower.363.net/,歡迎來信探討:mafeitao@sina.com