Обработка уведомлений
Подпрограмма RegistryCallback получает указатель на структуру REG_XXX_KEY_INFORMATION , содержащую сведения о происходящей операции реестра.
Подпрограмма RegistryCallback может отслеживать, блокировать или изменять операцию реестра.
Мониторинг вызовов реестра
Если драйвер фильтрации реестра отслеживает операции реестра, его подпрограмма RegistryCallback может обновлять счетчики или выполнять другие операции бухгалтерского учета, а затем возвращать STATUS_SUCCESS. Всякий раз, когда подпрограмма RegistryCallback возвращает STATUS_SUCCESS, диспетчер конфигурации продолжает выполнять операцию реестра.
Мониторинг вызовов реестра поддерживается в Windows XP и более поздних версиях Windows.
Блокировка вызовов реестра
Драйвер фильтрации реестра может блокировать операции реестра, если его подпрограмма RegistryCallback возвращает значение состояния, для которого NT_SUCCESS (status) равно FALSE (т. е. значение NTSTATUS, не являющееся успешным). Когда диспетчер конфигурации получает неисправное возвращаемое значение, он немедленно возвращается в вызывающий поток со значением состояния, указанным драйвером. Таким образом, драйвер фильтрации реестра может использовать предварительные уведомления, чтобы предотвратить обработку операций реестра.
Если подпрограмма RegistryCallback возвращает значение состояния, для которого NT_SUCCESS (status) равно 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