1. 程式人生 > >usb 驅動安裝過程中對登錄檔的改動

usb 驅動安裝過程中對登錄檔的改動

假設硬體ID為 USB/VID_aaaa&PID_bbbb/PRODUCTNAME

系統會在登錄檔HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Enum 下為每個欄位生成一個目錄,比如ID中的第一個欄位為USB,那麼Enum下會生成USB子目錄,第二個欄位為VID_aaaa&PID_bbbb,則在USB目錄下生成VID_aaaa&PID_bbbb子目錄,最後一個欄位為PRODUCTNAME,則在VID_aaaa&PID_bbbb目錄下生成PRODUCTNAME子目錄。PRODUCTNAME子目錄中包含的資訊為該硬體的屬性和所需驅動等。

clip_image002

成功安裝好驅動之後該目錄有以下幾個欄位

表1

Capabilities

0x00000014

REG_DWORD

Class

MEDIA

REG_SZ

ClassGUID

(INF檔案中定義)

REG_SZ

CompatibleIDs

USB/Class_ff&SubClass_00&Port_00
USB/Class_ff&SubClass_00
USB/Class_ff

REG_MULTI_SZ

ConfigFlags

0x00000000

REG_DWORD

DeviceDesc

MyDriverDesc

REG_SZ

Driver

{GUID}/0042

REG_SZ

HardwareID

USB/Vid_aaaa&Pid_bbbb&Rev_0100
USB/Vid_aaaa&Pid_bbbb

REG_MULTI_SZ

LocationInformation

PIXELA-SHANGHAI

REG_SZ

Mfg

MyCompany

REG_SZ

Services

DigitalTV

REG_SZ

UINumber

0x00000000

REG_DWORD

HardwareID 欄位,CompatibleIDs欄位,DeviceDesc欄位,LocationInformation欄位,Capabilities欄位和UINumber欄位是插入硬體後從硬體中獲取,一般是在firmware中配置。要想硬體被正確認出,你需要手動新增Class,ClassGUID,ConfigFlags,Driver,Mfg和Services欄位,其中重要的兩個欄位為Driver欄位和Services欄位。Driver欄位包含了一個字串,指向登錄檔中的另一個目錄

HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / Class / {GUID} / 0042

而Services欄位則指向目錄

HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / DigitalTV

HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / Class / {GUID} / 0042目錄中包含了驅動檔案的各種資訊,正確安裝驅動後在該目錄下有以下欄位

表2

DevLoader

*ntkern

REG_SZ

DriverData

1-4-2008

REG_SZ

DriverDataData

0000b4bf644ec801

REG_BINARY

DriverDesc

MyDriverDesc

REG_SZ

DriverVersion

6.0.0.0

REG_SZ

InfPath

Myinf.inf

REG_SZ

InfSection

DigitalTV.Dev

REG_SZ

InfSectionExt

.NT

REG_SZ

MachingDeviceId

usb/vid_aaaa&pid_bbbb

REG_SZ

NTMPDriver

Mydriver.sys

REG_SZ

ProviderName

MyCompany

REG_SZ

此表中大部分欄位都是inf中定義的,MachingDeviceID指定與該驅動配套的裝置id,NTMPDriver指定驅動檔名。

HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / DigitalTV目錄指定了該驅動對應的windows 系統服務,正確安裝驅動後有以下欄位:

表3

DisplayName

MyDriverName

REG_SZ

ErrorControl

1

REG_DWORD

Group

Base

REG_SZ

ImagePath

System32/Drivers/mydriver.sys

REG_EXPAND_SZ

Start

3

REG_DWORD

Tag

0x15

REG_DWORD

Type

1

REG_DWORD

此表中大部分也是在inf中定義

我們的硬體有兩個ID

USB/VID_aaaa&PID_bbbb/PRODUCTNAME和

USB/VID_aaaa&PID_bbbb/PRODUCTNAME2

有時候沒有燒EEPROOM的板子還可能是這樣的ID

USB/VID_aaaa&PID_cccc/ 5&111db94e&0&4

以三個ID為例,則HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Enum / USB目錄下有VID_aaaa&PID_bbbb和VID_aaaa&PID_cccc兩個目錄,VID_aaaa&PID_bbbb目錄下有

PRODUCTNAME 和PRODUCTNAME2兩個目錄,每個目錄有類似表1的一系列欄位,VID_aaaa&PID_cccc下有5&111db94e&0&4目錄,5&111db94e&0&4目錄下也有表1中的欄位。每張表都指定了一個Driver目錄和一個Services目錄。Services目錄一般不會變,但Driver目錄中的MatchingDeviceId欄位和硬體id相關聯,所以我們至少需要兩項Driver目錄項,比如

HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / Class / {GUID} / 0042

HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / Class / {GUID} / 0044

0042中的MatchingDeviceId為

USB/VID_aaaa&PID_bbbb,

而0044中的MatchingDeviceId為

USB/VID_aaaa&PID_cccc。

有時候還要配置Interface(我們的驅動中必須配置,否則DirectShow不能使用SourceFilter),則需要對HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / DeviceClasses下的一些目錄進行操作。

HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / DeviceClasses目錄中列出了許多Category的GUID,

clip_image004

該圖中的主要Category在目錄中均有相應的GUID

clip_image006

clip_image008

如{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}代表了BDA Source Filters目錄,下面列舉了一系列類似硬體ID的資訊,當插入硬體得到硬體ID後,匹配到登錄檔中的相應項,則啟用該專案下的Filter。如上圖中的{51D771C7-C589-4b61-AD46-8C8047987A18}代表的是一個BdaCaptureFilter,Device Parameters中列舉了一些引數,都是在inf中定義的。啟用之後就可以在程式中使用BdaCaptureFilter了。