.Reg文件格式

类别:软件工程 点击:0 评论:0 推荐:

.Reg文件格式

原作:J.Mostert
翻译:淡月儿

1 概述
  注册表编辑器使用.Reg文件格式导入、导出注册表设置,支持的操作系统包括Windows3.X,Windows95/98/NT及以上。尽管注册表的作用和原理十分重要,但本文不打算介绍,你可以通过文末列出的网址,获得相关的信息。同时,Windows3.X的.Reg文件格式与Windows95以上不尽相同,本文将忽略这方面的内容,毕竟Windows3.X的注册表已经不太重要。

2 详细说明
  .Reg文件是ASCII码组成的无格式纯文本,每一行以“cr/lf”结尾。

2.1 文件头
  .reg文件开头是注册表编辑器的版本,Windows95/NT下版本是4,你可以使用这样的字符串:regedit4。在执行导入前,注册表编辑器将会检查版本是否正确,并在不匹配时给与提示,这也是注册表编辑器对.Reg文件做的唯一检查。一般情况下,注册表编辑器会默默忽略掉错误的文件内容不予导入注册表,更多情况下会把可能导致问题的内容导入注册表,这是微软注册表编辑器的一个缺陷。

2.2 键
  键和子键被原样导出至.Reg文件,没有顺序差别。
  例如:
  hkey_classes_root\clsid键下面有hkey_classes_root\clsid\{21ec2020-3aea-1069-a2dd-08002b30309d}这个子键(这个键的作用是在控制面板上添加一个类声明),它按如下格式导出:
  [hkey_classes_root\clsid]
  [hkey_classes_root\clsid\{21ec2020-3aea-1069-a2dd-08002b30309d}]
  任何一个有效键值都必须包含完整的路径,因此必定以根键开头,根键包括:
  hkey_classes_root
  hkey_current_user
  hkey_local_machine
  hkey_users
  hkey_current_config
  hkey_dyn_data
  键名只可以由ASCII码中的可打印字符组成(即ASCII码32至127所代表的字符),键名不可以包含空格、反斜杠( \ )以及通配符( * 和 ? )。每一个键名下紧跟着它的键值,键值列表以空行结束,一个键的键值列表可以就是一个空行。
  例如:
  [key-name]

  [second-key-name]
  "value1"=something
  "value2"=something

  [third-key-name]
  假如在文件中指定了一个不存在的键值,那么在导入的时候这个键连同它的根键(假如不存在的话)都将被创建。
  例如:
  文件中指定了hkey_users\jeroen\test\subkey这个键;
  注册表中只存在hkey_users\jeroen这个键;
  当导入以后,hkey_users\jeroen\test这个键会被创建。

  注意,你只能添加或修改键和键值,而不能删除它们。
  (译者注:事实上可以删除,方法是在键名前面加上 - 号,该键连同其子键将被删除;在指定键值为 - ,可以删除该键值。)

2.3 键值
  注册表键值可以是三种数据类型:字符串(string)、二进制值(binary value)和双机器字(dword,即32位整数)。键值的名称以引号 " 包含,值紧跟在等号 = 之后。每一个键都包含至少一个字符串类型的键值,这个键值在注册表编辑器中显示为“默认值”(default)。你可以通过指定名称为 @ 的值来修改默认值。
  例如:
  @="this is the default value."

2.3.1 字符串
  字符串可以是任意长度的,用引号 " 包含起来的由ASCII码字符组成的值。字符 " 和 \ 也可以包含在字符串中,不过需要用 \" 和 \\ 进行转义。同时,注册表编辑器可以导入导出除换行符(以及新行符,即ASCII码10所指定的字符)以外的非ACSII码字符。
  当一个字符串值中包含换行符,在导出的时候会被输出成两行,但是再次导入时,只能导入第一行,第二行将被忽略。因此请牢记:不要在字符串值中包含换行符。
  例如:
  "foo"="bar"
  "foopath"="c:\\windows\\system"
  "foomessage"="this/nmessage/nactually/nconsists/nof/one/nlong/nline."

