2011-02-16 1630 views
16

我是一個學習如何編寫USB設備的WDM設備驅動程序的新手,並發現可用的材料都很難理解(DDK在線文檔是最難讀的之一,而且Oney的WDM設備驅動程序書不是更好)。創建一個虛擬USB設備

所以,我有一個簡單的問題。如果我想創建一個虛擬USB設備(例如,虛擬USB鼠標,它看起來像一個連接到USB端口的真正的USB鼠標)以進行測試/學習,我該從哪裏開始。

到目前爲止,我所瞭解的是HIDClass驅動程序(hidclass.sys)有一個用於USB總線(hidusb.sys)的小型驅動程序,用於執行枚舉連接的USB硬件。因此,如果我想劫持硬件枚舉過程並創建自己的虛擬硬件,是否應該在某處包含過濾器驅動程序來攔截與硬件枚舉過程相關的一些IRP?

對不起,如果上述沒有意義,因爲我仍然處於學習階段,這實際上是我認爲可以幫助我學習更好地編寫USB設備驅動程序的練習之一。

+0

用於linux平臺的嘲笑usb設備http://stackoverflow.com/a/43917529/6180077 – 2017-05-11 13:58:57

回答

16

Windows使用即插即用架構:插入USB設備,Windows註冊設備已連接。它向設備發送低級USB請求,然後根據設備的響應決定要加載的驅動程序。該驅動程序以編譯的xxx.sys文件的形式出現並加載到內核空間中。 Windows根據設備驅動程序附帶的* .inf文件決定加載哪個xxx.sys。

這些文件有這樣幾個部分:

[Manufacturer] 
%Manufacturer% = DeviceInstall 

[DeviceInstall] 
"some usb dev"=OTHER_SECTION_DEV, USB\Vid_XXXX&Pid_yyyy 

# This is where windows learns to match this information 
# to your device, using the product id (Pid) and the 
# vendor id (Vid) that Windows gets back during the 
# low level USB DeviceDescriptor request 

[OTHER_SECTION_DEV] 
CopyFiles = xxx.sys, 10,system32\drivers 

(對什麼是在inf文件更詳細的描述可以在http://www.osronline.com/ddkx/install/inf-format_2k8i.htm發現以上)


詳細看看USB枚舉過程:

  • 插入USB設備
  • USB總線驅動程序請求(這些指令是通過USB線發送,使用USB記錄儀看到他們):
    • GetDescriptor(設備)
    • GetDescriptor(配置)
    • GetDescriptor(字符串iSerialNumber)用作設備實例ID
    • GetDescriptor(字符串iProduct),在所使用的「新硬件被確定」的彈出窗口
  • 的PNP(即插即用)管理器被通知中加入設備由巴士司機。
  • PnP管理然後請求使用PNP請求,請求設備PVC門總線驅動器:
    • 的DeviceID串,表示USB供應商和產品ID,
    • HardwareIDs串,
    • CompatibleIDs串,表示USB設備的接口類,子類和協議,以及表示具有與計算機相同的compatibleid的所有實例集中的此特定設備的uid的InstanceID字符串。

對於任何連接的USB設備,您可以使用設備管理器這些字符串看:

  • 打開設備管理器(Windows菜單 - > 「設備管理器」,或控制面板 - >「系統「 - >」硬件「 - >」設備管理器「)
  • 然後使用」查看「菜單切換到」設備連接「
  • 打開」ACPI [...]「 - >」PCI總線「 /「PCI Express根聯合體」 - >「USB主機控制器」
  • 展開主機控制器下的任何條目,併爲列出的任何設備右鍵單擊以獲取其屬性,打開「詳細信息」選項卡,然後使用屬性下拉菜單查找「硬件ID」,「兼容IDS」,‘設備實例ID’,‘匹配設備ID’,‘服務’等

例如,我有Device Id = usb\class_08&subclass_06&prot_50 USB存儲設備掛接,並且該字符串可以匹配到.inf在安裝此設備的驅動程序時添加到已知信息列表中的文件。該文件的字符串爲Service = USBSTOR,因此我們知道usbstor.sys用於與此USB大容量存儲設備進行連接。

讓我們繼續進行匹配過程。

  • PnP管理器試圖確定是否設備已經「安裝」:
    • 它在註冊表中搜索匹配「DeviceInstance ID」,看看哪些服務處理與該設備接口的關鍵。具體而言,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB

搜索此有關密鑰盤,你可以看到:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0781&Pid_5406\0775555ACA54ADE3] 
"Service"="USBSTOR" 
  • PnP管理器,然後加載基於之間的匹配相關的驅動程序它在PNP中查看的字符串請求設備,以及.inf數據庫中的數據:
    • inf數據庫位置是c:\ WI NDOWS \ INF \這裏位於ç
    • 驅動程序:\ WINDOWS \ SYSTEM32 \ DRIVERS
  • 如果它不能執行這樣的匹配,它會要求用戶瀏覽一個驅動程序,而不是使用。

用於編寫驅動程序我的建議是:

  1. 不要執行HID(人機接口設備)設備開始的,因爲你可能會導致Windows嘗試應用您的自定義驅動程序驅動程序對於已安裝的鼠標或鍵盤,無法訪問它們。
  2. 驅動程序不加載到您的實際機器:
    1. 使用虛擬機並安裝您的驅動存在。建立一個內核調試器爲您的虛擬機:http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
    2. 您也可以嘗試使用物理板如OSR的USB-FX2的學習套件
1

提供您自己的總線類型和枚舉器是否更有意義?

+0

如果爲了學習的目的,我想創建一個虛擬USB設備? – JavaMan 2011-02-16 14:36:59

+1

我的觀點是,爲了學習的目的,最好從不涉及混淆操作系統的東西開始。如果你真的想要引入一個虛擬USB設備,那麼提供你自己的USB主機適配器是一種方法。 – 2011-02-16 15:29:58

2

您可以使用USB/IP項目效仿,你想要的任何設備。在我的博客我演示瞭如何使用USB/IP項目模擬USB鼠標設備在python: http://breaking-the-system.blogspot.com/2014/08/emulating-usb-devices-in-python-with-no.html

它不會幫助您瞭解如何創建虛擬USB設備(該過程在USB做過/ IP驅動程序,您可以閱讀代碼),但它會創建虛擬USB HID設備,您可以使用發送給USB驅動程序的HID參數進行播放。