使用Windows 95虛擬裝置驅動程式(VxD) (轉)

worldblog發表於2007-12-09
使用Windows 95虛擬裝置驅動程式(VxD) (轉)[@more@]

大家知道整天都在討論的利用了VxD技術,掌握了VxD ,就等於破除了CIH 病毒神話,徹底清除CIH 病毒。仔細學習這篇文章。
VxD介紹

本文介紹VxD的作用。如果 95提供的標準VxD對你的或者不能提供100%的相容支援,你需要為你的硬體或者軟體(包括16位和32位軟體) 建立VxD。如果你想讓Windows使用你的硬體或者軟體的某些新特徵,你也可以建立VxD。本文介紹如何寫VxD,講述了建立VxD所需的結構、過程和,還給出了建立和測試VxD 的步驟。VxD 可以是靜態的或者動態裝載的,下面的內容主要講述靜態VxD,不過關於格式和功能的內容兩者都適用。

什麼是VxD

VxD是一個管理例如硬體裝置或者已軟體等資源的32位可,使得幾個應用程式可以同時使用這些資源。Windows透過使用VxD允許基於Windows的應用程式實現多工。VxD在與Windows的連線工作中處理中斷,併為需要進行I/O操作的應用程式執行I/O操作,而且不影響其他應用程式的執行。大多數VxD管理硬體裝置,也有一些VxD管理或代替與之相關的軟體, 例如普通ROM 。VxD可以包含必須在相應裝置上執行的裝置相關程式碼,也可以依靠其它軟體去執行這些對裝置的操作。任何情況下,VxD都會為每一個應用程式保留該裝置狀態的記錄,保證無論何時一個應用程式繼續執行該裝置均處於正確狀態。一些VxD僅僅管理已安裝軟體,例如MS-DOS裝置程式或者TSR 程式,這樣的VxD通常包含模擬這些軟體或者保護這些軟體用於正在執行的應用程式的資料的程式碼。VxD有時還用於提高已安裝軟體的,相容執行32位的VxD比執行16位的MS-DOS裝置驅動程式或者TSR程式有更高的。

標準VxD

Windows包括多種VxD,用於支援公共硬體裝置和可安裝軟體。在某些情況下,可能需要修改VxD以提供新的特徵或者支援非標準硬體。Windows提供許多不準備修改,但能夠輔助支援其他VxD的VxD。例如:許多 VxD使用V86管理器(V86MMGR)和虛擬可程式設計中斷控制器裝置(VPICD)提供的功能儲存V86記憶體和允許硬體中斷請求。要取得開發VxD的幫助,Windows 95裝置驅動程式開發工具包(DDK)包括了大量可用裝置驅動程式的。

建立VxD

你可以透過修改VxD例子程式或者自己學著寫來建立VxD 。你可以用語言來寫VxD,也可以用高階語言(例如C語言)來寫一部分VxD。要建立一個VxD,需要以下步驟:
1、閱讀硬體手冊中關於描述這種型號硬體VxD的章節。
2、寫出所需的控制過程,VxD服務和。
3、建立為VxD標示適當模組名的模組定義,並引出需要的裝置描述塊。
4、彙編連線VxD。
5、用版Windows 95測試VxD,要獲得更多關於除錯VxD的資訊,請參閱相關資料(可以用Soft-ICE除錯——譯者注)。
6、為VxD和相關檔案建立安裝檔案(INF檔案),透過修改註冊資訊和向Windows的SYSTEM目錄和相關目錄複製檔案來安裝VxD。
7、建立最終發行軟體包。募?窗滄痴xD。

你需要怎樣開始

本文假定你是一位有的組合語言程式設計師,而且熟悉Intel相容的說明和系統結構。在某些特殊情況下,你還應該懂得下列內容:

保護模式和虛擬8086(即V86——譯者注)模式。
平坦記憶體模式
中斷和異常處理
保護和特權級
段和頁式記憶體管理以及錯誤處理
輸入和輸出保護以及錯誤處理

