Ciclo de Vida do Objeto Framework
O "ciclo de vida" de um objeto de estrutura abrange o tempo de quando um objeto é criado para quando ele é excluído. A contagem de referências de um objeto controla quando ele será excluído.
Criando um objeto Framework
A maioria dos objetos de estrutura é criada por uma chamada de 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 usuário abre um dispositivo para operações de leitura ou gravação, a estrutura cria um objeto de arquivo de estrutura e o passa 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 gerente 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 uma contagem de referência 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 driver e diminui a contagem quando o driver não precisa mais do objeto.
Os drivers chamam WdfObjectReference para garantir que um objeto não seja excluído (pela estrutura ou por um thread de driver) antes que o driver termine de usá-lo. Para obter um exemplo de situação em que um driver deve chamar WdfObjectReference e WdfObjectDereference, consulte Sincronizando o cancelamento de solicitações enviadas.
Excluindo um objeto Framework
Os objetos são excluídos porque um driver chama WdfObjectDelete ou porque a estrutura chama uma rotina de exclusão interna, mas um objeto é excluído somente se sua contagem de referência for zero. Depois que o driver ou a estrutura tentar excluir um objeto, o identificador do objeto permanecerá válido até que a contagem de referência se torne 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 de estrutura for o objeto filho de um pai e o pai estiver sendo excluído, a estrutura tentará excluir o objeto filho antes de excluir o pai. A exclusão de objeto começa do objeto mais distante do pai e funciona até a hierarquia de objetos em direção à raiz.
Os drivers podem registrar as duas funções de retorno de chamada a seguir que a estrutura chama quando o driver ou a estrutura está excluindo um objeto:
Uma função de retorno de chamada EvtCleanupCallback , que a estrutura chama para que o driver possa chamar WdfObjectDereference se ele já tivesse chamado WdfObjectReference para o objeto que está sendo excluído.
Uma função de retorno de chamada EvtDestroyCallback , que a estrutura chama depois que a contagem de referência do objeto foi decrementada para zero.
Uma dessas funções de retorno de chamada deve desalocar todos os recursos específicos do objeto alocados pelo driver quando o objeto foi criado.
A estrutura sempre manipula 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.