处理通知

RegistryCallback 例程接收指向 REG_XXX_KEY_INFORMATION 结构的指针,该结构包含有关所发生的注册表操作的信息。

RegistryCallback 例程可以监视、阻止或修改注册表操作。

监视注册表调用

如果注册表筛选驱动程序正在监视注册表操作,则其 RegistryCallback 例程可以更新计数器或执行其他记账操作,然后返回STATUS_SUCCESS。 每当 RegistryCallback 例程返回STATUS_SUCCESS时,配置管理器将继续执行注册表操作。

监视注册表调用在 Windows XP 和更高版本的 Windows 中受支持。

阻止注册表调用

如果注册表筛选驱动程序的 RegistryCallback 例程返回的状态值 NT_SUCCESS (状态) 等于 FALSE (即) 不成功的 NTSTATUS 值,则注册表筛选驱动程序可能会阻止注册表操作。 当配置管理器收到非成功返回值时,它会立即返回到具有驱动程序指定状态值的调用线程。 因此,注册表筛选驱动程序可以使用预通知来阻止处理注册表操作。

如果 RegistryCallback 例程返回状态值,NT_SUCCESS (状态) 为 预通知的 FALSE ,则不会发生操作的通知后回调。

Windows XP 和更高版本的 Windows 支持阻止注册表调用。 对于 Windows Vista 及更高版本,驱动程序可以修改注册表操作返回到调用线程的值。 这些值包含在 Windows Vista 及更高版本的 REG_XXX_KEY_INFORMATION 结构中。

修改注册表调用

注册表筛选驱动程序可以修改注册表操作的输出参数或返回值。 此外,驱动程序可以完全处理注册表操作,而不是允许注册表处理该操作。

当注册表筛选驱动程序的 RegistryCallback 例程收到后通知时,它可以:

  • 修改其 REG_XXX_KEY_INFORMATION 结构包含的输出参数,然后返回STATUS_SUCCESS。 配置管理器将修改后的输出参数返回到调用线程。

    Windows Vista 及更高版本中支持修改输出参数。

  • 通过为 REG_POST_OPERATION_INFORMATION 结构的 ReturnStatus 成员提供状态值,然后返回 STATUS_CALLBACK_BYPASS 来修改注册表操作的返回值。 配置管理器将指定的返回值返回到调用线程。

    注意 如果驱动程序将状态代码从成功更改为失败,则可能必须解除分配配置管理器分配的对象。 或者,如果驱动程序将状态代码从失败更改为成功,则可能必须提供适当的输出参数。

Windows Vista 及更高版本中支持修改返回值。

当注册表筛选驱动程序的 RegistryCallback 例程收到预通知时,该例程可以处理注册表操作本身,然后返回STATUS_CALLBACK_BYPASS。 当注册表从驱动程序接收STATUS_CALLBACK_BYPASS时,它只会将STATUS_SUCCESS返回到调用线程,并且不处理操作。 驱动程序会抢占注册表操作,并且必须完全处理它,并且驱动程序必须小心地在 REG_XXX_KEY_INFORMATION 结构中返回有效的输出值。

驱动程序可以在 Windows Vista 及更高版本中抢占注册表操作。

如果 RegistryCallback 例程返回预通知STATUS_CALLBACK_BYPASS,则不会发生操作的通知后回调。

注意 未记录多个注册表系统调用,因为它们很少使用,并且,使用它们时,通常是为了在注册表中实现一些非常规结果。 修改这些调用执行的操作非常困难且容易出错。 不建议驱动程序开发人员尝试修改以下注册表系统调用:

  • NtRestoreKey
  • NtSaveKey
  • NtSaveKeyEx
  • NtLoadKeyEx
  • NtUnloadKey2
  • NtUnloadKeyEx
  • NtReplaceKey
  • NtRenameKey
  • NtSetInformationKey