本文也假定你已經熟練了解專門硬體的特徵和相應的普通ROM BI以及其他可安裝軟體。

寫一個VxD

許多情況下,寫一個VxD用來代替一個由Windows 95提供的標準VxD。然而,大多數情況下,寫一個VxD 是用來支援新硬體裝置或者軟體的,在這種情況下,通常手工建立一個VxD比修改已經存在的VxD要容易,原因是大多數VxD 都是裝置相關的。然而,已存在VxD 的原始碼需要儘可能地仔細分析,原因是它們可能包含通用的格式和結構,以及說明怎樣使用VMM和VxD服務去實現有用的功能。
寫一個VxD需要下列步驟:
1、建立包含VxD各個段,VxD 說明,裝置控制過程,處理系統控制訊息過程的基本部分和API過程的基本部分的VxD。
2、加入真實模式初始化過程(可選)。
3、完成處理初始化訊息的過程。這些過程應該能夠初始化控制塊, 分配全域性記憶體以及安裝中斷、I/O捕獲和頁錯誤回撥過程。
4、完成處理不同中斷和錯誤的回撥過程。
5、為服務加入服務表定義和說明(可選)。
6、完成API過程(可選)
7、完成處理系統控制訊息的過程以建立和刪除虛擬機器。
在寫一個VxD的過程中,你可以安裝該VxD並在偵錯程式控制下執行Windows,在該VxD中設定斷點監視該VxD管理的中斷,這樣可以幫助你查明該VxD是否正確工作。

VxD段

VxD可以包含下面5個段的一些組合:
1、VxD_CODE段:保護模式程式碼段(必須)。該段包含VxD系統控制過程、回撥過程、服務和API過程。該段用宏VxD_CODE_SEG和VxD_CODE_ENDS定義開始和結束,也可命名為_LTEXT。
2、VxD_DATA段:保護模式資料段(必須)。該段包括裝置描述表、 服務表和部分VxD全域性資料。該段用宏VxD_DATA_SEG和VxD_DATA_ENDS定義開始和結束,也可命名為_LDATA。
3、VxD_ICODE段:保護模式初始化程式碼段(可選)。該段一般包括只在VxD初始化過程中使用的過程和服務,VMM在Init_Complete 訊息發生後丟棄此段。該段用宏VxD_ICODE_SEG和VxD_ICODE_ENDS定義開始和結束,也可命名為_ITEXT。
4、VxD_IDATA段:保護模式初始化資料段(可選)。該段一般包括初始化過程和服務使用的資料,VMM在Init_Complete訊息發生後丟棄此段。 該段用宏VxD_IDATA_SEG和VxD_IDATA_ENDS定義開始和結束,也可命名為_IDATA。
5、VxD_REAL_INIT段:真實模式初始化段(可選)。該段包含真實模式初始化過程和資料,VMM在載入VxD其它部分之前呼叫此過程,過程返回後丟棄此段,該段用宏VxD_REAL_INIT_SEG和VxD_REAL_INIT_ENDS定義開始和結束,也可命名為_RTEXT。除真實模式初始化段以外,所有程式碼和資料段均為32位平坦記憶體模式的保護模式段,這就是說定義在保護模式段中的過程和資料均為32位的偏移量。當VMM裝載VxD時,按照VxD在記憶體中的實際位置修正所有的偏移量。因此,在保護模式段中使用普通OFFSET指令處應該使用OFFSET32宏,OFFSET32宏定義的偏移量為聯結器確定了正確的偏移量修正資訊。
VxD不能改變CS、DS、ES和SS段暫存器,VxD能夠使用FS和GS段暫存器。

保護模式指令

