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
- 如果它不能執行這樣的匹配,它會要求用戶瀏覽一個驅動程序,而不是使用。
用於編寫驅動程序我的建議是:
- 不要執行HID(人機接口設備)設備開始的,因爲你可能會導致Windows嘗試應用您的自定義驅動程序驅動程序對於已安裝的鼠標或鍵盤,無法訪問它們。
- 驅動程序不加載到您的實際機器:
- 使用虛擬機並安裝您的驅動存在。建立一個內核調試器爲您的虛擬機:http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
- 您也可以嘗試使用物理板如OSR的USB-FX2的學習套件
用於linux平臺的嘲笑usb設備http://stackoverflow.com/a/43917529/6180077 – 2017-05-11 13:58:57