驱动安装过程中对注册表的改动

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

你可能感兴趣的:(注册表)