注册表自举

来源:互联网 发布:java 数据字典缓存 编辑:程序博客网 时间:2024/06/10 08:32
注册表自举

什么是注册表自举?它在系统中的作用是什么?

n注册表自举是由设备管理器(Device.exe)在系统启动时加载的。

n注册表自举时,通过读取注册表来寻找系统中的新设备。设置新设备的注册表信息应当是在安装驱动程序时,即InstallDriver入口中设置到注册表中去的。

n实现为REGENUM.DLL动态链接库。

n实现将代码存放在WINCE400\public\common\oak\DRIVERS\REGENUM目录下。

注册表自举是设备驱动加载中的一部分。在系统启动时,初始化设备管理器完毕后,设备管理器将进入设备驱动加载阶段,在这个阶段的早期将进行注册表自举,这个过程在注册表中不断寻找新的设备驱动(未加载,但是需要被加载的设备驱动)加载。注册表自举是可以重入的,通过软件函数调用可以重新进行注册表自举。

下面以一个例子来分析注册表自举的具体过程:

[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各个位功能的描述:

表2Flag各个位功能

Flag

功能描述

DEVFLAGS_NONE

0x00000000

没有任何功能定义

DEVFLAGS_UNLOAD

0x00000001

在调用驱动程序XXX_Init入口后,卸载驱动程序

DEVFLAGS_LOADLIBRARY

0x00000002

使用LoadLibrary函数来加载驱动,而不是LoadDriver

DEVFLAGS_NOLOAD

0x00000004

不加载DLL

原创粉丝点击