알림 처리

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