驱动安装过程中对注册表的改动 _driverpackages_xcq1109的博客-程序员宅基地

技术标签: filter  system  interface  windows  class  parameters  

http://www.cnblogs.com/gussing/archive/2008/10/24/1319098.html

 

 

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xcq1109/article/details/4229139

智能推荐

泛型学习-程序员宅基地

泛型学习最近做项目用到了泛型,对泛型又重新了学习,此处记录一下, 以便以后查看,同时也希望能帮助到各位朋友。泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性。泛型为.NET框架引入了类型参数(type parameters)的概念。类型参数使得设计类和方法时,不必确定一个或多个具体参数,其的具体参数可延迟到客户代码中声明、实现。这意味着使用泛型..._泛型学习

【HeadFirst 设计模式学习笔记】11 状态模式-程序员宅基地

作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.我们这次的话题是要实现一个糖果机,这个糖果机中如下的一些状态以指导糖果机的转移: 我们根据这个状态机写了一个有if..else为主体的状态机程序,对每一个状态的转入转出做了实现: public class GumballMachine { final static ...

.Net FW上线报错:The OwinStartup attribute discovered in assembly ‘AppName‘._SCscHero的博客-程序员宅基地

阅文时长| 2.32分钟字数统计| 3726.4字符 主要内容| 1、引言&背景2、解决方案3、声明与参考资料 『.Net FW上线报错:The OwinStartup attribute discovered in assembly 'AppName'.』 编写人 | SCscHero 编写时间 | 2022/2/18 PM8:20 文章类型| 系列完成度 | 已完成 座右铭每一个伟大的事业,都有一个微不足道的开始。 ..

面试官:了解分布式锁?说说ZooKeeper分布式锁的实现原理_为什么说zookeepr是天然的分布式锁-程序员宅基地

今天给小伙伴讲讲ZooKeeper分布式锁的实现原理!有自己看法的也可以在评论区留言探讨,也可以转发关注下我以后会长期分享!什么是Zookeeper?Zookeeper 是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务、配置维护和命名服务等等。分布式锁 简介在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synch..._为什么说zookeepr是天然的分布式锁

nginx使用ssl模块配置HTTPS支持(自签证书)_进入希望生成证书和私钥的目录,这里我们选择nginx.conf所-程序员宅基地

默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,通常这些文件并不在同一个软件包中。通常这个文件名类似libssl-dev。1、生成证书可以通过以下步骤生成一个简单的证书:首先,进入你想创建证书和私钥的目录,例如:cd /usr/local/nginx/_进入希望生成证书和私钥的目录,这里我们选择nginx.conf所

Python实现久坐提醒小助手程序-程序员宅基地

不论是日常的工作还是学习,现代年轻人在电脑屏幕时长数据能让人惊掉下巴,继而引发一系列身体不适的现象。小李也是久坐族中的一员,为了时刻提醒自己起来活动活动,我开发了一款基于PythonGU..._python 久坐提醒

随便推点

【SequoiaDB|巨杉数据库】Undefined 和 Null_sequoiadb null-程序员宅基地

【SequoiaDB|巨杉数据库】Undefined 和 NullUndefined 表示变量不含有值可以通过将变量的值设置为 null 来清空变量示例:cars=null;person=null;相关阅读(https://blog.csdn.net/lolitaAC/article/details/115331309)【SequoiaDB|巨杉数据库】SDB Shell 基本操作【SequoiaDB|巨杉数据库】Javascript语法【SequoiaDB|巨杉数据库】JavaS_sequoiadb null

基于C语言实现的一个小型编译程序_实现一个小型编译程序_biyezuopinvip的博客-程序员宅基地

符号种别编码说明sy__if0保留字 ifsy_then1保留字 thensy_else2保留字 elsesy_while3保留字 whilesy_begin4保留字 beginsy_do5保留字 dosy_end6保留字 enda7赋值语句semicolon8“:”e9布尔表达式jinghao10“#”S11语句L12复合语句tempsy15临时变量EA18B and(即布尔表达式中“B 且”)EO19。_实现一个小型编译程序

(2017多校训练第五场)HDU - 6092 Rikka with Subset 0-1背包_hdu 多校 背包-程序员宅基地

题目链接:点击打开链接题意不再赘述。下面来讲解一下第一个样例是怎么推导出答案的。2 31 1 1 1第一个数字和最后一个数字肯定是1,不需要关注它们。下面来看第二个数字(去掉首尾之后的第一个非零数字),也就是子集和为1的数目只有一个,很容易就知道答案中有一个1。然后再看第二个非零数字,也就是子集和为2的数目只有一个,我们已经知道了答案中有一个1,如果能够求出已知的答案能_hdu 多校 背包

Mybatis一对多自定义映射-程序员宅基地

Mybatis的一对多部门 -> 员工 : 一对多1、POJOpublic class Department { private Integer dId; private String dName; private List<Employee> employeeList; public class Employee { pri..._mybatis一对多自定义

vue-cli4.x打包白屏_vuecli4 打包 baiping_thc1214的博客-程序员宅基地

在路由模式为history的情况下,需要在vue.config.js文件中配置公共路径(publicPath),通常附带着配置输出文件目录(outputDir)和静态资源文件目录名称(assetsDir),相关代码如下: module.exports ={ // '/dist/'表示打包后项目的名称 publicPath: process.env.NODE_ENV === 'production'? '/dist/': '/', // 公共路径(必须有的) outputDir: "_vuecli4 打包 baiping

SpringBoot学习笔记六:ThymeLeaf模板引擎的引入-程序员宅基地

1.模板引擎作用### 2.ThymeLeaf的使用:在SpringBoot框架中引入ThymeLeaf依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thy...