VxD的源程式檔案必須以.386p命令開始,以通知彙編器允許保護模式指令。雖然VxD工作在0特權級,但也不應該用保護模式指令去修改CPU 的執行,例如修改全域性描述符(選擇子——譯者注)或中斷描述符以及修改任務狀態段或暫存器,這樣做可能會對Windows執行有不利影響。唯一的例外情況是當該VxD為虛擬數學協處理器裝置驅程式(VMCPD),允許修改CR0暫存器中的80387位。

包含(Include)檔案

包含檔案定義了VxD 需要的宏、結構、符號和服務表,用於宣告段和過程以及使用VMM和其它VxD服務。下面列出每個包含檔案包含的公共服務定義、宏和符號定義:
1、VMM.INC:包含所有的VMM服務以及所需的宏和符號,例如Declare_Virtual_Device和VMMCall。
2、DE.INC:包含在除錯終端上輸出資訊和執行各種資料檢查的宏。這些宏的功能由定義了除錯符號的VxD在彙編時該檔案生成的程式碼實現。
3、VPICD.INC:包含為虛擬可程式設計中斷控制器裝置(VPICD )定義的所有服務、宏和符號。VPICD處理所有的中斷,所以許多VxD需要VPICD服務。
4、.INC:包含虛擬外殼裝置提供的公共服務的定義。虛擬外殼裝置提供對例如MessageBox這樣的Windows函式的呼叫,可以讓VxD顯示對話方塊。

VxD宣告

每一個VxD 都要宣告一個名稱、一個版本號、一個初始化順序和一個裝置控制過程,許多虛擬裝置驅動程式還宣告一個裝置標識和一些API過程。 VxD一般使用Declare_Virtual_Device宏來實現這些宣告,例如:
Declare_Virtual_Device VSAMPLED, 4, 0, VSAMPLED_Control, VSAMPLED_Device_ID, VSAMPLED_Init_Order, VSAMPLED_V86_API_Handler, VSAMPLED_PM_API_Handler
本例宣告瞭一個VxD例項——VSAMPLED V4.0 ,在對應的原始檔必須定義名字為VSAMPLED_Control的裝置控制過程。符號VSAMPLED_Device_ID和VSAMPLED_Init_Order說明非標準VxD的標識和初始化順序,該VxD支援V86模式和保護模式API過程。VMM用宏定義的資訊來初始化VxD併傳送系統控制訊息給VxD,並且允許MS-DOS 應用程式、裝置驅動程式和TSR呼叫VxD。為了使VMM 存取這些資訊,相應的宏建立一個裝置描述塊(D)並將其儲存在保護模式資料段中(DDB的格式與VxD_Desc_Block結構相同),宏為DDB建立了一個必須在VxD連線時被顯式引出的標號。在上例中,DDB 的名稱是VSAMPLED_DDB。

VxD標識(ID)

一個VxD提供一個VxD標識,以區別於其它VxD。VMM 動態連線例程使用VxD標識為合適的VxD連線服務呼叫,如果VxD提供服務或者提供V86模式和保護模式API過程以及其它需要唯一標識的情況,VxD就必須有唯一標識。雖然標準VxD使用預定義VxD 標識(符號定義在VMM.INC檔案中),支援新裝置和新軟體介面的VxD還是必須全部有新標識。為了防止與其他新VxD衝突,透過請求和註冊標識來保證沒有其它廠商使用自己的VxD的標識,Microsoft保留0—01FFH之間的所有VxD 標識自己使用。不提供服務或者API過程,或者不需要唯一標識的VxD應該使用Undefined_Device_ID 符號來定義VxD標識。

初始化順序

每一個VxD都有一個用於指定VMM應該何時初始化該VxD的初始化順序值,VMM按照該值從小到大的順序初始化虛擬機器(VM ——譯者注)。如果兩個或者兩個以上的VxD有相同的值,VMM會按照SYSTEM.INI 檔案中出現的順序來初始化,但指定順序是沒有保證的。對於需要呼叫其它VxD服務或者需要在其它VxD 之前攔截中斷的VxD,初始化順序是很重要的。如果一個VxD需要在標準VxD之前或者之後初始化,它的初始化順序值應該透過在標準VxD預定義的初始化順序符號(在VMM.INC檔案中定義)上加上或者減去一個小數值來建立。如果一個VxD不需要初始化順序值,應該使用Undefined_Init_Order 符號代替初始化順序值。

