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

Why does RegCloseKey exist (when CloseHandle seems to perform the same function)?

本文关键字:功能 执行 存在 RegCloseKey CloseHandle 为什么      更新时间:2023-10-16

前几天我查看了DuplicateHandle的文档,注意到DuplicateHandle能够复制注册表项句柄(HKEYs)。在SysInternals的书中读到更多这方面的内容似乎表明注册表项句柄是普通的内核对象,类似于文件句柄。然而,CloseHandle不能关闭HKEYs,RegCloseKey不能关闭其他类型的内核对象。

为什么有区别?

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

其余功能在advapi32.dll中实现,并在用户模式下工作:

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

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