2.3.2 二进制值
  在字符串和双字不适用的场合,可以使用二进制值。二进制值可以用来储存任意类型的数据,其格式为 hex:xx,yy,zz 等,其中xx、yy、zz是用16进制值表示的单字节值,二进制值可以是任意长度的。
  较长的二进制值可以用C语言多行符 \ 分割成多行显示。
  例如:
  "bar"=hex:48,00,00,00,01,00,00,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,\
    00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,\
    0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,00,00,00,00,c4,ac,01,\
    00
  请记住,\ 符只能够应用在二进制值当中。另外,微软声明一个二进制值不可以存储超过2K的资料,这也是值得注意的。
  二进制值的例子:
  "foo"=hex:00,de,ca,de,12,34

2.3.2.1 特定二进制类型
  除了常规的二进制值,还有若干特定类型的二进制值。我们可以这样指定:
  "foobar"=hex(type):xx,xx,xx,xx,...
  这些类型由 0 到 10 这些数字代表,具体如下:
  0 reg_none
  1 reg_sz
  2 reg_expand_sz
  3 reg_binary
  4 reg_dword, reg_dword_little_endian
  5 reg_dword_big_endian
  6 reg_link
  7 reg_multi_sz
  8 reg_resource_list
  9 reg_full_resource_descriptor
  10 reg_resource_requirements_list

2.3.2.1.1 reg_none类型
  默认的二进制值类型,应用在无特殊要求的场合。

2.3.2.1.2 reg_sz类型
  以'\0'结尾的字符串。这是用二进制值来指定的字符串值,以下两种表达方法是一样的:
  "barfoo"=hex(1):41,42,43,44,00
  "barfoo"="abcd"
  参见2.3.1,字符串。

2.3.2.1.3 reg_expand_sz类型
  包含隐含串的字符串,一般是对环境变量的引用。当一个应用程序读到这样字符串,系统将把引用串转换为正确的环境变量值。
  下面的例子表示字符串"%path%;something",当这个值被引用的时候,"%path%"会被转化为当前系统的 path 值。
  "forbaa"=hex(2):25,50,41,54,48,25,3b,53,6f,6d,65,74,68,69,6e,67,00

2.3.2.1.4 reg_dword, reg_dword_little_endian类型
  小段对齐,是通常的双字数据类型,在这种格式下存储,高位字节在前,低位字节在后。

2.3.2.1.5 reg_dword_big_endian类型
  大段对齐,是苹果机的双字数据类型,在这种格式下存储,低位字节在前,高位字节在后。

2.3.2.1.6 reg_link类型
  Unicode符号连接。

2.3.2.1.7 reg_multi_sz
  多字节字符串集,以连续两个'\0'结束,例如:
  "farboo"=hex(7):41,42,43,44,00,45,46,47,48,00,00
  表示"abcd"和"efgh"两个字符串。

2.3.2.1.8 reg_resource_list
  设备驱动程序资源列表。

2.3.2.1.9 reg_full_resource_descriptor
  微软保留数据类型,用于辅助设备驱动程序。

2.3.2.1.10 reg_resource_requirements_list
  微软保留数据类型,用于辅助设备驱动程序。

2.3.3. 双字数据类型
  双字数据类型,即32位整数,表示为 dword:xxxxxxxx,其中 x 是一个表示4位二进制的16进制值。
  例如:
  "foo"=dword:00decade

3 结语
  本文简要介绍了.Reg文件的格式,由于作者水平有限,错漏之处在所难免,假如您发现了错误,请不吝赐教.
  我的Email:[email protected]

4 参考资料
  以下是关于注册表知识的网址,希望对大家有所帮助。
  (译者注:由于这些链接都是1997年4月以前的,因此不再翻译)

