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子目錄中包含的資訊為該硬體的屬性和所需驅動等。
成功安裝好驅動之後該目錄有以下幾個欄位
表1
Capabilities |
0x00000014 |
REG_DWORD |
Class |
MEDIA |
REG_SZ |
ClassGUID |
(INF檔案中定義) |
REG_SZ |
CompatibleIDs |
USB/Class_ff&SubClass_00&Port_00 |
REG_MULTI_SZ |
ConfigFlags |
0x00000000 |
REG_DWORD |
DeviceDesc |
MyDriverDesc |
REG_SZ |
Driver |
{GUID}/0042 |
REG_SZ |
HardwareID |
USB/Vid_aaaa&Pid_bbbb&Rev_0100 |
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,
該圖中的主要Category在目錄中均有相應的GUID
如{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}代表了BDA Source Filters目錄,下面列舉了一系列類似硬體ID的資訊,當插入硬體得到硬體ID後,匹配到登錄檔中的相應項,則啟用該專案下的Filter。如上圖中的{51D771C7-C589-4b61-AD46-8C8047987A18}代表的是一個BdaCaptureFilter,Device Parameters中列舉了一些引數,都是在inf中定義的。啟用之後就可以在程式中使用BdaCaptureFilter了。