中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

VxD程序的初始化和結束的控制消息

1970-01-01    來源:

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

VxD程序分為兩種:靜態(tài)的和動態(tài)的。每種的加載方法都不同,接受到的初始化和結束的控制消息也不同。?
靜態(tài)VxD:?
下列情況下,VMM加載一個靜態(tài)VxD:?
一個實模式常駐程序通過調用中斷2FH,1605H,來調用此VxD。?
此VxD在注冊表中的如下位置有定義:?
HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\VxD\\key\\StaticVxD=VxD帶路徑文件名?
此VxD在system.ini中的[386enh]行下有定義:[386enh]?section:?

device=VxD帶路徑文件名?
在開發(fā)的時候,我建議你從system.ini載入VxD程序,因為這樣如果你的VxD程序有錯而導致Windows不能啟動的話,你可以在Dos下修改system.ini,而如果你使用的注冊表載入的辦法,就無法修改了。?
當VMM加載你的靜態(tài)VxD程序時,你的VxD程序會按以下順序接收到三個系統(tǒng)控制消息:?
Sys_Critical_Init?VMM在轉入到保護模式后,開放中斷前發(fā)出這個控制消息。大多數(shù)VxD程序到不要用到這個消息,除非:?
你的VxD程序要接管一些其他VxD程序或者保護模式程序要用到的中斷。既然你處理這個消息的時候這個中斷還沒有打開,你就可以確定在你接管這個中斷的時候此中斷不會被調用。?
你的VxD程序為其他的VxD程序提供了一些VxD服務。例如,一些在你的VxD程序后加載的VxD程序在處理Device_Init控制消息時需要調用一些你的VxD服務,既然Sys_Critical_Init?控制消息在Device_Init消息之前被發(fā)送,所以你應該在Sys_Critical_Init?消息發(fā)送時初始化你的程序。?
如果你要對這消息進行處理,你應該盡可能快的做完初始化工作,以免太長的執(zhí)行時間導致的硬中斷丟失。(記住:中斷還沒打開)?
Device_Init?VMM在開放中斷后發(fā)送此信息。大多數(shù)VxD程序都在得到這個消息時初始化。因為中斷都開放了,所以耗時的操作也可以在這里執(zhí)行而不必怕會導致硬中斷的丟失。你可以在這時進行初始化(如果你需要的話)。?
Init_Complete?在所有的VxD程序處理完Device_Init?消息之后,VMM釋放初始化段(ICODE和RCODE段類)之前,VMM發(fā)出這個控制消息。只有少數(shù)幾個VxD要處理這個消息。?
你的VxD程序在成功地初始化后,必須將返回標志清零,反之,必須在返回之前把返回標志設為出錯信息。如果你的VxD不需要初始化,你就不必對這些消息進行處理。?
當要結束靜態(tài)VxD的時候,VMM發(fā)送如下的控制消息:?
System_Exit2?當你的VxD程序收到這個消息,Windows95正在關閉系統(tǒng),除了系統(tǒng)虛擬機所有其他虛擬機都已經(jīng)退出了。盡管如此,CPU仍然處于保護模式下,在系統(tǒng)虛擬機上執(zhí)行實模式編碼也是安全的。在這時Kernel32.dll也已經(jīng)被卸載了。?
Sys_Critical_Exit2?當所有的VxD完成對System_Exit2的響應處理并且中斷都被關閉后,你的VxD收到到這個消息。?
許多VxD程序并不要響應這兩個消息,除非你要為系統(tǒng)做轉換到實模式的準備。要知道,當Window95關閉時,它進入到實模式。所以如果你的VxD程序對實模式影像做了一些會導致它不穩(wěn)定的操作,它就需要在這時進行恢復。?
你也許會感到奇怪:為什么這兩個消息后面都跟著個“2\"?”。這是因為:在VMM加載VxD程序的時候,它是按照初始化順序值小的VxD先加載的順序加載的,這樣VxD程序就可以使用那些在它們之前加載的VxD程序提供的服務。例如,VxD2要用到VxD1中的服務,它就必須把它的初始化順序值定義的比VxD小。加載的順序是:?
.....?VxD1?===>?VxD2?===>?VxD3?.....?
那么卸載的時候,理所當然的是初始化順序值大的VxD程序先被卸載,這樣他們仍然可以使用比它們后加載的那些VxD程序提供的服務。如上面的例子,次序是:?
....?VxD3?===>?VxD2?===>?VxD1.....?
在上邊的例子中,如果VxD2在初始化時調用了VxD1中的某些服務,那么卸載時它可能也要再次用到一些VxD1中的服務。System_Exit2和Sys_Critical_Exit2是反初始化順序發(fā)送的。這表示,當VxD2接受到這些消息時,VxD1還沒有被卸載,它仍可以調用VxD1的服務,而System_Exit和Sys_Critical_Exit消息不是按照反初始化順序發(fā)送的。這意味著,你不能肯定你是否仍能調用在你之前加載的VxD提供的VxD服務。新一代的VxD程序不應該使用這些消息。?
還有兩種退出消息:?
Device_Reboot_Notify2?告訴VxD程序VMM正在準備重新啟動系統(tǒng)。這時候中斷還是開放的。?
Crit_Reboot_Notify2?告訴VxD程序VMM正在準備重新啟動系統(tǒng)。這時候中斷已經(jīng)被關閉了。?
到這里,你可以猜到還有Device_Reboot_Notify和Crit_Reboot_Notify?消息,但它們并不是像“2”版本的消息一樣按反初始化順序發(fā)送的。?
動態(tài)VxD:?
動態(tài)VxD在Windows9x里可以動態(tài)的被加載和卸載。這個特點在Window3.x下是沒有的。動態(tài)VxD程序的主要作用是用來支持某些動態(tài)的硬件設備的重裝,比如:即插即用設備。盡管如此,你可以從你的Win32程序中加載/卸載它,也可以把它看作是你的程序的一個到ring-0的擴展。?
上一節(jié)我們提到的例子是一個靜態(tài)的VxD,你可以把它轉換成一個動態(tài)的VxD,只要在.def文件中VxD標記的后面加上關鍵字DYNAMIC。?
VxD?FIRSTVxD?DYNAMIC?
這就是你把一個靜態(tài)VxD轉換成一個動態(tài)的VxD所要做的一切。?
一個動態(tài)的VxD可以按以下的方法被加載:?
把它放到你的Windows目錄下的\\SYSTEM\\IOSUBSYS目錄中。在這個目錄里的VxD會被輸入輸出監(jiān)視器(ios)加載。這些VxD必須支持層設備驅動。所以用這種方法加載你的動態(tài)VxD并不是一個好辦法。?
用VxD加載服務。?VxDLDR是一個可以加載動態(tài)VxD的靜態(tài)VxD。你可以在其他VxD里面或者在16位代碼里面調用它的服務。?
用Win32應用程序里的?CreateFile?API。你在調用CreateFile時,你的動態(tài)VxD要以下面的格式填寫:?

