驱动安装过程中对注册表的改动
假设硬件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了。