這是我對UsbDk官方文檔的翻譯,希望對大家有幫助,有錯誤之處還請諒解.
UsbDk開發套件是由一套軟件工具和模塊組成,它把USB設備從PNP管理器和設備驅動分離,並提供了一系列API供用戶層程序直接獨占的訪問USB設備,進行USB設備相關操作。
UsbDk一開始是用來為spice遠程桌面程序提供USB重定向的支持,然而它可以被用來做很多其他相關事情,通過UsbDk自帶的庫或者通過libusb(我們為libusb做了backend支持)
UsbDk開發套件包含以下模塊:
- UsbDk.sys – USB總線過濾驅動,用來獲取對USB設備的獨占訪問
- UsbDkHelper.dll – 輔助dll,用來安裝,卸載,設置驅動。並轉發USB請求到指定的USB設備
- UsbDkController.exe – 簡單的命令行程序,用來演示和驗證相關接口
remote-viewer程序調用UsbDk接口,用來對USB設備進行發現,訪問和重定向的操作
系統架構總覽
UsbDk.sys 是一個USB過濾驅動,也是一個USB設備驅動。
安裝的時候,它被注冊為一個USB過濾驅動,當有USB設備或者USB Hubs設備被系統發現的時候,系統會調用它。在調用的時候,UsbDk.sys會檢查底層設備的標識並單獨為USB Hubs 創建過濾示例
作為一個USB Hub的過濾驅動,UsbDk.sys 接收來自USB設備棧上層設備的所有請求,包括PNP管理器所發送的枚舉請求(IRP_MJ_PNP/IRP_MN_QUERY_DEVICE_RELATIONS)。
等USB hub驅動完成對PNP管理器枚舉請求的處理,UsbDk.sys會掃描返回的子設備列表,假設有設備被標記為重定向(根據現有的配置)它會為這些設備生產過濾實例
因此,所有PNP管理器請求都將通過UsbDk.sys回調,后者根據需要會修改設備ID屬性以使PNP管理器識別該設備為通用USB設備。
除此之外,UsbDk.sys 標記下層設備對象為 raw PDO,這樣系統會分為這些設備對象分配驅動(創建他們的驅動,也就是UsbDk.sys)作為設備驅動
在此階段,所有對此vendor id的特定設備請求都將被轉發到UsbDk.sys,UsbDk.sys會根據需求修改或者傳遞相關設備的請求
UsbDkHelper.dll提供了一個單獨的API,用來把指定USB設備從USB設備棧中分類,而不需要獲取對設備的實際訪問。(隱藏API)
這個API可能對一些安全程序很有用,比如根據安全策略阻止對USB設備的訪問,防止Windows顯示僅由UsbDk管理的設備的“發現新硬件”彈窗。當UsbDk.sys在枚舉階段發現要隱藏的設備標識,它會在處理(IRP_MJ_PNP/IRP_MN_QUERY_DEVICE_RELATIONS)的時候從USB bus driver返回的設備列表中擦除相關設備,這有效的把設備從PNP管理器和系統的驅動棧中隱藏了起來。
UsbDk安裝后的設備棧結構
—————————————————————
QUERY_DEVICE_RELATIONS 請求流程圖
—————————————————————
設備獲取訪問流程圖
—————————————————————
**重定向后 QUERY_DEVICE_RELATIONS 請求流程圖 **
—————————————————————
重定向生效后的設備棧架構
—————————————————————