一、簡介
我們知道WDF分UMDF和KMDF架構,因為之前一直在核心模式下,是以一直沒有考慮UMDF驅動架構,還有一個原因是可以使用UMDF架構的驅動,都可以使用KMDF架構代替,反之,不然。但是,UMDF因為其運作在使用者模式下,是以也有許多便利性,比如:
1. UMDF增加了系統的穩定性,驅動在使用者模式程序位址空間中運作。
2. 既可以使用使用者模式的調試器調試,也可以使用核心模式下的調試器調試。
3. 因為UMDF運作在LocalService帳号下,是受限的通路使用者模式資料和系統檔案,增加系統的安全性。
二、結構
UMDF驅動抽象硬體功能,作為驅動堆棧的一部分管理裝置,檔案系統驅動,顯示驅動,和列印機的驅動不能使用UMDF。
UMDF和系統如下的部件進行聯系
Driver host process:UMDF主持程序裝載UMDF驅動和架構的DLL,并提供一個執行環境,給UMDF驅動,使用者模式堆棧中的消息傳遞。
Driver manager:驅動管理器是一個Windows服務,它管理所有Wudfhost驅動主持程序的所有執行個體。驅動管理器啟動每一個驅動主持進行的追蹤資訊。每一個host都是驅動管理器的子程序。每個系統中隻存在一個驅動管理器。驅動管理器啟動安裝UMDF裝置,并在之後運作它。
Reflector:反射器是一個核心模式驅動,它允許應用程式和驅動主持進行(使用者模式裝置堆棧)和其進行互動。反射器為每一個裝置執行個體建立一個獨立的裝置對象。并處理每一個裝置PNP事件和電源管理請求。所有的應用程式和驅動主持程序都是通過反射器進行互動的。對于給定的裝置的所有函數和過濾驅動必須運作在同一個驅動主持程序中。但是多個主持程序可以并發運作。
UMDF Driver Host Process:驅動主持程序(Wudfhost.exe)是驅動管理服務的子程序。Wudfhost.exe通常運作在LocalService賬戶下,在目前的計算機上隻擁護最小的權限。Wudfhost.exe的執行個體裝載一個或多個UMDF驅動DLL和架構的DLL.驅動主持程序提供一種運作環境,來處理在驅動管理器和反射器内部間進行内部程序通訊,IO分發,驅動裝載,驅動分層,線程池的管理。
三、注意點
1. 驅動管理器可以建立多個共存的Wudfhost.exe程序執行個體。
2. 如果你的UMDF驅動使用的UMDF1.9或者更早的版本,架構為每一個裝置堆棧建立一個獨立主持程序Wudfhost.exe的執行個體。
如果你的UMDF驅動使用的UMDF1.11以後的版本,運作在Windows8或以後的系統上,驅動管理器預設建立一個Wudfhost.exe執行個體,它可以主持多個裝置堆棧,這個技術叫做裝置池。
如果你的UMDF驅動使用的UMDF2.0的版本,運作在Windows8.1,池也是預設的。
你可以裝載那些使用版本1和2的UMDF共存的驅動,也可以使用同一個主持程序或不同的主持程序。一般來說,在Windows8.1以後,驅動管理器會把UMDF1.11和UMDF2.0驅動都裝載到同一個主持程序。
但是,你不能在同一個裝置堆棧中同時加載UMDF1.11和UMDF2.0驅動。是以,你不能夠将UMDF版本1的過濾驅動加載到UMDF版本2功能驅動的上面。
3. 在Wudfhost.exe内部,每一個UMDF驅動都運作在自己的獨立的位址空間,這樣就和應用程式和驅動主持進行的執行個體進行了隔離。
四、UMDF架構
下面,我們來看一下UMDF驅動體系結構,驅動管理器怎樣建構使用者模式裝置堆棧,主持程序,反射器,驅動管理器,怎樣來處理使用者模式應用程式發送到UMDF驅動的IO請求。
跟核心模式堆棧一樣,使用者模式堆棧的建造和解除安裝都是通過PNP事件來處理。在核心模式堆棧已經建立以後,反射器通知驅動管理器,開始建構使用者模式驅動堆棧。驅動管理器啟動驅動主持程序,并給其足夠的資訊,來建構使用者模式堆棧。使用者模式堆棧可以看作是核心模式堆棧的擴充。
驅動主持程序為使用者模式驅動提供執行環境,并在使用者模式堆棧中的驅動間傳送消息。反射器使用基于消息的内部進行通信體系和驅動管理器和驅動主持程序進行互動。
為了發送IO請求給UMDF驅動,應用程式可以調用Win32 IO函數,比如CreateFile,ReadFileEx,CancelloEx或DeviceIoControl。但反射器接受到一個來自應用程式的一個請求的時候,它發送請求到合适的驅動主持程序。然後,驅動主持程序将請求發送到正确的使用者模式裝置堆棧的最上層驅動。
請求可以被使用者模式堆棧的驅動直接結束,或者由使用者模式驅動轉發給反射器。當反射器接收到一個來自使用者模式驅動堆棧的請求時,它發送請求到核心模式驅動堆棧進行處理。