Поделиться через


Недопустимые указатели на объект ключа в уведомлениях реестра

Чтобы избежать неустранимых ошибок и возможного повреждения памяти, драйвер фильтрации реестра не должен пытаться получить доступ к объекту ключа с помощью недопустимого указателя на объект. В этом разделе перечислены обстоятельства, при которых элемент Object структуры уведомлений о обратном вызове реестра может содержать неопределенное значение, отличное от NULL .

В драйвере фильтрации реестра второй параметр подпрограммы RegistryCallback является значением перечисления REG_NOTIFY_CLASS . Это значение указывает, на какую структуру уведомлений о обратном вызове реестра указывает третий параметр подпрограммы RegistryCallback . Структура уведомлений содержит сведения об операции реестра. Тип этой структуры зависит от выполняемой операции реестра.

Многие типы структуры уведомлений содержат элемент Object , указывающий на объект ключа. В некоторых случаях элемент Object может содержать значение, отличное от NULL, но не является указателем на допустимый объект ключа.

Значение объекта ключа не определено

Если второй параметр в вызове подпрограммы RegistryCallback драйвера фильтрации реестра является значением перечисления REG_NOTIFY_CLASSRegNtPostCreateKeyEx или RegNtPostOpenKeyEx, третий параметр является указателем на структуру REG_POST_OPERATION_INFORMATION . Объектный элемент этой структуры действителен, только если для элемента Status структуры задано значение STATUS_SUCCESS. Любое другое значение состояния , включая ненулевой код состояния, для которого макрос NT_SUCCESS принимает значение TRUE, указывает на то, что значение элемента Object не определено.

Значение объекта ключа не находится в допустимом состоянии

Если второй параметр в обратном вызове реестра является одним из следующих REG_NOTIFY_CLASS значений перечисления, элемент Object структуры уведомлений о обратном вызове реестра указывает на объект ключа, который уничтожается и число ссылок которого равно нулю:

Поскольку элемент Object указывает на объект ключа, который не находится в допустимом состоянии, драйвер фильтрации реестра не должен передавать значение указателя на объект в качестве параметра в подпрограмму поддержки драйвера Windows (например, ObReferenceObjectByPointer).

Однако во время вызова RegistryCallback для обработки уведомления RegNtPreKeyHandleClose или RegNtPostKeyHandleClose драйвер фильтра реестра может вызвать подпрограмму configuration manager (например, CmGetBoundTransaction), которая принимает объект реестра в качестве параметра.