什么是注册表自举?它在系统中的作用是什么? 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
表2是对Flag各个位功能的描述: 表2
|
注册表自举
注册表自举