八、VxD初始化
VMM初始化一個VxD時做下列工作:
1、裝載實模式初始化段並調用實模式初始化過程。該過程可以完成阻止裝載VxD,阻止啟動Windows,指定設備實例數據和在內存中選擇頁面給
設備專用的工作。
2、裝載VxD其它段到32位平坦內存模式的保護模式內存,並丟棄實模式初始化段。
3、發送Sys_Critical_Init消息到設備控制過程。禁止硬件中斷,所以VxD應該盡可能地用較少的時間完成自身初始化。
4、發送Device_Init消息到設備控制過程。允許硬件中斷,所以必須准備讓VxD管理來自設備的中斷。
5、發送Init_Complete消息到設備控制過程。
6、丟棄初始化代碼和數據段,釋放其它被使用的內存。VxD不能在處理完Init_Complete消息以後試圖存取這些段中的過程和數據。
在初始化過程中的任何時刻,VxD都可以設置進位標志返回到VMM以阻止裝載VxD。部分VMM服務,例如初始化信息服務只在初始化過程中有效。
九、實模式初始化
任何靜態設備驅動程序都可以提供實模式初始化過程以在Windows切換到保護模式之前執行初始化任務。VMM裝載VxD時調用該過程,該過程檢查
有關的Windows環境,包括注冊表和初始化文件中的有關設置以判斷是否應該裝載該VxD。該過程也可以給Windows返回信息以為每個虛擬機的實
例指定物理內存頁保留給設備專用和數據項地址。要獲得關於實模式初始化的更多信息,請參閱相關資料。
十、VxD服務
VxD可以提供服務功能(函數或過程——譯者注)給VMM和其它VxD使用。這些服務讓其它VxD可以直接訪問該VxD的特征,允許測試和修改該VxD的功能和能力。
VxD不能和Windows DLL一樣引出函數,代之的是VMM通過INT 20H提供到VxD服務的動態鏈接,該中斷處理過程使用服務編號判斷支持服務的
VxD,該中斷處理過程也使用服務編號查詢在VxD服務表中的服務地址。
下面的內容講述怎樣在VxD中定義服務,聲明VxD服務表以及從一個VxD向另一個VxD中引入服務。
1、定義服務
VxD使用BeginProc和EndProc宏以及Service和Async_Service選項定義服務。宏標記服務過程代碼的開始和結束,選項標識該過程是一個服務。
下面的實例給出了VSAMPLED_Get_Version服務的定義:
BeginProc VSAMPLED_Get_Version, Service
mov ax, 030Ah
clc
ret
EndProc VSAMPLED_Get_Version
Async_Service選項標識該服務可以被異步調用,也就是說在處理中斷的過程中調用。異步服務必須是可重入的,而且不能調用VMM和不是異步服
務的VxD服務。
VMM和標准VxD對服務使用兩種調用約定:基於寄存器的調用約定和基於32位C語言的調用約定。這兩種調用約定有不同的服務名格式,參數傳遞
和返回值方法以及寄存器保護。
對於基於寄存器的服務,服務名不應該以下劃線(_)開頭,所有的參數通過寄存器傳遞,結果也通過寄存器返回,服務保護所有不顯式用於返回
值的寄存器。
對於基於C語言的服務,服務名必須以下劃線(_)開頭,所有的參數通過堆棧中的32位值傳遞,結果(如果存在)通過EAX寄存器(32位值)
或者EAX和EDX寄存器(64位值)返回,服務保護EBX、ES、FS和GS寄存器以及ESI和EDI寄存器,只有標志寄存器和EAX、EBX、EDX寄存器被修改。