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


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

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

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

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

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

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

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

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

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

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