處理通知

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 和更新版本,驅動程式可以修改登錄作業傳回呼叫執行緒的值。 這些值包含在 Windows Vista 和更新版本的 REG_XXX_KEY_INFORMATION 結構中。

修改登錄呼叫

登錄篩選驅動程式可以修改登錄作業的輸出參數或傳回值。 此外,驅動程式可以完全處理登錄作業,而不是允許登錄處理作業。

當登錄篩選驅動程式的 RegistryCallback 常式收到通知後時,它可以:

  • 修改其 REG_XXX_KEY_INFORMATION 結構的輸出參數,然後傳回STATUS_SUCCESS。 組態管理員會將已修改的輸出參數傳回給呼叫執行緒。

    Windows Vista 和更新版本中支援修改輸出參數。

  • REG_POST_OPERATION_INFORMATION結構的ReturnStatus成員提供狀態值,然後傳回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