另外INI其实是依据某种定义规范的文本文件,编辑过程极易出错并由此导致系统故障,为了克服这些问题,在Windows 95及其后的版本中,Window系统都无一例外的采用了注册表机制,并将原来由多个INI组成的软硬件配置信息统一到了一起,形成一个数据库,那就是注册表。注册表是一个保存系统、软件设置数据的数据库,而“注册表编辑器”只是对于整个系统的读取/修改工具。
    既然注册表是一个数据库,那么这个数据库文件在那里呢?其实,难怪不少刚接触电脑的朋友误以为regedit.exe就是注册表,这是由于对注册表数据库的组成不清楚而造成的。Windows 98注册表的数据文件主要由System.dat和User.dat这两个文件组成,并保存在C:\Windows目录下,其中System.dat存储的是系统和硬件相关的配置,而User.dat则保存软件配置和用户配置,Windows 2000/XP注册表的数据文件主要存储在%Windir%\System32\config目录中的Default,Sam,Security,System,software和Userdiff等6个文件中,除此之外,还有部分数据保存在用户的配置文件目录中,比如Window 2000/XP中的Administrator的部分注册表数据就保存在C:\Documents and Settings\Administrator目录的Ntuser.dat文件中,所以只需要Administrator登陆系统后其目录下的NTUSER.DAT就不能被删除,因为它已经被加载到注册表中了。
     注册表分支和其相对应的数据库文件。
     HKEY_LOCAL_MACHINE\SYSTEM这个分支相对应的文件就是%Windir%\System32\config目录中的System。
     HKEY_LOCAL_MACHINE\SOFTWARE这个分支相对应的文件就是%Windir%\System32\config目录中的software。
     这2个分支和封装的关系比较密切。HKEY_LOCAL_MACHINE\SYSTEM是记录计算机的硬件信息,每个驱动安装后的信息都会被系统记录在这个分支中的。做封装时所预先加载硬盘控制器驱动的注册表信息也是保存在这个分支的。HKEY_LOCAL_MACHINE\SOFTWARE这个分支保存的是软件信息,包括windows自身的一些信息。明白这个对应关系,可以应用于不用重新封装而再次直接修改定制已经生成的映像。
    驱动信息是记录在HKEY_LOCAL_MACHINE\SYSTEM这个分支中,具体的关系又是如何的呢?自己没找着微软官方的资料,以下说明全是自己猜测出来的。仅仅代表个人观点!
    HKEY_LOCAL_MACHINE\System 注册表分支包含用于 Windows XP 启动过程的三个控件组: ControlSet001、ControlSet002、CurrentControlSet。 每个注册表项都有相同的子项结构。 Windows XP 提供 ControlSet001 的副本,名为 CurrentControlSet,这样,应用程序就不必考虑在启动过程中用几号控件组。   “Current”数据项目表示 Windows XP 在这次启动过程中使用的控件组。
     “Default”数据项目表示 Windows XP 在下次启动时将使用的控件组,它与这次启动使用的控件组相同。
     “LastKnownGood ”数据项目表示您在启动过程中选择“最近一次的正确配置”时 Windows XP 将使用的控件组。
     “Failed”数据项表示 Windows XP 在其中保存失败启动产生的数据的控件组。 此控件组在用户第一次调用“最近一次的正确配置”选项之前并不实际存在。 操作系统每成功启动一次,它都将 CurrentControlSet 和 ControlSet001 中的数据复制到 ControlSet002 中。 这样,在对配置进行更改时,所作的更改就会写入 CurrentControlSet 和 ControlSet001 中。 如果下次启动时出现问题,选择“最近一次的正确配置”将命令 Windows XP 使用 ControlSet002 中的数据,该数据代表系统在上次正确启动时的状态。 请注意,Windows XP 直到用户成功登录之后才将启动视为“正确”。
    首先说这个HKLM\SYSTEM\CurrentControlSet\Enum这个分支。
