亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

VxD的初始化和結束

2024-09-01 13:47:09
字體:
來源:轉載
供稿:網友

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

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

////.//VxD完整路徑名 

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

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

VxD_PAGEABLE_CODE_ENDS 

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

使用BeginProc 宏還可以加上一些參數,想了解這些細節,你可以看看Win95 DDK的文檔。大多數時候,你只用填寫函數的名字就夠了。 
因為BeginProc-EndProc 宏比proc-endp 指令的功能要強,所以你應該用BeginProc-EndProc宏來代替proc-endp指令 
VxD編程約定 
寄存器的使用 
你的VxD程序可以使用所有的寄存器,FS和GS。但是在改動段寄存器的時候一定要小心。尤其是,一定不要改動CS和SS的內容,除非你對將發生的事情有絕對的把握。你可以使用DS和ES,但一定要記住在返回時恢復它們初值。有兩個特征位尤其重要:方向和中斷特征位。不要長時間的屏蔽中斷。還有如果你要改動方向特征位,不要忘了在返回之前恢復它的初值。 
參數傳遞約定 
VxD服務函數有兩種調用約定:寄存器法和堆棧法。調用寄存器法服務函數時,你通過各種寄存器來傳遞服務函數的參數。并且,在調用完成后檢查寄存器的值來看操作是否成功。不要總是以為在調用服務函數后主要寄存器的值還和以前一樣。當調用堆棧法服務函數時,你把要傳遞的參數壓棧,在eax得到返回值。堆棧調用法的服務函數保存ebx,esi,edi和ebp的值。許多寄存器調用法服務函數都源于Windows3.x的時代。在大多數時候,你可以通過名字來區分這兩種服務函數,如果一個函數的名字一下劃線開頭,如_HeapAllocate,它就是一個堆棧法的服務函數(除了少數從VWIN32.VxD導出的函數)。如果函數名不是一下劃線開頭,它就是一個寄存器法的服務函數。 
調用VxD服務函數 
你可以通過VMMCall和VxDCall 宏來調用VMM和VxD服務。這兩個宏的語法是一樣的。當你要調用VMM導出的VxD服務函數時,用VMMCall。當你要用其它VxD程序導出的VxD服務函數時,用VxDCall。 
VMMCall service ; 調用寄存器法服務函數e 
VMMCall _service, ; 調用堆棧法服務函數 
正如我在前面所講的,VMMCall和VxDCall分解出一個跟著一個雙字的20h中斷,這樣用起來很方便。當你調用堆棧法服務時,你必須用角括號把你的參數列括起來。 
VMMCall _HeapAllocate, <, HeapLockedIfDP> 
_HeapAllocate是一個堆棧法服務函數。它有兩個參數,我們必須用角括號把它們括起來。由于第一個參數是一個這個宏不能正確解釋的表達式,所以我們又要用一個角括號把它括起來。 
Flat地址 
在老的編譯工具里,當你使用offset 操作符時,編譯器和聯接器會生成錯誤地址,所以VxD編寫者用offset flat:來代替offset。imm.inc包括了一個使這更簡單的宏:OFFSET32 來代替offset flat:。所以如果你要用地址操作時,用OFFSET32 來代替offset操作符。 
注意: 當我寫這篇教程的時候,我試了一下用offset 操作符。它可以生成正確的地址。所以我想MASM6.14修正了這個bug。但是為了安全起見,你還是應該用OFFSET32宏來代替offset。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伊人伊人伊人久久| 国产福利精品视频| 日韩亚洲欧美中文高清在线| 国产精品欧美一区二区| 亚洲无限乱码一二三四麻| 国产亚洲精品美女久久久| 在线观看免费高清视频97| 中文字幕亚洲精品| 久久精品99无色码中文字幕| 国产成人拍精品视频午夜网站| 日韩av网站大全| 亚洲欧美国产精品专区久久| 日韩免费av在线| 三级精品视频久久久久| 成人两性免费视频| 亚洲日本欧美日韩高观看| xvideos国产精品| 国产精品旅馆在线| 国内精品久久影院| 日韩在线观看网址| 91精品国产高清自在线| y97精品国产97久久久久久| 6080yy精品一区二区三区| 久久免费精品日本久久中文字幕| 黑人欧美xxxx| 欧美激情欧美狂野欧美精品| 欧美日韩国产精品一区二区三区四区| 97不卡在线视频| 亚洲色图欧美制服丝袜另类第一页| 久久精品久久久久电影| 亚洲精品xxx| 欧美日韩性生活视频| 欧美在线视频导航| 亚洲天堂av高清| 亚洲2020天天堂在线观看| 亚洲精品久久久久久久久久久久久| 国产女人精品视频| 欧美性高跟鞋xxxxhd| 在线播放国产一区中文字幕剧情欧美| 中日韩美女免费视频网站在线观看| 久久国产精品视频| 精品成人乱色一区二区| 亚洲精品久久久久久久久久久| 久久久国产精品x99av| 成人免费直播live| 国产日韩欧美一二三区| 精品久久久久久中文字幕大豆网| 国产精品青草久久久久福利99| 国产精品中文字幕久久久| 亚洲人成电影网站色…| 久久影院中文字幕| 成人午夜两性视频| 日韩视频中文字幕| 一区二区三区亚洲| 日韩欧美中文免费| 色综合久久久888| 欧美伊久线香蕉线新在线| 久久久噜久噜久久综合| 91精品国产高清久久久久久91| 97久久久久久| 欧美黄色成人网| 91免费高清视频| 久久免费视频网| 欧美性猛交丰臀xxxxx网站| 国产欧美va欧美va香蕉在线| 97精品国产91久久久久久| 亚洲成人1234| 久久国产精品99国产精| 欧美一区二区大胆人体摄影专业网站| 国产成人精品免高潮费视频| 亚洲精品www久久久| 欧美亚洲日本网站| 亚洲精品国精品久久99热一| 日本道色综合久久影院| 国产精品国产三级国产aⅴ浪潮| 欧美日韩高清在线观看| 国产日产欧美精品| 96精品久久久久中文字幕| 国产亚洲精品日韩| 精品久久久久久久久久国产| 亚洲国产天堂久久国产91| 国外成人性视频| www.亚洲人.com| 国产成人精品最新| 国产精品成人aaaaa网站| 亚洲成人久久一区| 亚洲激情视频在线观看| 97婷婷涩涩精品一区| 欧美成人免费在线视频| 成人a免费视频| 久久久视频免费观看| 欧美三级免费观看| 九九久久国产精品| 日韩极品精品视频免费观看| 日韩精品高清在线观看| 欧美性感美女h网站在线观看免费| 色综合久久天天综线观看| 国产91av在线| 国产美女久久精品香蕉69| xxxx欧美18另类的高清| 国产精品久久9| 亚洲国产精品人人爽夜夜爽| 这里只有精品视频| 亚洲成年人影院在线| 国产精品久久久亚洲| 久久久久国色av免费观看性色| 久久精品一本久久99精品| 成人激情在线播放| 隔壁老王国产在线精品| 国产精品网址在线| 午夜免费日韩视频| 中文字幕欧美日韩精品| 日韩免费av一区二区| 欧美激情亚洲视频| 国产91ⅴ在线精品免费观看| 韩国精品久久久999| 九九久久综合网站| 亚洲国产精品人人爽夜夜爽| 欧美伦理91i| 国产精品7m视频| 亚洲天堂av在线免费观看| 欧美激情亚洲国产| 91天堂在线视频| 日韩av在线网站| 久久伊人色综合| 日日狠狠久久偷偷四色综合免费| 日韩在线中文视频| 久久久国产一区二区三区| 日本精品免费一区二区三区| 欲色天天网综合久久| 久久久久久久国产精品| 亚洲激情电影中文字幕| 久久影视电视剧凤归四时歌| 91豆花精品一区| 国产日本欧美一区二区三区| 国产91九色视频| 亚洲精品成人久久久| 久久成人亚洲精品| 久久影视电视剧免费网站| 亚洲精品成a人在线观看| 国产99视频在线观看| 亚洲色图13p| 国产一区二区精品丝袜| 国产丝袜一区视频在线观看| 久久男人资源视频| 中文字幕国产精品久久| 欧美激情综合色综合啪啪五月| 日韩中文娱乐网| 国产视频久久久久| 91精品视频在线免费观看| 国产视频久久久久久久| 国产精品男女猛烈高潮激情| 亚洲第一精品福利| 欧美精品精品精品精品免费| 日韩成人黄色av| 性日韩欧美在线视频| 国产精品老牛影院在线观看| 国产精品一区专区欧美日韩| 中文字幕日韩精品在线| 亚洲精品永久免费精品| 亚洲精品免费一区二区三区| 亚洲第一精品夜夜躁人人躁| 九九精品在线观看| 欧美性生交大片免网|