注册表自举
来源:互联网 发布:java 数据字典缓存 编辑:程序博客网 时间:2024/06/10 08:32
什么是注册表自举?它在系统中的作用是什么?
n
n
n
n
注册表自举是设备驱动加载中的一部分。在系统启动时,初始化设备管理器完毕后,设备管理器将进入设备驱动加载阶段,在这个阶段的早期将进行注册表自举,这个过程在注册表中不断寻找新的设备驱动(未加载,但是需要被加载的设备驱动)加载。注册表自举是可以重入的,通过软件函数调用可以重新进行注册表自举。
下面以一个例子来分析注册表自举的具体过程:
[HKEY_LOCAL_MACHINE\Drivers]
"RootKey"="Drivers\\BuiltIn"
"Dll"="RegEnum.dll“
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]
"Dll"="RegEnum.dll"
[HKLM\Drivers\ BuiltIn \PCI]
"Dll"="PCIbus.dll"
"Order"=dword:4
"Flags"=dword:1
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Virtual]]
"Order"=dword:0
"Flags"=dword:0
"Dll"="RegEnum.dll"
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Virtual \NDIS]
"Dll"="NDIS.dll"
"Order"=dword:1
"Prefix"="NDS"
1.在Device.exe进入注册表自举阶段,检查HKLM\Drivers\RootKey指向的子键。在这个例子中,RootKey的值被设置成Drivers\\BuiltIn,一般默认为Drivers。
2.在HKEY_LOCAL_MACHINE\Drivers\BuiltIn子键中检查DLL项的值,这里被设置成RegEnum.dll,也就是注册表自举模块,然后加载这个DLL。
3.将HKEY_LOCAL_MACHINE\Drivers\BuiltIn作为参数传递给RegEnum的Init函数。注意,Init函数不是一个流式接口,RegEnum只检查键下的一级子键中有无DLL需要加载,至于二级以下的子键,则必须递归调用RegEnum。
4.Init函数在HKLM\Drivers\RootKey键下基于“Order”值的顺序进行检查。逐个检查每个入口加载,为它们初始化驱动程序。在此,HKLM\Drivers\RootKey下有两个子键:[HKLM\Drivers\BuiltIn\PCI]和[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Virtual],其中,[HKLM\Drivers\BuiltIn\PCI]的Order的值为4,而[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Virtual]]的Order值为0,因此RegEnum将优先检查[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Virtual]。
5.RegEnum进入[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Virtual]子键进行检查,发现此子键下的DLL项值为RegEnum.dll,则说明要递归使用RegEnum检查其下的子键。这里为[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Virtual\NDIS],其Order项值为1,并且没有其他子键与其竞争加载顺序,所以它将被[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Virtual]下的RegEnum.dll加载。[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Virtual \NDIS]下的DLL项值为NDIS.dll,因此NDIS驱动被加载。
6.完成[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Virtual]下一级子键的检查后,[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下的RegEnum.dll将检查[HKLM\Drivers\ BuiltIn \PCI]子键下的DLL,这里为PCIbus.dll,因此PCI驱动被加载。
通过以上步骤这个例子中的注册表自举完成。
在注册表自举的过程中,子键有表1中所示的各种形式:
表1
子
类
描
Order
DWORD
最小的Order值将优先被加载
Dll
SZCHAR
定义了要让注册表自举程序加载的驱动的DLL名,这个名称也将被写入ActiveDevice。只有DLL项是必须被设置的,如果Order项没有被设置,那么该驱动将在所有设置了Order项的驱动被加载后加载
Index
DWORD
同类设备驱动的实例被加载时可以通过不同的索引号来区分。如COM0:COM1:,索引的取值范围从0到9,如果没有指定索引值,那么系统将会自动指定一个
Flags
DWORD
描述注册表自举的默认操作。Flags的值是一系列位,他们将描述ActivateDevice的行为。如果不需要这个项的话,可以将其设置为0。位3~23为保留位,必须设置成0,注册表自举时可以使用位23~31来设置
表2是对Flag各个位功能的描述:
表2
Flag
值
功能描述
DEVFLAGS_NONE
0x00000000
没有任何功能定义
DEVFLAGS_UNLOAD
0x00000001
在调用驱动程序XXX_Init入口后,卸载驱动程序
DEVFLAGS_LOADLIBRARY
0x00000002
使用LoadLibrary函数来加载驱动,而不是LoadDriver
DEVFLAGS_NOLOAD
0x00000004
不加载DLL
- WINCE 注册表自举
- 注册表自举
- 注册表自举
- WINCE 注册表自举
- 自举
- 自举
- 自举
- 自举电路、自举电容
- BOOTP 自举协议
- 自举(bootstrap)
- 编译器自举
- 自举就是正反馈
- op自举 正反馈
- bootstrapping 自举
- 编译器之自举
- 编译器自举笔记
- 编译器自举和移植
- gcc 自举bootstrap编译
- Oracle EBS Login Page Personalization
- KVM存储池与存储卷,使用virt-install创建虚拟机
- JS截取字符串
- android Fragments详解二:创建Fragment
- SqlServer嵌套事务机制
- 注册表自举
- 在源码下使用proguard混淆代码
- 链表问题及解题思路
- Custom pushpin HTML in bingMap v7.0
- JSP Page-encoding specified in XML prolog (UTF-8) is different from that specified in page directive
- socket通信
- [C#]log4net写SQLServer数据库日志的配置方法-.NET教程,C#语言
- C#线程委托里带参数
- 自增(++)和自减(--)操作符