注册表是一个数据库,其结构类似于磁盘卷的结构。注册表6个根键中其实有3个根键是REG_LINK类型的符号链接。
HKEY_CURRENT_USER,包含当前本地登陆用户的参数和软件配置有关的数据,文件位于\Document and Setting\用户名\Ntuser.dat中。这是一个链接,指向HKEY_USERS下该用户的子键。
HKEY_USERS,为系统中每个加载的用户轮廓和用户类注册数据库包含了一个子键。
HKEY_CLASSES_ROOT,包含了两种类型的信息:文件扩展名关联和COM类注册信息。
HKEY_LOCAL_MACHINE,包含了所有系统全局范围的配置子键。
HKEY_CURRENT_CONFIG,是一个链接,指向HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current下的当前硬件轮廓。
HKEY_PERFORMANCE_DATA,此键只能通过编程的方式,利用注册表函数才能访问,查询该键下面的值可以获得性能计数器信息。
在磁盘上,注册表并不是简单的一个大文件,而是一组称为储巢(hive)的单独文件,每个储巢包含了一棵注册表树。
配置管理器从逻辑上将一个储巢分成一块称为块(block)的分配单元,块的大小为4096字节,储巢大小总是以块的粒度来增长,储巢的第一个块是基本块(base block),基本块包含了有关该储巢的全局信息,包括特征签字regf、更新的序列号、时间戳(最后一次写操作的时间)、格式版本号、校验和,以及储巢文件的内部文件名,如\Device\HarddiskVolume1\WINDOWS\SYSTEM32\CONFIG\SAM。
储巢的基本单位是巢室(cell),巢室的类型有键巢室、值巢室、子键列表巢室、值列表巢室和安全描述符巢室。这些巢室被组织到称为巢箱(bin)的分配单元中。巢室和巢箱都有自己的头部信息。
储巢写入的可靠性:每个非易失性储巢都有一个关联的日志储巢,每当新增或修改储巢内容时,先把这些脏储巢扇区从内存写入到日志文件中,然后更新该储巢基本块中的一个序列号,再将脏扇区更新到储巢文件中,结束最后会更新该基本块中的另一个序列号。所以如果写入过程中系统崩溃,则在系统引导时,配置管理器会发现该储巢基本块中的两个序列号不一致,可以通过日志文件来进行恢复操作。
Windows服务:Advapi32.dll中的CreateService函数用来注册一个服务程序,此函数会发送消息给服务控制管理器(SCM,service control manager),SCM在HKLM\SYSTEM\CurrentControlSet\Service下创建一个注册表键,包含了可执行映像文件路径,以及一些参数配置选项。