原文:

                              Thethe .reg file format

      J.Mostert

      1 introduction
      the .reg file format is used by regedit, the program supplied with windows
      3.x,
      windows 95, and windows nt, to import and export settings from the
      registry.
      note that i will not explain what the registry is, how it works, or what
      it can
      be used for. there are other documents describing the registry and it's
      most
      interesting parts all over the net - check out some of the links at the
      end of
      this document. also, i will not provide you with information on regedit for
      windows 3.x - i know that it exists, but not if it's format is in any way
      like
      the regedit of 95/nt. besides, the registry is much less interesting on
      windows
      3.x.

      2 description
      the file is formatted as plain ascii text. every line is ended with a cr/lf
      combination.

      2.1 header
      it starts with regeditx, where x is regedit's version number - on 95/nt,
      it's
      4, making the string regedit4.

      this is also the only part of the file actually checked by regedit when
      it's
      importing - if the file contains any formatting errors, regedit will not
      notify
      you and simply skip the settings that contain errors.

      in particular, regedit will pretty much accept anything as long as it
      starts
      with regeditx, and ignore anything erroneous. yes, that does add up to the
      microsoft stupid mistakes list.

      2.2 keys
      key names are exported as they are encountered, but need not be in any
      order.
      subkeys are explicitly named. for example, if you had the key
      hkey_classes_root\clsid and it's subkey
      hkey_classes_root\clsid\{21ec2020-3aea-1069-a2dd-08002b30309d} (which
      represents the classid of the control panel, by the way), they would be
      exported as:

      [hkey_classes_root\clsid]

      [hkey_classes_root\clsid\{21ec2020-3aea-1069-a2dd-08002b30309d}]

      for a key name to be valid, it must start with one of the root key names:
      hkey_classes_root, hkey_current_user, hkey_local_machine, hkey_users,
      hkey_current_config and hkey_dyn_data.

      a key name may only contain printable ascii characters (that is, characters
      with values from 32 through 127) and may not contain spaces, backslashes \
      or
      the wildcards * and ?.

      every key name is followed by it's values, starting on the line directly
      following it. the list of values is terminated with an empty line, and may
      be
      empty itself.

      for example:
      [key-name]

      [second-key-name]
      "value1"=something
      "value2"=something

      [third-key-name]

      if a key is specified which does not exist, it is created, along with any
      parent keys that do not exist. for example, if the key
      hkey_users\jeroen\test\subkey is specified, and only the key
      hkey_users\jeroen
      exists, the key hkey_users\jeroen\test is also created.

      note that you cannot delete keys or values - you can only add them if they
      don't already exist, or modify them if they do.

      2.3 values
      there are three kinds of values in the registry: strings, binary values,
      and
      dwords. they represent a collection of characters, a collection of bytes,
      and a
      32-bit integer, respectively.

      values consist of a name, enclosed in quotes "", followed by an equal sign
      = ,
      followed by the value value (there's no other way to put it).

      every key, even if created empty, contains at least one string value -
      this is
      the value shown as (default) in regedit. to set it's value, use @ as the
      value
      name, and omit the usual quotes around the value name.

      example:
      @="this is the default value."

      2.3.1 strings
      strings may be any size. they are represented within quotes "", and contain
      normal ascii characters.

      the quote " and backslash \ are also allowed in strings - however, they
      must be
      represented as \" and \\, respectively. also, regedit can import and
      export all
      non-ascii characters except for linefeed (or newline, ascii code 10).
      should a
      linefeed end up in a string, regedit will export this as a real newline,
      splitting the string in two lines. when reimporting this string, regedit
      will
      only read the first line. the moral of the story: don't store linefeeds in
      strings.

      examples of strings:
      "foo"="bar"
      "foopath"="c:\\windows\\system"
      "foomessage"="this/nmessage/nactually/nconsists/nof/one/nlong/nline."

      2.3.2 binary values
      binary values are used where strings and dwords fail. they can be used to
      represent any type of data. they are represented as hex:xx,yy,zz where
      xx,yy
      and zz are hexadecimal representations of single bytes. they may be any
      length.

      lengthy binary values can be divided into multiple lines using the c line
      separator \. for example:
      "bar"=hex:48,00,00,00,01,00,00,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,\
      00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,\
      0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,0a,00,00,00,00,00,c4,ac,01,\
      00

      also take note that this is only allowed with binary values. in
      particular, you
      cannot divide strings this way. and yes, this is pretty stupid.

      although i usually ignore microsoft, they recommend you shouldn't store
      more
      than around two kilobytes of binary data at most, and i agree with them for
      once.

      example of binary values:
      "foo"=hex:00,de,ca,de,12,34

      2.3.2.1 types of binary values
      along with 'regular' binary values, there are also some special types of
      data
      which regedit represents as special binary values, like this:

      "foobar"=hex(type):xx,xx,xx,xx,...

      where type is a number ranging from zero to ten in the current versions of
      windows, as follows:

      type name
      0 reg_none
      1 reg_sz
      2 reg_expand_sz
      3 reg_binary
      4 reg_dword, reg_dword_little_endian
      5 reg_dword_big_endian
      6 reg_link
      7 reg_multi_sz
      8 reg_resource_list
      9 reg_full_resource_descriptor
      10 reg_resource_requirements_list

      2.3.2.1.1 reg_none
      reg_none means 'no defined value type'. no, i don't know what it's good
      for -
      reg_binary is already a catch-all type for everything that has no type.
      perhaps
      it's used for values that have no contents, although i can't imagine what
      that
      would be good for.

      2.3.2.1.2 reg_sz
      a null-terminated string. this is the same as the string type, represented
      as
      bytes. for example, these definitions are equal:

      "barfoo"=hex(1):41,42,43,44,00
      and
      "barfoo"="abcd"

      see also 2.3.1, strings.

      2.3.2.1.3 reg_expand_sz
      a null-terminated string that contains unexpanded references to environment
      variables. when an application reads this string from the registry, it can
      let
      windows replace the references with the environment variable value.

      for example, the following value

      "forbaa"=hex(2):25,50,41,54,48,25,3b,53,6f,6d,65,74,68,69,6e,67,00

      represents the string "%path%;something". when this string is read, the
      "%path%" section can be replaced with the contents of your path variable.

      2.3.2.1.4 reg_dword, reg_dword_little_endian
      represents a little-endian dword (the common format of windows dwords). in
      little-endian format, the most significant byte of a word is the high-order
      byte. see also 2.3.3, dwords.

      2.3.2.1.5 reg_dword_big_endian
      represents a big-endian dword (used on macintoshes, for example). as you
      can
      probably guess, in big-endian format, the most significant byte of a word
      is
      the low-order byte.

      2.3.2.1.6 reg_link
      represents a unicode symbolic link. no, i don't know what this is, and i
      probably don't want to know either.

      2.3.2.1.7 reg_multi_sz
      a collection of null-terminated strings, null-terminated. for example:

      "farboo"=hex(7):41,42,43,44,00,45,46,47,48,00,00

      represents two strings: "abcd" and "efgh".

      2.3.2.1.8 reg_resource_list
      a device driver resource list. another one in the category "don't know and
      don't want to know."

      2.3.2.1.9 reg_full_resource_descriptor
      undocumented. it's probably ment for windows itself only, as device driver
      stuff.

      2.3.2.1.10 reg_resource_requirements_list
      undocumented. it's probably ment for windows itself only, as device driver
      stuff.

      2.3.3. dwords
      dwords are 32-bit integers represented as dword:xxxxxxxx, where x is a
      hexadecimal digit. they're pretty boring, as that's all i can tell about
      them.

      example of dword values:
      "foo"=dword:00decade

      3. the end
      that's about it - the .reg format is pretty simple, but it does the job.
      should you find any unclarities, mistakes or things you think are missing,
      contact me by emailing to "[email protected]".

      4. well, almost, we still need the links
      oh yeah, here are the links i promised, listed in no particular order. they
      were all valid on november 4th, 1997.

      http://help.mindspring.com/technotes/96dec/registry1.htm
      this is the registry page at technotes+, the site for a lot of tips and
      tricks
      about pretty much anything technical. it contains an introduction to the
      registry, and how it should be used. i recommend to read this first if
      you've
      never even heard about this registry thing.

      http://www.geocities.com/siliconvalley/pines/2857/
      this is a registry page by neil mcquarry, and a nice one it is, too. it
      contains a quick introduction to the registry, a brief description of .reg
      files, and a detailed description of various keys of interest. recommended
      if
      you want to get the most of the registry.

      http://www.amazon.com
      this is amazons home page, "earth's biggest bookstore". try their search
      function to search for "windows registry" - this will provide you with more
      than enough literary references. no online information, however.

      http://www.windows95.com/tips
      this is the tips section of windows95.com. although it doesn't contain just
      registry tips, it's really worth checking out. but then again, all of
      windows95.com is worth checking out. if you have windows 95/nt, be sure to
      visit it.

本文地址:http://com.8s8s.com/it/it34167.htm