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


Обработка уведомлений

Подпрограмма 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 и более поздних версий драйвер может изменить значения, возвращаемые операцией реестра в вызывающий поток. Эти значения содержатся в структурах REG_XXX_KEY_INFORMATION для Windows Vista и более поздних версий.

Изменение вызовов реестра

Драйвер фильтрации реестра может изменять выходные параметры операции реестра или возвращаемое значение. Кроме того, драйвер может полностью обработать операцию реестра, а не разрешить реестру обрабатывать операцию.

Когда процедура RegistryCallback в драйвере фильтрации реестра получает после уведомления, она может:

  • Измените выходные параметры, которые содержит структура REG_XXX_KEY_INFORMATION, а затем верните STATUS_SUCCESS. Диспетчер конфигурации возвращает измененные выходные параметры вызывающему потоку.

    Изменение выходных параметров поддерживается в Windows Vista и более поздних версиях.

  • Измените возвращаемое значение операции реестра, указав значение состояния ReturnStatus члена структуры REG_POST_OPERATION_INFORMATION, а затем возвратив 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