为什么RegCloseKey存在(当CloseHandle似乎执行相同的功能时)?

Bil*_*eal 17 c c++ windows winapi

我正在查看前DuplicateHandle几天的文档,并注意到DuplicateHandle能够复制注册表键句柄HKEY.在SysInternals书中读到这一点似乎表明注册表键句柄是普通的内核对象,类似于文件句柄.但是CloseHandle无法关闭HKEYs,RegCloseKey也无法关闭其他种类的内核对象.

为什么区别?

Flo*_*011 15

这是因为在内核中只实现了注册表的一部分功能.它包括使用本地注册表项的基本操作(创建,删除,读取,写入等).

其余的函数在advapi32.dll中实现,并在用户模式下工作:

  • 使用访问远程注册表 RegConnectRegistry
  • 访问 HKEY_PERFORMANCE_DATA
  • 将Win32注册表表示转换为Native表示
  • WOW64在64位系统上的注册表重定向(适用于32位应用程序)

该功能的内核部分可通过Native API : NtCreateKey, NtOpenKey等获得.当将这些函数与Win32 API进行比较时,可以看出Native API使用"经典"HANDLE描述符而不是HKEY.