Manipulando notificações
A rotina RegistryCallback recebe um ponteiro para uma estrutura REG_XXX_KEY_INFORMATION que contém informações sobre a operação do Registro que está ocorrendo.
A rotina RegistryCallback pode monitorar, bloquear ou modificar uma operação do Registro.
Monitoramento de chamadas do Registro
Se um driver de filtragem de registro estiver monitorando operações do Registro, sua rotina RegistryCallback poderá atualizar contadores ou executar outras operações de contabilidade e, em seguida, retornar STATUS_SUCCESS. Sempre que uma rotina RegistryCallback retorna STATUS_SUCCESS, o gerenciador de configurações continua executando a operação do Registro.
Há suporte para o monitoramento de chamadas do Registro no Windows XP e em versões posteriores do Windows.
Bloqueio de chamadas do Registro
Um driver de filtragem de registro poderá bloquear operações do Registro se sua rotina RegistryCallback retornar um valor status para o qual NT_SUCCESS(status) é igual a FALSE (ou seja, um valor NTSTATUS sem êxito). Quando o gerenciador de configurações recebe um valor retornado sem êxito, ele retorna imediatamente para o thread de chamada com o valor de status especificado pelo driver. Portanto, um driver de filtragem de registro pode usar pré-notificações para impedir que as operações do Registro sejam processadas.
Se uma rotina RegistryCallback retornar um valor status para o qual NT_SUCCESS(status) for igual a FALSE para uma pré-notificação, o retorno de chamada pós-notificação da operação não ocorrerá.
Há suporte para o bloqueio de chamadas do Registro no Windows XP e em versões posteriores do Windows. Para o Windows Vista e posterior, o driver pode modificar os valores que a operação do Registro retorna para o thread de chamada. Esses valores estão contidos nas estruturas REG_XXX_KEY_INFORMATION para Windows Vista e posteriores.
Modificando chamadas do Registro
Um driver de filtragem de registro pode modificar os parâmetros de saída de uma operação do Registro ou o valor retornado. Além disso, o driver pode processar completamente uma operação do Registro em vez de permitir que o registro manipule a operação.
Quando a rotina RegistryCallback de um driver de filtragem de registro recebe uma pós-notificação, ele pode:
Modifique os parâmetros de saída que sua estrutura REG_XXX_KEY_INFORMATION contém e retorne STATUS_SUCCESS. O gerenciador de configurações retorna os parâmetros de saída modificados para o thread de chamada.
Há suporte para a modificação de parâmetros de saída no Windows Vista e posterior.
Modifique o valor retornado da operação do Registro fornecendo um valor status para o membro ReturnStatus da estrutura REG_POST_OPERATION_INFORMATION e retornando STATUS_CALLBACK_BYPASS. O gerenciador de configurações retorna o valor retornado especificado para o thread de chamada.
Nota Se o driver alterar um código de status de êxito para falha, talvez seja necessário desalocar objetos alocados pelo gerenciador de configurações. Como alternativa, se o driver alterar um código de status de falha para êxito, ele poderá precisar fornecer parâmetros de saída apropriados.
Há suporte para a modificação de valores retornados no Windows Vista e posterior.
Quando a rotina RegistryCallback de um driver de filtragem de registro recebe uma pré-notificação, a rotina pode lidar com a própria operação do Registro e, em seguida, retornar STATUS_CALLBACK_BYPASS. Quando o registro recebe STATUS_CALLBACK_BYPASS do driver, ele apenas retorna STATUS_SUCCESS para o thread de chamada e não processa a operação. O driver preempõe a operação do Registro e deve lidar completamente com ela, e o driver deve ter cuidado para retornar valores de saída válidos na estrutura REG_XXX_KEY_INFORMATION .
Os drivers podem preempção de operações do Registro no Windows Vista e posteriores.
Se uma rotina RegistryCallback retornar STATUS_CALLBACK_BYPASS para uma pré-notificação, o retorno de chamada pós-notificação da operação não ocorrerá.
Nota Várias chamadas do sistema de registro não são documentadas porque raramente são usadas e, quando são usadas, geralmente é para obter algum resultado não convencional no Registro. Modificar as operações executadas por essas chamadas é difícil e propenso a erros. Os desenvolvedores de driver não são desencorajados a tentar modificar as seguintes chamadas do sistema de registro:
- NtRestoreKey
- NtSaveKey
- NtSaveKeyEx
- NtLoadKeyEx
- NtUnloadKey2
- NtUnloadKeyEx
- NtReplaceKey
- NtRenameKey
- NtSetInformationKey