VxD (Virtual Device Driver), 即虛擬設備驅動程序, 是運行在處理器Ring0特權級別的驅動程序,可以執行任何處理器指令,訪問機器中的任何數據寄存器。VxD被用作Windows 9x系統和物理設備之間的接口,擴展了WINDOWS 系統的核心服務,能夠訪問和控制實際的硬件環境。
隨著WIN 2000和新一代的設備驅動程序WDM(Windows Driver Model)推出,預計VxD將慢慢過時,而現實情況卻是:隨便打開一種網絡計數器的統計窗口就會發現,Windows 98 系統仍然占據了90%以上的市場份額。怎麼才能掌握一種省時高效開發VXD的方法,就成為程序員們迫切需要解決的問題。
回顧傳統的方法,用微軟的DDK來編寫VXD,是一項非常煩瑣漫長的過程:
1 編輯代碼居然沒有圖形界面,還是在DOS的命令行中用EDIT,EDIT不支持多窗口,查看、替換代碼都很不方便。
2 編譯只能用VC5.0,而不能用的VC6.0。在WIN 98 DDK 幫助中, System Requirements 部分,微軟清楚地提醒大家:Note that Visual C++ 6.0 is not supported for any of the samples.
3 對靜態VxD,每次改寫代碼,都需要在system.ini 文 件 中,對節[386Enh] 加 一 行:device= VxD文件名, 每次改寫,都要重新啟動計算機,每次都要經過漫長的等待過程,簡直讓人無法忍受。
如何解決上述3個問題,筆者僅就工作中取得的經驗,談談用VC6.0集成環境快速開發VxD的方法,希望能給大家帶來一些幫助。
在開發護花使者反黃軟件時,筆者采用了VtoolsD 3.0來編寫文件保護VxD模塊。
VtoolsD 3.0 是Compuware 公司開發的軟件包,包含幾個實用工具:
1. QuickVxD:創建VxD的C和C++語言框架,它不僅支持VC5.0和VC6.0 ,而且支持Borland C++ 5.x。和VC的AppWizard 類似,QuickVxD相當於一個代碼生成器,不同的是AppWizard用MFC類庫來生成程序框架,而QUICKVXD利用自定義的一系列宏和類來生成程序框架。
2. Debug Monitor:動態裝卸並顯示VxD的調試信息,不僅能裝載動態VxD,而且還可以裝載靜態VxD, 裝載後調試完畢,無論是動態還是靜態的VxD,都可以隨時卸載。這是一個足以讓微軟為之汗顏的強大功能,成功地避免了編寫靜態VxD每次都要重新啟動的麻煩,給編程者帶來極大的方便。
3.VxdVer.exe:DOS 命令行工具,可以設置VxD的版本信息。這個小工具也很重要,因為用VC6.0無法設置VxD版本信息,只能通過VxdVer來手工設置。
下面,詳細介紹一下用VC6.0集成環境快速開發VxD的具體步驟:
首先用QuickVxd生成VxD的框架程序,點擊:開始菜單/Numega VtoolsD/QuickVxD,打開QuickVxD,選取Device Parameters ,設置Device Name =MY;選取OutPut Files, 然後按下Generate Now按鈕,就生成了VxD的框架源程序,它包括3個文件:後綴為.h的頭文件;後綴為.c或cpp的代碼文件;後綴為.mak的工程文件。然後,我們把這3個文件:MY.h、 MY.cpp和My.mak 復制到E:\my\目錄下。傳統的在命令行中生成VxD的方法如下:
點擊:開始菜單/Development Kits/Windows 98 DDK/Checked(Free) Build Environment,
設置編譯環境,在DOS的命令行中,找到MY .mak文件,設置E:\my為當前目錄,輸入指令:nmake,即可生成後綴為.VxD的文件。
然後,我們再把VxD的框架程序和VC6.0的開發環境集成在一起:
1.把VxD的工程文件集成進入VC6.0的編譯器:
在VC6.0中新建工作空間文件,打開VC6.0,選擇File/New,選擇Project tab,點擊Makefile, 在Project Name中輸入my, 在Location中輸入E:\my, (注意:在新建Makefile時,project name 的名字要和 Location的目錄名保持一致,在本例中同為my。) 然後點擊ok,在OutPut中,把原來的my.exe換成my.vxd,點擊Finish.
這時,VC6.0就自動生成了項目文件my.dsp和工作空間文件my.dsw。然後,就可以用VC6.0的編譯器來生成VxD了,方法如下:點擊VC6.0的菜單Build/Build my.vxd。
2.把Vxd的源文件集成進入VC6.0的編輯器:
在VC6.0的WorkSpace窗口,選擇FileView頁面,右鍵點擊Source Files,在快捷菜單中,選擇Add Files to Folder,添加源文件MY.cpp;如法炮制,添加頭文件MY.h。
這時,我們就能通過VC6.0 的WorkSpace窗口來觀察VxD類了,點擊Class View頁面,可以看到my.vxd的3個類:MyDevice, MyThread, MyVm。至此,我們編輯VxD代碼時,再也不需要用命令行的EDIT.COM。
要想在編輯器中工作得更方便,我們還需要設置浏覽信息,才能用F12來查看類的定義和參考。方法如下:
1) 選擇VC6.0的菜單:Project/Settings…
2) 設置 Build Command Line: nmake /f "my.mak" BROWSE=1;
3) 設置 Browse info File Name: MY;
4) 點擊ok,然後選擇VC6.0的菜單File/Open,打開MY.bsc;
這時,用右鍵點擊VC6.0的源代碼窗口,快捷菜單中就會出現 Goto Definition of和Goto Reference of 這2個選項。然後,我們就可以用VC6.0中非常熟悉的界面來編輯VxD的源代碼了,是不是很方便吧?
3. 把Debug Monitor添加到VC6.0的工具菜單裡:
在調試VxD源代碼時,常用dprintf()或dout<<來輸出調試信息,Debug Monitor可以動態裝卸並顯示VxD的調試信息,我們可以把這個調試工具也集成在VC6.0中。點擊VC6.0的菜單Tools/Customize…,選擇Tools項,輸入新建菜單的名稱VxD Monitor 或任意別的名稱,設置Command: C:\Program Files\NuMega\VtoolsD\Bin\monitor.exe,即可以把Debug Monitor添加到VC6.0的工具菜單裡。 當我們調試VxD時,可以點擊剛才新建的VxD Monitor菜單,運行Debug Monitor。選擇Debug Monitor的菜單File/Open Driver…來裝載要調試的VxD;選擇菜單File/Start Drive 來運行VxD, 運行後,在Debug Monitor的窗口中,就能看到調試信息了。這個功能相當於VC6.0的TRACE()。調試完畢,退出Debug Monitor時,一定要注意先點擊菜單File/Stop Driver,停止運行VxD,不然,再次進入Debug Monitor時,必定造成系統崩潰。
4. 設置VxD的版本信息。
在軟件升級時,文件的版本信息起著至關重要的作用。用VC6.0無法設置VxD版本信息,只能通過VxdVer來手工設置。(希望國內一個很著名的軟件作者,看了此方法後,也把自己的SthVxd.vxd加上版本信息。)
最初,作者試圖通過VC6.0來添加版本信息,但無論是修改VxD的頭文件,還是設置VC6.0的Resource Files ,均告無效。看過VtoolsD的幫助文件,對VxD Ver的用法的介紹也是含糊不清,居然也不舉個例子說明,苦了VxD的初學者。
作者經過在網上查找資料,並不斷摸索,終於找到了設置VxD的方法:
如果要生成的VxD是MY.vxd,就用EDIT新建一個同名的MY.vrc, 以護花使者文件防刪模塊antidel.vxd為例, MY.vrc的內容如下:
CompanyName = "http://www.bianceng.cn"
FileDescription = "antidel file"
FileVersion = "Version 1.01"
InternalName = "ANTIDEL"
LegalCopyright = "[email protected]"
OriginalFilename = "antidel.vxd"
ProductName = "antidel"
ProductVersion = "Version 1.01"
Translation = 0x409, 0x4E4
存盤退出,在命令行執行:VxdVer.exe my.vcr my.res, 然後,在用VC6.0重新編譯一邊MY.vxd,VxD的版本信息就設置成功了。
以前,我一直覺得編寫VxD是一項很難的工作,其實,掌握了方法並不難。希望本文能為大家編寫VxD帶來幫助。有興趣的朋友可以光臨我的網頁:http://iflower.363.net/,歡迎大家來信探討:[email protected]