處理通知

RegistryCallback常式會接收REG_XXX_KEY_INFORMATION結構的指標,其中包含發生之登錄作業的相關資訊。

RegistryCallback常式可以監視、封鎖或修改登錄操作。

監視登錄呼叫

如果登錄篩選驅動程式正在監視登錄作業,它的 RegistryCallback 常式可以更新計數器或執行其他的簿記作業,然後傳回 STATUS_SUCCESS。 每當 RegistryCallback 常式傳回 STATUS_SUCCESS 時,configuration manager 會繼續執行登錄操作。

Windows XP 和更新版本的 Windows 都支援監視登錄呼叫。

封鎖登錄呼叫

如果登錄篩選驅動程式會傳回NT_SUCCESS (狀態的狀態值) 等於FALSE (也就是不成功的 NTSTATUS 值) ,登錄篩選驅動程式可以封鎖登錄作業。 當 configuration manager 收到非成功的傳回值時,它會立即返回具有驅動程式指定狀態值的呼叫端執行緒。 因此,登錄篩選驅動程式可以使用預先通知來防止登錄操作被處理。

如果 RegistryCallback 常式針對預先通知傳回 NT_SUCCESS (狀態) 等於 FALSE 的狀態值,則不會發生作業的後置通知回呼。

Windows XP 和更新版本的 Windows 都支援封鎖登錄呼叫。 針對 Windows Vista 和更新版本,驅動程式可以修改登錄作業傳回給呼叫執行緒的值。 這些值包含在 Windows Vista 和更新版本的REG_XXX_KEY_INFORMATION結構中。

修改登錄呼叫

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

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

  • 修改其 REG_XXX_KEY_INFORMATION 結構包含的輸出參數,然後傳回 STATUS_SUCCESS。 Configuration manager 會將修改過的輸出參數傳回給呼叫的執行緒。

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

  • 藉由提供REG_POST_OPERATION_INFORMATION結構之ReturnStatus成員的狀態值,然後傳回 STATUS_CALLBACK_BYPASS,來修改登錄作業的傳回值。 Configuration manager 會將指定的傳回值傳回給呼叫的執行緒。

    注意 如果驅動程式將狀態碼從成功變更為失敗,可能必須解除配置 configuration manager 配置的物件。 或者,如果驅動程式將狀態碼從失敗變更為成功,則可能必須提供適當的輸出參數。

Windows Vista 和更新版本都支援修改傳回值。

當登錄篩選驅動程式的 RegistryCallback 常式收到預先通知時,常式可以處理登錄作業本身,然後傳回 STATUS_CALLBACK_BYPASS。 當登錄從驅動程式收到 STATUS_CALLBACK_BYPASS 時,只會將 STATUS_SUCCESS 傳回給呼叫的執行緒,且不會處理作業。 驅動程式會 shutdown 登錄作業,而且必須完全處理它,而驅動程式必須小心,才能在 REG_XXX_KEY_INFORMATION 結構中傳回有效的輸出值。

驅動程式可搶先 Windows Vista 和更新版本中的登錄作業。

如果 RegistryCallback 常式傳回預先通知的 STATUS_CALLBACK_BYPASS,則不會發生作業的後置通知回呼。

注意 許多登錄系統呼叫都不會記載,因為很少使用它們,而使用它們時,通常會在登錄中達到一些非傳統的結果。 修改這些呼叫所執行的作業很困難且容易發生錯誤。 驅動程式開發人員不建議您嘗試修改下列登錄系統呼叫:

  • NtRestoreKey
  • NtSaveKey
  • NtSaveKeyEx
  • NtLoadKeyEx
  • NtUnloadKey2
  • NtUnloadKeyEx
  • NtReplaceKey
  • NtRenameKey
  • NtSetInformationKey