注册表通知中的项对象指针无效

为了避免致命错误和可能的内存损坏,注册表筛选驱动程序不得尝试使用无效的对象指针访问键对象。 本主题列出了注册表回调通知结构的 Object 成员可能包含未定义的非 NULL 值的情况。

在注册表筛选驱动程序中, RegistryCallback 例程的第二个参数是 REG_NOTIFY_CLASS 枚举值。 此值指示 RegistryCallback 例程的第三个参数所指向的注册表回调通知结构的类型。 通知结构包含有关注册表操作的信息。 此结构的类型因所执行的注册表操作而异。

许多通知结构类型都包含指向键对象的 Object 成员。 在某些情况下, Object 成员可以包含非 NULL 值,但不是指向有效键对象的指针。

键对象值未定义

如果调用注册表筛选驱动程序的 RegistryCallback 例程中的第二个参数是 RegNtPostCreateKeyExRegNtPostOpenKeyExREG_NOTIFY_CLASS枚举值,则第三个参数是指向 REG_POST_OPERATION_INFORMATION 结构的指针。 仅当结构的 Status 成员设置为 STATUS_SUCCESS 时,此结构的 Object 成员才有效。 任何其他 Status 值(包括 NT_SUCCESS 宏计算结果为 TRUE 的非零状态代码)指示 Object 成员的值未定义。

键对象值不处于有效状态

如果注册表回调中的第二个参数是下列 REG_NOTIFY_CLASS 枚举值之一,则注册表回调通知结构的 Object 成员指向正在销毁且其引用计数为零的键对象:

由于 Object 成员指向不处于有效状态的键对象,因此注册表筛选驱动程序不得将 Object 指针值作为参数传递给 Windows 驱动程序支持例程 (例如 ObReferenceObjectByPointer) 。

但是,在 RegistryCallback 调用以处理 RegNtPreKeyHandleCloseRegNtPostKeyHandleClose 通知期间,注册表筛选器驱动程序可以调用配置管理器例程 (例如 CmGetBoundTransaction) ,该例程采用注册表对象作为参数。