WINCE 注册表自举

来源:互联网 发布:xy烈咬陆鲨mega数据 编辑:程序博客网 时间:2024/06/10 06:05

 

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

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

2HKEY_LOCAL_MACHINE/Drivers/BuiltIn子键中检查DLL项的值,这里被设置成RegEnum.dll,也就是注册表自举模块,然后加载这个DLL

3.将HKEY_LOCAL_MACHINE/Drivers/BuiltIn作为参数传递给RegEnumInit函数。注意,Init函数不是一个流式接口,RegEnum只检查键下的一级子键中有无DLL需要加载,至于二级以下的子键,则必须递归调用RegEnum

4Init函数在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]

5RegEnum进入[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驱动被加载。

通过以上步骤这个例子中的注册表自举完成。

在注册表自举的过程中,子键有表9-2中所示的各种形式:

9-2                                                                子键的形式

   

   

   

Order

DWORD

最小的Order值将优先被加载

Dll

SZCHAR

定义了要让注册表自举程序加载的驱动的DLL名,这个名称也将被写入ActiveDevice。只有DLL项是必须被设置的,如果Order项没有被设置,那么该驱动将在所有设置了Order项的驱动被加载后加载

Index

DWORD

同类设备驱动的实例被加载时可以通过不同的索引号来区分。如COM0:COM1:,索引的取值范围从09,如果没有指定索引值,那么系统将会自动指定一个

Flags

DWORD

描述注册表自举的默认操作。Flags的值是一系列位,他们将描述ActivateDevice的行为。如果不需要这个项的话,可以将其设置为0。位323为保留位,必须设置成0,注册表自举时可以使用位2331来设置

 

9-3是对Flag各个位功能的描述:          

9-3                                                            Flag各个位功能

Flag

功能描述

DEVFLAGS_NONE

0x00000000

没有任何功能定义

DEVFLAGS_UNLOAD

0x00000001

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

DEVFLAGS_LOADLIBRARY

0x00000002

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

DEVFLAGS_NOLOAD

0x00000004

不加载DLL