注册表学习.docx
《注册表学习.docx》由会员分享,可在线阅读,更多相关《注册表学习.docx(65页珍藏版)》请在冰豆网上搜索。
注册表学习
第一章.注册表基础知识
1.注册表是什么
Windows的注册表(Registry)实质上是一个庞大的数据库,它存储这下面这些内容:
软、硬件的有关配置和状态信息,应用程序和资源管理器外壳的初始条件、首选项和卸载数据;
计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件的描述、状态和属性;
计算机性能纪录和底层的系统状态信息,以及各类其他数据。
2.与INI文件不同的是:
1.注册表采用了二进制形式登录数据;
2.注册表支持子键,各级子关键字都有自己的“键值”;
3.注册表中的键值项可以包含可执行代码,而不是简单的字串;
4.在同一台计算机上,注册表可以存储多个用户的特性。
3.注册表的结构
在Windows中,注册表由两个文件组成:
System.dat和User.dat,保存在windows所在的文件夹中。
它们是由二进制数据组成。
System.dat包含系统硬件和软件的设置,User.dat保存着与用户有关的信息,例如资源管理器的设置,颜色方案以及网络口令等等。
Windows为我们提供了一个注册表编辑器(Regedit.exe)的工具(图1),它可以用来查看和维护注册表。
HKEY-CLASSES-ROOT 文件扩展名与应用的关联及OLE信息
HKEY-CURRENT-USER 当前登录用户控制面板选项和桌面等的设置,以及映射的网络驱动器
HKEY-LOCAL-MACHINE 计算机硬件与应用程序信息
HKEY-USERS 所有登录用户的信息
HKEY-CURRENT-CONFIG计算机硬件配置信息
HKEY-DYN-DATA 即插即用和系统性能的动态信息
注册表中的键值项数据
注册表通过键和子键来管理各种信息。
但是注册表中的所有信息都是以各种形式的键值项数据保存的。
在注册表编辑器右窗格中显示的都是键值项数据。
这些键值项数据可以分为三种类型:
1.字符串值
在注册表中,字符串值一般用来表示文件的描述和硬件的标识。
通常由字母和数字组成,也可以是汉字,最大长度不能超过255个字符。
在本站中以"a"="***"表示。
REGEDIT4
[HKEY_LOCAL_MACHINE\Software\SuperRabbit\MagicSet]
"@"="SuperRabbitMagicSetForWindows98V2.92"
"a"=dword:
00000001
"b"=hex:
02,05,00,00
……
[HKEY_LOCAL_MACHINE\Software\SCC\QuickViewer]
……
第一行为“REGEDIT4”,必须大写。
第二行为空行。
第三行使用[]括起子键分支,其中HKEY_LOCAL_MACHINE\Software\SuperRabbit\MagicSet就是一个子键分支。
第四、五、六行是该子键下的设置数据。
其中@表示注册表编辑器右窗格中的"默认"键。
注册表显示方式
在Windows系统中,注册表是采用“关键字”及其“键值”来描述登录项及其数据的。
所有的关键字都是以“HKEY”作为前缀开头。
实际上,“关键字”是一个句柄。
这种约定使得系统及应用程序的开发人员,可以在使用注册表中的API函数时把它用于应用程序的开发中。
为此,Windows提供了若干API函数,以便在开发forWindows应用程序时添加、修改、查询和删除注册表的登录项。
在注册表中,关键字可以分为两类:
一类是由系统定义的,一般都称为“预定义关键字”;另一类是由应用程序定义的,由于安装的应用软件不同,其登录项也就不同。
在Windows系统中,打开注册表编辑器,可以看到注册表中的关键字,如图:
在注册表中,“键值项数据”可分为下面三种类型。
二进制(BINARY)
在注册表中,二进制是没有长度限制的,可以是任意个字节的长度。
在注册表编辑器中,二进制数据以十六进制的方式显示出来,如下图中的“CustomColors”的键值就是一个二进制数据,
双击键值名,出现如下图所示的“编辑二进制数值”对话框,我们可以在二进制和十六进制之间进行切换。
DWORD值(DWORD)
DWORD值是一个32位(4个字节,即双字)长度的数值。
在注册表编辑器中,会发现系统以十六进制的方式显示DWORD值,如图:
在编辑DWORD数值时,可以选择用二进制、十进制或是十六进制的方式进行输入,如图:
字符串值(SZ)
在注册表中,字符串值一般用来表示文件的描述、硬件的标识等。
通常它由字母和数字组成。
下图文本输入栏中的内容即为一个键值,它是一种字符串值类型。
通过键值名、键值就可以组成一种键值项数据,这就相当于Win.ini、System.ini文件中小节下的设置行。
其实,使用注册表编辑器将这些键值项数据导出后,其形式与.ini文件中的设置完全一样。
现有注册表数据类型
类型
类型索引
大小
说明
REG_BINARY
3
0~多个字节
可以包含任何数据的二进制对象颜色描述
REG_COLOR_RGB
*
4字节
颜色描述
REG_DWORD
4
4字节
DWORD值
REG_DWORD_BIG_ENDIAN
5
4字节
一个DWORD值的逆序存储形式
REG_DWORD_LITTLE_ENDIAN
4
4字节
DWORD值
REG_EXPAND_SZ
2
0~多个字节
包含环境变量占位符的字符串
REG_FILE_NAME
*
0~多个字节
文件名
REG_FILE_TIME
*
未知
文件时间
REG_FULL_RESOURCE_DESCRIPTOR
9
未知
硬件资源列表
REG_LINK
6
0~多个字节
命名一个符号链接(symboliclink)的Unicode串
REG_MULTI_SZ
7
0~多个字节
以null字符分隔的字符串集合,集合中的最后一个字符串以两个null字符结尾
REG_NONE
0
未知
REG_NONE类型的对象无须分类,它与REG_UNKNOWN类型不同
REG_RESOURCE_LIST
8
未知
设备使用的资源列表
REG_RESOURCE_REQUIREMENTS_
LIST
10
未知
驱动程序要求的资源列表
REG_SZ
1
0~多个字节
以一个null字符线的字符串
REG_UNKNOWN
(未定义)
未知
因为数据类型索引无效而无法确定的对象类型
1
HKEY_CLASSES_ROOT根键.htm
HKEY_CLASSES_ROOT根键
14K
2
HKEY_CURRENT_CONFIG根键.htm
HKEY_CURRENT_CONFIG根键
2K
3
HKEY_CURRENT_USER根键.htm
HKEY_CURRENT_USER根键
1K
4
HKEY_LOCAL_MACHINE根键.htm
HKEY_LOCAL_MACHINE根键
26K
5
HKEY_USER根键.htm
HKEY_USER根键
25K
6
编辑注册表的主键与键值.htm
编辑注册表的主键与键值
5K
7
导出与引入注册表.htm
导出与引入注册表
7K
8
注册表的查找与修改.htm
注册表的查找与修改
4K
9
注册表数据结构.htm
注册表数据结构
13K
10
注册表详解.htm
注册表详解
6K
11
注册表由来.htm
注册表由来
3K
一.注册表是保存程序所需要的信息。
1.记录安装信息;2.设置硬件;3.定制Windows以及应用软件
二.注册表逻辑结构体系
注册表的六大根键:
HKEY_CLASS_ROOT
记录Windows操作系统中所有数据文件的格式和关联信息,主要记录不同文件的文件名后缀和与之对应的应用程序。
其下子键可分为两类:
一类是已经注册的各类文件的扩展名,这类子键前面都有一个“.”;另一类是各类文件类型有关信息。
HKEY_CURRENT_USER
此根键包含了当前登录用户的用户配置文件信息。
这些信息保证不同的用户登录计算机时,使用自己的个性化设置,例如自己定义的墙纸、自己的收件箱、自己的安全访问权限等。
HKEY_LOCAL_MACHINE
此根键包含了当前计算机的配置数据,包括所安装的硬件以及软件的设置。
这些信息是为所有的用户登录系统服务的。
它是整个注册表中最庞大也是最重要的根键!
HKEY_USERS根键
HKEY_USERS根键包括默认用户的信息(Default子键)和所有以前登录用户的信息。
HKEY_CURRENT_CONFIG
此根键实际上是HKDY_LOCAL_MACHINE中的一部分,其中存放的是计算机当前设置,如显示器、打印机等外设的设置信息等。
它的子键与HKDY_LOCAL_MACHINE\Config\0001分支下的数据完全一样。
HKEY_DYN_DATA根键
HKEY_DYN_DATA根键中保存每次系统启动时,创建的系统配置和当前性能信息。
这个根键只存在于Windows9x中。
HKEY_PERFORMANCE_DATA根键
在WindowsNT/2000/XP注册表中虽然没有HKEY_DYN_DATA键,但是它却隐藏了一个名为“HKEY_PERFORMANCE_DATA”的键。
所有系统中的动态信息都是存放在此子键中。
系统自带的注册表编辑器无法看到此键,但可以用专门的程序来查看此键,比如使用性能监视器。
1使用注册表编辑器——Regedit
2“命令提示符”中执行Regedt32.exe也可以进入注册表编辑器,
3在WindowsNT/2000/XP打开有权限限制的注册表“开始/运行”中输入Regedt32
对注册表进行的大部分修改和编辑都是对已有键值项或键值进行的修改。
“编辑/查找”(也可以按Ctrl+F或F3,这样会更快),
打开有权限限制的注册表用Regedit32,而用Regedt32编辑注册表与Regedit略有不同:
(1)不能右击某个值并选择“修改”,因为Regedt32压根就不支持鼠标右击功能。
(2)在对Regedt32中的注册表值进行修改之前,必须登记注册,获得必要的权限,这意味着只有“管理员”或相当的角色才能完全修改注册表。
(3)双击键值窗口中的键值项,就会打开该数据类型相应的键值编辑器对话框。
这是修改注册表数据的最快及最安全的方法,也是推荐给大家的方法。
不能单击一个键值并选择“编辑/修改”,是因为“编辑”菜单上没有该选项。
必须从“编辑”菜单上选择一个数据类型,要求编辑一个值时必须知道它的数据类型。
(4)Regedt32有一个Regedit没有的编辑器:
多字符串编辑器。
有些注册表值有多个字符串,注册表将其作为一个值对待。
例如要修改REG_MULTI_SZ类型的值,双击该值,在多字符串编辑器中进行修改,与在Notepad这样的文本编辑器中进行的修改一样。
(5)修改子键和键值项的名称时,用Regedt32还没有Regedit方便。
Regedt32没有“重命名”命令,因此必须手工删除旧的,然后创建一个新的。
●添加及删除子键和键值项
因为不支持鼠标右击功能,所以用Regedt32添加子键和键值项远不如用Regedit方便。
在Regedt32中,你必须单击相应子键,选择“编辑”菜单中的“添加项”(实际就是添加子键),弹出对话框后,才可以指定子键名以及该子键的缺省数据类型(任选)。
在Regedt32中添加键值项的过程和添加子键的操作差不多。
选择相应子键,然后选择“编辑”菜单中的“添加数据”(实际就是添加键值项),在对话框中赋予新建值项一个名称和数据类型,单击“确定”,在随后出现的编辑器对话框中输入键值。
要在Regedt32中删除子键和值,只需将某个子键或键值项选定,然后敲Delete键(或选择“编辑”菜单中的“删除”)。
Regedt32不支持像Regedit那样能一次删除多个键值项,而如果你要删除多个键值项,就只能一个接一个地删了。
在Regedit32中必须获得安全许可才能删除注册表内容。
这就意味着你必须以管理员身份登录。
而且必须撤消选定“选项”菜单中的“只读模式”复选框。
●查找注册表
Regedt32的搜索特性比Regedit要差得多,因为它不能查找键值项或键值,而只能查找子键。
下面是另外几处值得注意的差别:
·“搜索”处在“查看”菜单里,而不是Regedit和大多数别的Windows程序中那样存放在“编辑”菜单中。
·Regedt32另加了一个“区分大小写”选项,规定准确的大写或小写匹配(该选项可能永远都用不上)。
·还有一个选项是从当前子键往下或往上搜索(Regedit默认总是往下搜索)
·Ctrl+F和F3查找快捷键在Regedt32中不起作用。
·Regedt32不能查找用键值项或键值指定的文字,这是经常要用到Regedit的主要原因,即使Microsoft宣称Regedt32是更好的工具。
备注:
Regedt32不允许紧接着HKEY_USER或HKEY_LOCAL_MACHINE根键下面添加一个子键。
必须使用“注册表”菜单中的“加载配置单元”命令才能在根键下直接添加子键,这样做的目的是为了检查别人的注册表。
注册表备份与恢复
1.3.4在MS-DOS命令行模式下导出注册表文件
注册表编辑器不仅可以在Windows界面下运行视窗模式,还可以在MS-DOS(不是在Windows下运行的MS-DOS模式)命令行模式下运行!
不过此时的注册表编辑器实际仅具备从注册表文件引入和导出注册表文件的功能,而没有Windows界面下的注册表编辑功能。
MS-DOS下的注册表编辑器具有它的独到之处,首先,当系统出现问题而无法启动Windows系统时,它可以使用以前备份的.reg文件重建注册表,使之恢复正常。
另外就是通过引入.reg文件来“压缩”注册表。
在MS-DOS命令行模式下导出注册表文件的命令格式为:
Regedit [/L:
system][/R:
user]/Efile.reg[Regpath1]
/L:
system是指定System.dat文件所在的路径。
/R:
user是指定User.dat文件所在的路径。
如果没有/L和/R参数,注册表编辑器就会在默认的路径下(比如C:
\Windows)找这两个文件。
/E:
此参数告诉注册表编辑器要进行导出注册表操作。
在此参数后面,应该空一格,输入导出注册表的文件名。
可选项[Regpath]是指定要导出哪个注册表的分支,如果不指定[Regpath]选项,那么则导出全部注册表分支。
例如,我们要将保存在C:
\Windows\System.dat和保存在C:
\Windows\Profiles\User.dat中的关于控制Windows98启动项目的分支导出到test.reg里,命令如下:
Regedit/L:
C:
\Windows\/R:
C:
\Windows\Profiles\/etest.regHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
而要直接导出在默认路径里的System.dat和User.dat所包含的所有的注册表内容,那么用Regedit/eAll.reg命令就可以了。
备注:
这里应该特别注意的是/L:
system和/R:
user参数为可选项。
如果不选,那么注册表编辑器认为是对Windows98目录下的System.dat和User.dat进行操作。
1.3.5在MS-DOS命令行模式下引入注册表文件
MS-DOS下注册表编辑器的这个功能,与Windows下的注册表编辑器的“引入注册表”是完全一样的。
它可以将指定的.reg文件中的注册表内容导入,并新建或覆盖这些导入的子键分支、键值项和键值。
在MS-DOS命令行模式下的命令格式为:
Regedit [/L:
system][/R:
user]file.reg
/L:
system是指定System.dat文件所在的路径。
/R:
user是指定User.dat文件所在的路径。
引入注册表仅需要指定被引入的.reg文件的路径和名称就可以了,而不需要象“/E”、“/C”这样的参数。
例如,我们要将test.reg文件中的部分注册表内容,引入到C:
\Windows\System.dat和保存在C:
\Windows\Profiles\User.dat中,命令可以如下:
Regedit/L:
C:
\Windows\/R:
C:
\Windows\Profiles\test.reg
而要将test.reg文件中的注册表内容直接引入到默认路径里的System.dat和User.dat文件中,那么用Regedittest.reg命令就可以了。
1.3.6在MS-DOS命令行模式下重建注册表
此命令是MS-DOS环境下的注册表编辑器所特有的功能。
它将用指定的.reg文件中的内容,重新建立整个注册表,即重新建立System.dat和User.dat文件。
在MS-DOS命令行模式下的命令格式为:
Regedit/L:
system/R:
user/Cfile.reg
/L:
system是指定System.dat文件所在的路径。
/R:
user是指定User.dat文件所在的路径。
/C:
此参数将告诉注册表编辑器,用所指定的.reg文件中的内容,重建注册表。
例如,我们要用test.reg文件中的注册表内容,重新建立整个注册表,并将其保存到C:
\Windows\System.dat和C:
\Windows\Profiles\User.dat中,命令可以如下:
Regedit/L:
C:
\Windows\/R:
C:
\Windows\Profiles\/Ctest.reg
备注:
/C选项将引入.reg文件中的全部内容,从头开始创建一个全新的注册表。
在这里应该特别注意,所指定的.reg文件应该包含整个注册表的全部内容。
因为注册表编辑器并不检查指定的.reg文件中是否包括了整个注册表的内容。
另外在重建注册表命令之前,一定要备份整个注册表,以防出现错误而造成损失。
1.3.7在MS-DOS命令行模式下删除注册表分支
此命令可以将注册表中的一个子键分支删除。
它在MS-DOS命令行模式下的命令格式为:
Regedit/L:
system/R:
user/DREGPATH
/L:
system是指定System.dat文件所在的路径。
/R:
user是指定User.dat文件所在的路径。
/D:
此参数将告诉注册表编辑器,将REGPATH所指定的注册表子键分支删除。
例如,我们要将注册表中关于控制Windows98启动项目的分支删除,命令可以如下:
Regedit/L:
C:
\Windows\/R:
C:
\Windows\Profiles\/DHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
备注:
此命令将删除指定子键下所包含的所有内容。
(包括所有子键、键值项和键值)
1.3.8在MS-DOS环境下“拯救”注册表
人为误操作或者恶性病毒感染而使系统彻底崩溃,不能进入Windows98图形界面时,难道只有重装Windows98这一种方法呢?
实际上这些故障很多都可以通过注册表得以解决,这就需要灵活地运用注册表编辑器在MS-DOS环境下面特殊的功能。
而且,利用这种方法,仅仅是对错误的部分进行局部恢复,所以对数据和配置的破坏,都是最小的。
使用注册表编辑器对注册表实行局部修改和修复的思路是:
(1)导出注册表分支。
把注册表里有嫌疑的分支导出到.reg文件。
(2)使用edit(DOS下的实用编辑程序)或者其他字处理程序对.reg文件进行错误分析和修改编辑。
(3)最后,把修改后的.reg文件重新引入注册表里。
下面通过讲述一个具体的例子来说明此方法的具体操作。
(1)导出注册表分支
一台机器在重新启动后,无论用正常模式还是安全模式都不能进入Windows98界面,具体表现为启动过程中硬盘突然不读;用SCANDISK检查硬盘,并没有发现问题。
在启动过程中选择生成BOOTLOG.TXT文件,发现启动到硬盘控制器后,就停止响应了。
本来想用Scanreg/restore恢复备份的注册表,可是该机器为了加快启动,并没有自动备份。
所以现在只能通过注册表编辑器来完成这一“拯救”使命了。
由注册表的结构知识可以得知,关于硬盘控制器的设置被保存在注册表中的HKEY_LOCAL_MACHINE\Enum\PCI子键下,所以用注册表编辑器将此子键导出。
具体的命令为:
Regedit/ehd.regHKEY_LOCAL_MACHINE\Enum\PCI。
(2)对注册表进行分析、修改
在MS-DOS下面运行edit对导出的.reg文件进行编辑。
为了能解决问题,我们需要正确找出引起错误的地方并修改。
我们知道注册表里面容易引起致命错误而使Windows98不能正常启动的分支是:
HKEY_LOCAL_MACHINE根键,它记录着本地机器的硬件配置以及安装的相应软件。
比如HKEY_LOCAL_MA-CHINE\Enum\PCI\VEN106&DEV_0571&SUBSYS_05711106&REV_06\BUS_00&DEV_07&FUNC_01子键下记录的是硬盘控制器的详细信息,下面的Logconfig子键记录着它的各种参数;HKEY_LOCAL_MACHINE\Enum\PCI\VEN0DE&DEV_0028&SUBSYS134107D&REV5\000800记录的则是显示卡的重要资料和参数。
一旦这些注册表信息出错或被破坏,往往会导致Windows98无法启动和正常运行。
当我们导出了注册表分支并对其进行了问题分析后,就可以用EDIT等编辑软件对.reg文件进行编辑和修改了。
现在用EDIT打开在第一步里导出的.reg文件,并查看关于硬盘控制器的部分,发现有“ChannelOptions”=hex:
00,问题到这里终于发现了,原来是IDE控制器被设置成禁用了,造成在加载硬盘控制器后,系统不能访问硬盘,所以应把它改为:
hex:
02。
修改完成后保存.reg文件。
(3)重新引入正常的注册表分支
hd.reg文件修改正确后,就可以将它重新引入注册表了,这一步的操作是直接在DOS命令提示符状态下键入命令:
Regedithd.reg就可以了。
通过以上的操作并重新启动机器后,一切都恢复正常了。
这样,在不损坏任何其他数据的情况下,就把问题解决了。
备注:
以上列举的的HKEY_LOCAL_MACHINE\Enum\PCI\VEN106&DEV_0571&SUBSYS_05711106&REV_06\BUS_00&DEV_07&FUNC_01和HKEY_LOCAL_MACHINE\Enum\PCI\VEN0DE&DEV_0028&SUBSYS134107D&REV5\000800子键下,子键会因为不同的机器配置而有所不同。
使用注册表检查器备