Win32汇编--操作注册表

本文详细介绍了在Windows环境下使用汇编语言操作注册表的方法,包括打开和关闭子键、创建和删除子键、管理键值以及枚举子键和键值。文章通过函数调用解释了各项操作的具体步骤和注意事项,例如使用RegOpenKeyEx、RegCreateKeyEx、RegSetValueEx、RegQueryValueEx等函数,并给出了实际示例。此外,还提及了如何通过RegQueryInfoKey获取键的统计信息以优化缓冲区大小的分配。
摘要由CSDN通过智能技术生成

1.打开和关闭子键

   注册表函数对注册表的操作是通过句柄来完成的,与文件操作一样,在对某个键下的子键或者键值项进行操作之前,需要先将这个键打开,然后使用键句柄来引用这个键,在操作完毕以后再将键句柄关闭。注册表的根键不需要打开,它们的句柄是固定不变的,要使用根键的时候只要把这些句柄直接拿来用就是了,Windows.inc中已经预定义了它们的数值:

HKEY_CLASSES_ROOT                      equ 80000000h

HKEY_CURRENT_USER                      equ 80000001h

HKEY_LOCAL_MACHINE                     equ 80000002h

HKEY_USERS                              equ 80000003h

HKEY_PERFORMANCE_DATA                equ 80000004h

HKEY_CURRENT_CONFIG                    equ 80000005h

HKEY_DYN_DATA                           equ 80000006h

  在程序中可以随时将这些助记符当做句柄来引用对应的根键。在程序结束的时候,不需要关闭这些根键句柄。

  打开子键使用RegOpenKeyEx函数,在Win16中还存在一个RegOpenKey函数,虽然在Win32中这个函数仍然存在,但这仅是为了兼容的目的而设置的。API手册中推荐使用RegOpenKeyEx函数:

    invoke  RegOpenKeyEx,hKey,lpSubKey,dwOptions,samDesired,phkResult

  函数的hKey参数指定父键句柄,lpSubKey指向一个字符串,用来表示要打开的子键名称,在系统中一个子键的全称是以“根键\第1层子键\第2层子键\第n层子键”类型的字符串表示的,中间用“\”隔开,字符串的最后以0字符结束,这和目录名的表示方法是很像的。

既然子键的全称是这样表示的,那么要打开一个子键的时候,下面的两种表示方法有什么不同呢?

1)父键=HKEY_LOCAL_MACHINE,子键=Software\RegTest\MySubkey

2)父键=HKEY_LOCAL_MACHINE\Software,子键=RegTest\MySubkey

答案是:这两种表示方法是完全相同的。在使用RegOpenKeyEx函数打开子键的时候,既可以将hKey参数设置为HKEY_LOCAL_MACHINE根键的句柄,并将lpSubKey参数指向“Software\RegTest\MySubkey”字符串;也可以将hKey参数设置为“HKEY_LOCAL_ MACHINE\Software”的句柄,将lpSubKey参数指向“RegTest\MySubkey”字符串,得到的结果是一样的。但是,使用第一种方法时,hKey参数可以直接使用助记符HKEY_LOCAL_ MACHINE来表示,因为根键的句柄是固定的,不需要打开;而使用第二种方法时,还需要先打开“HKEY_LOCAL_MACHINE\Software”键来获取它的句柄,所以具体使用哪种方法还要根据具体情况灵活选用。

函数的其他几个参数的含义如下。

   dwOptions参数——系统保留参数,必须指定为0。

   samDesired参数——子键的打开方式,根据使用子键的方式,可以设置为下列取值的组合,只有指定了打开的方式,才能在打开子键后进行相应的操作:

   KEY_ALL_ACCESS——允许所有的存取。

   KEY_CREATE_LINK——允许建立符号列表。

   KEY_CREATE_SUB_KEY——允许建立下一层子键。

   KEY_ENUMERATE_SUB_KEYS——允许枚举下一层子键。

   KEY_EXECUTE——允许读操作。

   KEY_QUERY_VALUE——允许查询键值数据。

   KEY_READ—KEY_QUERY_VALUE,KEY_ENUMERATE_SUB_KEYS和KEY_ NOTIFY的组合。

   KEY_SET_VALUE——允许修改或创建键值数据。

   KEY_WRITE——KEY_SET_VALUE和KEY_CREATE_SUB_KEY的组合。

   phkResult参数——指向一个双字变量,函数在这里返回打开的子键句柄。

  如果函数执行成功,返回值是ERROR_SUCCESS,并且函数在phkResult参数指向的变量中返回子键句柄。

当不再需要继续使用键句柄的时候,可以使用RegCloseKey函数将它关闭:

    invoke  RegCloseKey,hKey

如果句柄被成功关闭,函数返回ERROR_SUCCESS。



2.创建和删除子键

  创建一个子键可以使用RegCreateKeyEx函数:

    invoke  RegCreateKeyEx,hKey,lpSubKey,Reserved,lpClass,dwOptions,\

            samDesired,lpSecurityAttributes,phkResult,lpdwDisposition

  函数中与RegOpenKeyEx函数中同名参数的含义和用法是相同的,hKey也是用来指定父键句柄,lpSubKey指向要创建的子键名称字符串,samDesired参数指明子键建立后的操作方式,phkResult指向用来返回键句柄的双字变量。

其余一些参数的含义如下。

   Reserved参数——保留参数,必须设置为0。

   lpClass参数——为创建的子键定义一个类名,这个参数一般设置为NULL。

   dwOptions参数——创建子键时的选项,它可以是以下取值之一:

   REG_OPTION_NON_VOLATILE——默认值,子键被创建到注册表文件中。

   REG_OPTION_VOLATILE——创建易失性的子键,子键被保存在内存中,当系统重新启动的时候,子键消失。这个选项仅对Windows NT系统有效,在9x系统中被忽略。

   lpSecurityAttributes参数——指向一个SECURITY_ATTRIBUTES结构,用来指定键句柄的继承性,如果句柄不需要被继承,可以使用NULL。

   lpdwDisposition参数——这个参数一般使用NULL。

  当需要创建的子键已经存在的时候,函数仅起到RegOpenKeyEx函数的作用;如果子键不存在,那么函数将创建子键。如果函数执行成功,返回值是ERROR_SUCCESS。

  如果要创建“HKEY_LOCAL_MACHINE\Key1\Key2\Key3”子键,既可以将hKey参数设置为HKEY_LOCAL_MACHINE,将lpSubKey参数指向“Key1\Key2\Key3”字符串;也可以先打开“HKEY_LOCAL_MACHINE\Key1”键,将hKey设置为打开的键句柄,然后将lpSubKey参数指向“Key2\Key3”字符串,这和RegOpenKeyEx函数中的用法是类似的。在第二种用法中,打开父键的时候注意要指定KEY_CREATE_SUB_KEY方式。

当被创建子键的上层键不存在的时候,函数连上层的子键一起创建。如上面的例子中,假如Key2也不存在,那么函数先在“HKEY_LOCAL_MACHINE\Key1”下创建Key2,然后在Key2下继续创建Key3。

_Reg.asm文件中的大部分子程序首先用RegOpenKeyEx函数打开子键以便进行下一步操作,但是保存键值用的_RegSetValue子程序中使用的是RegCreateKeyEx函数,这样当子键已经存在的时候,函数仅打开它,如果子键不存在的话则创建子键。

删除子键使用RegDeleteKey函数:

    invoke  RegDeleteKey,hKey,lpSubKey

  hKey参数为父键句柄,lpSubKey参数指向要删除的子键名称字符串。函数仅删除最后一层子键以及下面的全部键值项。比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值