Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O "ciclo de vida" de um objeto de estrutura abrange o tempo desde quando um objeto é criado até quando ele é excluído. A contagem de referência de um objeto controla quando ele será excluído.
Criando um objeto Framework
A maioria dos objetos de estrutura são criados pela chamada de um driver para o método de criação do objeto. Por exemplo, cada driver de estrutura deve chamar WdfDriverCreate para criar um objeto de driver de estrutura.
Outros objetos de estrutura são criados pela estrutura. Por exemplo, quando um aplicativo de utilizador abre um dispositivo para operações de leitura ou escrita, a estrutura cria um objeto de arquivo de estrutura e passa-o para a função de retorno de chamada EvtDeviceFileCreate do driver .
Alguns objetos de estrutura podem ser criados pela estrutura ou por um driver. Por exemplo, quando o gerenciador de E/S entrega uma solicitação de E/S a um driver, a estrutura cria um objeto de solicitação de estrutura e o entrega ao driver, normalmente chamando um dos manipuladores de solicitação do driver. Um driver também pode criar objetos de solicitação de estrutura e entregá-los a outros drivers.
Usando contagens de referência
A estrutura mantém um contador de referências para cada objeto. Quando um objeto é criado, a estrutura define sua contagem de referência como um. Se a contagem de referência se tornar zero, a estrutura excluirá o objeto.
Os drivers podem modificar a contagem de referência de um objeto chamando WdfObjectReference para incrementar a contagem de referência ou WdfObjectDereference para diminuir a contagem de referência. (Um driver pode chamar WdfObjectDereference somente se tiver chamado anteriormente WdfObjectReference.)
Na maioria dos casos, os drivers não precisam incrementar ou diminuir a contagem de referência de um objeto. A estrutura incrementa a contagem antes de passar o identificador do objeto para o controlador e diminui a contagem quando o controlador já não precisa do objeto.
Os drivers chamam WdfObjectReference para garantir que um objeto não será eliminado (pela framework ou por um thread do driver) antes que o driver termine de usá-lo. Para ver um exemplo de uma situação em que um driver deve chamar WdfObjectReference e WdfObjectDereference, consulte Sincronização do cancelamento de solicitações enviadas.
Excluindo um objeto Framework
Os objetos são eliminados quer porque um driver chama WdfObjectDelete, quer porque o framework chama uma rotina interna de eliminação, mas um objeto é eliminado apenas se a sua contagem de referências for zero. Depois que o driver ou o framework tiver tentado excluir um objeto, o identificador do objeto permanecerá válido até que a contagem de referências chegue a zero. Um driver não pode excluir um objeto simplesmente chamando WdfObjectDereference para diminuir a contagem de referência do objeto para zero - o driver também deve chamar WdfObjectDelete.
Se um objeto framework for o objeto filho de um pai e o pai estiver sendo excluído, o framework tentará excluir o objeto filho antes de excluir o pai. A exclusão de objeto começa a partir do objeto mais distante do pai e sobe pela hierarquia de objetos em direção à raiz.
Os drivers podem registar as seguintes duas funções de retorno de chamada, que o framework chama quando o driver ou o framework está a eliminar um objeto:
Uma EvtCleanupCallback função de retorno de chamada, que o framework chama para que o driver possa chamar WdfObjectDereference se ele tivesse chamado anteriormente WdfObjectReference para o objeto que está sendo eliminado.
Uma função de retorno de chamada EvtDestroyCallback, que o framework chama depois que a contagem de referência do objeto é reduzida para zero.
Uma dessas funções de retorno de chamada deve desalocar todos os recursos específicos do objeto que o driver alocou quando o objeto foi criado.
A estrutura sempre lida com a exclusão de alguns objetos de estrutura e os drivers não devem tentar excluir esses objetos. Para obter uma lista de objetos de estrutura que os drivers não podem excluir, consulte WdfObjectDelete.