Ponteiros de objeto de chave inválidos em notificações do Registro
Para evitar erros fatais e possível corrupção de memória, um driver de filtragem de registro não deve tentar acessar um objeto de chave usando um ponteiro de objeto inválido. Este tópico lista as circunstâncias em que o membro Object de uma estrutura de notificação de retorno de chamada do Registro pode conter um valor não NULL indefinido.
Em um driver de filtragem de registro, o segundo parâmetro da rotina RegistryCallback é um valor de enumeração REG_NOTIFY_CLASS . Esse valor indica para qual tipo de estrutura de notificação de retorno de chamada do Registro o terceiro parâmetro da rotina RegistryCallback aponta. A estrutura de notificação contém informações sobre a operação do Registro. O tipo dessa estrutura varia de acordo com a operação do Registro que está sendo executada.
Muitos dos tipos de estrutura de notificação contêm um membro Object que aponta para um objeto de chave. Em alguns casos, o membro Object pode conter um valor que não é NULL, mas não é um ponteiro para um objeto de chave válido.
O valor do objeto key é indefinido
Se o segundo parâmetro em uma chamada para a rotina RegistryCallback de um driver de filtragem do Registro for um REG_NOTIFY_CLASS valor de enumeração regNtPostCreateKeyEx ou RegNtPostOpenKeyEx, o terceiro parâmetro será um ponteiro para uma estrutura REG_POST_OPERATION_INFORMATION . O membro Object dessa estrutura será válido somente se o membro Status da estrutura estiver definido como STATUS_SUCCESS. Qualquer outro valor status, incluindo um código de status diferente de zero para o qual a macro NT_SUCCESS é avaliada como TRUE, indica que o valor do membro Object é indefinido.
O valor do objeto key não está em um estado válido
Se o segundo parâmetro em um retorno de chamada do Registro for um dos seguintes valores de enumeração REG_NOTIFY_CLASS , o membro Object da estrutura de notificação de retorno de chamada do Registro apontará para um objeto de chave que está sendo destruído e cuja contagem de referência é zero:
RegNtPreKeyHandleClose (estrutura REG_KEY_HANDLE_CLOSE_INFORMATION )
RegNtPostKeyHandleClose (estrutura REG_POST_OPERATION_INFORMATION )
RegNtCallbackObjectContextCleanup (estrutura REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION )
Como o membro Object aponta para um objeto de chave que não está em um estado válido, o driver de filtragem do Registro não deve passar o valor do ponteiro object como um parâmetro para uma rotina de suporte do driver do Windows (por exemplo, ObReferenceObjectByPointer).
No entanto, durante uma chamada registryCallback para manipular uma notificação RegNtPreKeyHandleClose ou RegNtPostKeyHandleClose , um driver de filtro do Registro pode chamar uma rotina do gerenciador de configurações (por exemplo, CmGetBoundTransaction) que usa um objeto do Registro como um parâmetro.