假设硬件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了。