裝置控制過程

每一個VxD都有一個裝置控制過程,VMM透過呼叫此過程給VxD傳送VxD系統控制訊息。系統控制訊息指導VxD完成動作,例如自身初始化或者通知VxD虛擬機器的變化(例如建立虛擬機器)等。許多VxD透過使用Begin_Control_Dispatch、 Control_Dispatch和End_Control_Dispatch宏來定義裝置控制過程,例如:

Begin_Control_Dispatch VSAMPLED
Control_Dispatch Sys_Critical_Init, VSAMPLED_Crit_Init
Control_Dispatch Device_Init, VSAMPLED_Device_Init
Control_Dispatch Sys_Critical_Exit, VSAMPLED_Crit_Exit
End_Control_Dispatch VSAMPLED

上例中,宏建立了一個名字為VSAMPLED_Control的裝置控制過程,並生成了檢查Sys_Critical_Init、Device_Init和Sys_Critical_Exit 訊息的指令。當這些訊息傳送到該過程時,該過程透過控制相應的過程(例如VSAMPLED_Crit_Init)來處理訊息,這些訊息處理過程必須在VxD中定義。

系統控制訊息

VMM傳送系統控制訊息給VxD,以通知VxD影響系統和虛擬機器的變化。大多數VxD需要跟蹤虛擬機器的建立和狀態,所以無論何時建立、初始化或者終止虛擬機器,VMM都會傳送訊息給VxD。VMM也會在執行焦點移動到一個虛擬機器或者從一個虛擬機器移走時,以及虛擬外殼裝置需要給使用者顯示一個訊息框時傳送訊息給VxD。
下面是公共訊息和VxD應該怎樣處理這些訊息的方法列表:

