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 和更新版本,驅動程式可以修改登錄作業傳回呼叫線程的值。 這些值包含在 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