八、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寄存器被修改。