Begin_Message_Mode訊息:當虛擬外殼裝置需要給使用者顯示一個訊息框但不能使用系統虛擬機器和Windows函式時VxD收到此訊息。虛擬鍵盤、滑鼠和顯示裝置儲存當前狀態,允許任何訊息模式服務併為訊息模式處理初始化相應裝置。
Create_VM訊息:這是當一個新的虛擬機器被建立時VxD收到的第一條訊息。VxD應該初始化與虛擬機器有關的資料,特別是控制塊。
Debug_Query訊息:VxD從WDEB386偵錯程式收到此訊息。VxD可以顯示除錯列表和從除錯終端讀取使用者命令。
Destroy_VM訊息:這是VxD收到的第三條虛擬機器終止訊息。Simulate_Int和
Exec_Int服務對獲得此訊息的虛擬機器不再有效。
Device_Init訊息:這是VxD收到的第二條訊息。允許中斷,大多數VxD分配和複製初始狀態到系統虛擬機器控制塊中的裝置指定部分,安裝中斷回撥函式和I/O保護異常以及指定例項資料。這時,Simulate_Int和Exec_Int服務變得有效。
End_Message_Mode訊息:當虛擬外殼裝置不再需要顯示訊息框時VxD收到此訊息。虛擬鍵盤、滑鼠和顯示器裝置恢復獲得此訊息的虛擬機器以前儲存的狀態,禁止任何訊息模式服務。
Init_Complete訊息:這是VxD收到的第三條訊息,也是最後一條與系統初始化有關的訊息。雖然大多數VxD都不處理此訊息,但使用V86記憶體的VxD應該在此訊息返回前定位和申請記憶體。當VxD返回此訊息時,VMM丟棄VxD的初始化程式碼和資料段。
Query_Destory訊息:當虛擬外殼裝置需要決定是否可以刪除虛擬機器時VxD收到此訊息。VxD可以透過設定進位標誌(CF——譯者注)返回以阻止虛擬機器被刪除,在這種情況下VxD應該使用SHELL_Message服務來通知使用者問題。
Reboot_Processor訊息:當使用者試圖重新啟動時VxD收到此訊息。可以重新啟動計算機的VxD,例如鍵盤裝置應該完成該工作。
Set_Device_Focus訊息:當執行焦點從一個虛擬機器移動到另一個虛擬機器時VxD收到此訊息。VxD恢復硬體裝置到與虛擬機器有關的狀態。如果VxD使用I/O捕獲管理沒有執行焦點時的虛擬機器,VxD應該儘可能地移走太多的I/O捕獲,使虛擬機器執行儘可能地快一些。
Sys_Critical_Exit訊息:這是VxD收到的最後一條訊息。禁止中斷,Simualte_Int和Exec_Int服務不再有效。VxD應該復位與之相關的硬體裝置,保證能夠無問題地返回到真實模式。
Sys_Critical_Init訊息:這是VxD收到的第一條訊息。中斷仍然不被允許,所以VxD應該儘可能快地完成任務。大多數VxD完成下列任務:
安裝和初始化需要支援來自裝置的硬體中斷和來自VMM或者其它VxD的軟體中斷的任何函式,為裝置提供除需要使用V86模式記憶體頁以外的申請,例如虛擬顯示裝置申請顯示記憶體。
初始化VxD服務需要的任何資料,這通常包括讀取SYSTEM.INI檔案中的設定。
當處理此訊息時,Simualte_Int和Exec_Int服務必須不被使用。
Sys_VM_Init訊息:在Init_Complete訊息之後VxD收到此訊息。VxD應該初始化系統虛擬機器的硬體和軟體狀態。如果VxD設定進位標誌返回,VMM終止所有程式並退出Windows。
Sys_VM_Tenate訊息:這是VxD收到的第一條系統虛擬機器終止訊息。VxD可以開始為虛擬機器終止做準備。Simulate_Int和Exec_Int服務有效,系統虛擬機器總是最後一個被終止的虛擬機器。
System_Exit訊息:這是當系統終止時VxD收到的第一條訊息。VMM在傳送Sys_VM_Terminate訊息之後傳送此訊息,允許中斷,但Simualte_Int和Exec_Int服務不再有效。如果此訊息來自一個致命錯誤的結果,VxD可以透過修改系統虛擬機器的記憶體以恢復系統狀態,使得Windows能夠終止而不當機。
VM_Critical_Init訊息:這是當一個新的VxD(虛擬機器——譯者注)被建立時VxD收到的第二條訊息。VxD可以透過設定進位標誌返回以阻止虛擬機器被建立。禁止中斷,Simualte_Int和Exec_Int服務不再有效。
VM_Init訊息:這是當一個新的VxD被建立時VxD收到的第三條訊息。VxD應該初始化虛擬機器的硬體和軟體狀態,例如虛擬顯示裝置執行INT 10H功能設定初始顯示模式。
VM_Not_Execute訊息:這是VxD收到的第二條虛擬機器終止訊息(如果虛擬機器已經被虛擬外殼裝置刪除,這是收到的第一條訊息)。VxD可以透過檢查EDX暫存器中的標誌來查明終止原因。Simulate_Int和Exec_Int服務對獲得此訊息的虛擬機器不再有效。
VM_Resume訊息:當虛擬機器的執行被恢復時VxD收到此訊息,例如切換到前臺時。VxD應該鎖定任何資源和為虛擬機器重新開始準備內部結構。如果VxD設定進位標誌返回,VMM不恢復執行虛擬機器。
VM_Suspend訊息:當虛擬機器已經被掛起時VxD收到此訊息,例如切換到後臺時。VxD應該解鎖任何與虛擬機器有關的資源。
VM_Terminate


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990203/,如需轉載,請註明出處,否則將追究法律責任。

相關文章