\\\\.\\VxD完整路徑名?

例如,如果你要加載一個在當前目錄下名為FirstVxD的動態(tài)VxD,你需要做如下的工作:?

.data?
VxDName?db?\"\\\\.\\FirstVxD.VxD\",0?
......?
.data??
hDevice?dd???
.....?
.code?
.....?
invoke?CreateFile,?addr?VxDName,0,0,0,0,?FILE_FLAG_DELETE_ON_CLOSE,0?
mov?hDevice,eax?
......?
invoke?CloseHandle,hDevice?
......?


FILE_FLAG_DELETE_ON_CLOSE?這個標志用來說明該VxD在CreateFile返回的句柄關閉時被卸載。?
如果你用CreateFile來加載一個動態(tài)VxD,那么這個動態(tài)VxD必須處理w32_DeviceIoControl?消息。當你的動態(tài)VxD第一次被CreateFile函數(shù)加載的時候,VWIN32?向你的VxD發(fā)出這個消息。你的VxD響應這個消息,返回時eax中的值必須為零。當應用程序調用DeviceIoControl?API來與一個動態(tài)VxD通訊時,w32_DeviceIoControl消息也被發(fā)送。我們會在下一章講到DeviceIoControl接口。?
一個動態(tài)VxD在初始化時收到一個消息:?
Sys_Dynamic_Device_Init?
在結束時也收到一個控制消息:?
Sys_Dynamic_Device_Exit?
動態(tài)VxD不會收到Sys_Critical_Init,?Device_Init和Init_Complete控制消息,因為這些消息是在系統(tǒng)虛擬機初始化時發(fā)送的。除了這三個消息,動態(tài)VxD能收到所有的控制消息,只要它還在內存里。它可以做靜態(tài)VxD可以做的所有事情。簡單的說,動態(tài)VxD除了加載機制和接收到的初始化/結束消息跟靜態(tài)VxD不同以外,它能做靜態(tài)VxD所能做的一切。?
其它系統(tǒng)控制消息?
當VxD在內存里的時候,除了接收和初始化及結束相關的消息外,它還要收到許多別的控制消息。有些消息是關于虛擬機管理器的,有的是關于各種事件的。例如,關于虛擬機的消息如下:?
Create_VM?
VM_Critical_Init?
VM_Suspend?
VM_Resume?
Close_VM_Notify?
Destroy_VM?
選擇地響應你所感興趣的消息是你自己的責任。?
在VxD內創(chuàng)建函數(shù)?
你要在一個段里面定義你的函數(shù)。你應該首先定義一個段,然后把你的函數(shù)放進去。例如,如果你要把你的函數(shù)放到一個可調頁段中。你應該先定義一個可調頁段,像這樣:?
VxD_PAGEABLE_CODE_SEG?
(你的函數(shù)寫在這里)?