注册树包含关于系统中设备的信息。PNP管理器为每个设备创建了一个子键, 子键的名字形式如同
HKLM\SYSTEM\CurrentControlSet\Enum\enumerator\deviceID . 在每个这些键下是一个子键,代表了系统中存在的设备实例。这个子键,众所周知是设备的硬件键(或,设备键) ,有的信息如设备描述,硬件ID号,兼容ID号,资源需求等等。
Enum树是被操作系统保留自己用的,而且它的规划是变化的主题。驱动和用户模式安装
组件使用系统支持的函数,如同IoGetDeviceProperty和SetupDiGetDeviceRegistryProperty
,去获得这个树的信息。驱动和安装应用程序不能直接访问Enum树。当你调试驱动的时候,你可以使用注册表编辑器来直接看Enum树。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum这个分支中是保存着机器设备和信息。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI为电源管理。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI_HAL硬件抽像层。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY显示设备(显示器)。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID人体工学输入设备。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE IDE设备
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI  挂在PCI总线上的设备包括(显卡,声卡……)
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCIIDE IDE控制器
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root 虚拟设备和物理的非即插即用设备。
    一个硬盘控制器驱动如果被正确安装到机器上,那在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI上就可以找到其相关的注册表信息。这个信息是系统自动处理生成的。所以这边也可以作为,清除多余的硬盘控制器驱动驱动的判断条件之一。在这边能找着相应的信息的SRS驱动就应该被保留的,没找着的可以被删除。那些没有被使用到的硬盘控制器驱动驱动,系统也会将相对应的信息记录在:               HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root 这个分支中。因为系统将其识别为非即插即用设备啦。但如果这里多余的SRS驱动如果没被清除,系统在启动时还是会将其加载的。这个会增加启动时间,占用内存空间并且有可能引发系统的不稳定。
   接着说HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services这个分支。这个是保存驱动服务加载和其它服务的。
   HKLM\SYSTEM\CurrentControlSet\Services这个注册树保存了关于系统中每个服务的信息。
   每个驱动有一个键形式如同HKLM\SYSTEM\CurrentControlSet\Services\
DriverName.
PnP管理器调用驱动的DriverEntry
的例程时,会将这个地址传送到驱动的RegistryPath参数
中去。(终于知道这个参数的来由了,哈哈) 一个驱动可以在Services
树下的DriverName键
中存储驱动定义的全局数据。在驱动初始化时,信息存储在这个键下是允许的。
下面的键和值入口是特别感兴趣的:
ImagePath是一个值入口,它指定了驱动文件的修饰全路径。安装时通过使用驱动的Inf文
件中的ServiceBinary入口创建了这个值。这个入口在service-install-section中,参考驱动的INF中的AddService子节。
directive , 对于这个路径一个典型的值是
%windir%\system32\Drivers\DriverName.sys ,而DriverName是驱动的Services键的名字。
Parameters
一个键用于存储驱动指定数据。一些类型的驱动,系统期望去找到指定的值入
口。你可以添加到这个子键中,通过在驱动的INF文件中使用AddReg
入口。
Performance
一个键用于指定可选的监控行为的信息。这个键下的值指定驱动的行动DLL
的名字和那个DLL特定输出接口的名字。你可以通过在驱动的INF文件的AddReg
入口添加的值。
例如:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iaStor]
“Type”=dword:00000001
“Start”=dword:00000000
“ErrorControl”=dword:00000001
“Tag”=dword:00000019
“ImagePath”=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,69,00,61,00,53,00,74,00,6f,00,72,\
  00,2e,00,73,00,79,00,73,00,00,00
“DisplayName”=”Intel RAID Controller”
“Group”=”SCSI Miniport”
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\iaStor\Enum]
“0″=”PCI\\VEN_……”--->使用iaStor这个驱动的设备的硬件ID。
“Count”=dword:00000001--->说明iaStor这个驱动只被一个设备使用。
“NextInstance”=dword:00000001
这是intel的串口硬盘控制器驱动.
其中的”Type”=dword:00000001说明是一个核心设备驱动程序服务.
“Start”=dword:00000000  是引导时就会被NTLDR加载的服务.
“ErrorControl”=dword:00000001就是错误控制的意思.将错误记录到系统日志并提示警告信息,但继续启动过程。
“Tag”=dword:00000019就是指在”SCSI Miniport”组内的加载顺序.
“ImagePath”就要加载的驱动文件路径.
“DisplayName”=”Intel RAID Controller”显示的名称.
“Group”=”SCSI Miniport”指定驱动程序或者服务隶属的组。此项设定允许驱动程序或者服务同步启动(比入:文件系统驱动程序)注册表子键 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder 中的 List 项指定了组项启动顺序。
HKLM\SYSTEM\CurrentControlSet\Control
注册树包括了控制系统启动和一些方面的驱配置。下面的子键是特别感兴趣的:
HKLM\SYSTEM\CurrentControlSet\Control\Class
包含关于系统中设备安装类的信息。每个类有一个子键, 名字使用安装类的GUID。每个子键包含了关于一个安装类的信息,如同class installer (假设这里有一个), 注册类上层过滤驱动,注册类下层过滤安装驱动等等。
每个类子键包含其他的子键如大家知道的软键(或驱动键),对于类安装的系统的每个设备实
例。每个这样的软键使用设备实例ID号来命名,是基于十进制的,四位数字的顺序值。
CoDeviceInstallers
包含关于类指定co-installers的信息,注册在系统中的co-installers 。
DeviceClasses
包含关于系统中设备接口的信息。There is a subkey for each device interface
class and entries under those subkeys for each instance of an interface that is registered for the
device interface class 。