程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 使用Windows虛擬設備驅動程序(VxD)之2

使用Windows虛擬設備驅動程序(VxD)之2

編輯:vc教程

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved