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

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

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

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

键对象值未定义

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

键对象值未处于有效状态

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

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

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