VxD_PAGEABLE_CODE_ENDS?

你可以在一個段里面插入多個的函數(shù)。作為一個VxD編寫者,你必須決定每一個函數(shù)應該放到哪個段里面去。如果你的函數(shù)必須時刻存在于內存中,如某些硬件中斷處理程序,就把它們放到鎖定頁面段里面,否則,你應該把它們放到可調頁段。?
你要用BeginProc和EndProc?宏來定義你的函數(shù):?
BeginProc?函數(shù)名?
EndProc?函數(shù)名?

使用BeginProc?宏還可以加上一些參數(shù),想了解這些細節(jié),你可以看看Win95?DDK的文檔。大多數(shù)時候,你只用填寫函數(shù)的名字就夠了。?
因為BeginProc-EndProc?宏比proc-endp?指令的功能要強,所以你應該用BeginProc-EndProc宏來代替proc-endp指令?
VxD編程約定?
寄存器的使用?
你的VxD程序可以使用所有的寄存器,F(xiàn)S和GS。但是在改動段寄存器的時候一定要小心。尤其是,一定不要改動CS和SS的內容,除非你對將發(fā)生的事情有絕對的把握。你可以使用DS和ES,但一定要記住在返回時恢復它們初值。有兩個特征位尤其重要:方向和中斷特征位。不要長時間的屏蔽中斷。還有如果你要改動方向特征位,不要忘了在返回之前恢復它的初值。?
參數(shù)傳遞約定?
VxD服務函數(shù)有兩種調用約定:寄存器法和堆棧法。調用寄存器法服務函數(shù)時,你通過各種寄存器來傳遞服務函數(shù)的參數(shù)。并且,在調用完成后檢查寄存器的值來看操作是否成功。不要總是以為在調用服務函數(shù)后主要寄存器的值還和以前一樣。當調用堆棧法服務函數(shù)時,你把要傳遞的參數(shù)壓棧,在eax得到返回值。堆棧調用法的服務函數(shù)保存ebx,esi,edi和ebp的值。許多寄存器調用法服務函數(shù)都源于Windows3.x的時代。在大多數(shù)時候,你可以通過名字來區(qū)分這兩種服務函數(shù),如果一個函數(shù)的名字一下劃線開頭,如_HeapAllocate,它就是一個堆棧法的服務函數(shù)(除了少數(shù)從VWIN32.VxD導出的函數(shù))。如果函數(shù)名不是一下劃線開頭,它就是一個寄存器法的服務函數(shù)。?
調用VxD服務函數(shù)?
你可以通過VMMCall和VxDCall?宏來調用VMM和VxD服務。這兩個宏的語法是一樣的。當你要調用VMM導出的VxD服務函數(shù)時,用VMMCall。當你要用其它VxD程序導出的VxD服務函數(shù)時,用VxDCall。?
VMMCall?service?;?調用寄存器法服務函數(shù)e?
VMMCall?_service,?;?調用堆棧法服務函數(shù)?
正如我在前面所講的,VMMCall和VxDCall分解出一個跟著一個雙字的20h中斷,這樣用起來很方便。當你調用堆棧法服務時,你必須用角括號把你的參數(shù)列括起來。?
VMMCall?_HeapAllocate,??
_HeapAllocate是一個堆棧法服務函數(shù)。它有兩個參數(shù),我們必須用角括號把它們括起來。由于第一個參數(shù)是一個這個宏不能正確解釋的表達式,所以我們又要用一個角括號把它括起來。?
Flat地址?
在老的編譯工具里,當你使用offset?操作符時,編譯器和聯(lián)接器會生成錯誤地址,所以VxD編寫者用offset?flat:來代替offset。imm.inc包括了一個使這更簡單的宏:OFFSET32?來代替offset?flat:。所以如果你要用地址操作時,用OFFSET32?來代替offset操作符。?
注意:?當我寫這篇教程的時候,我試了一下用offset?操作符。它可以生成正確的地址。所以我想MASM6.14修正了這個bug。但是為了安全起見,你還是應該用OFFSET32宏來代替offset。

標簽: 安全 代碼 選擇

版權申明:本站文章部分自網(wǎng)絡,如有侵權,請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:簡單介紹Cacls命令的使用

下一篇:Windows 2000下,如何搭建JSP環(huán)境