Gerenciando o tempo de vida dos objetos

Aviso

O UMDF 2 é a versão mais recente do UMDF e substitui o UMDF 1. Todos os novos drivers UMDF devem ser gravados usando UMDF 2. Nenhum novo recurso está sendo adicionado ao UMDF 1 e há suporte limitado para UMDF 1 em versões mais recentes do Windows 10. Os drivers universais do Windows devem usar o UMDF 2.

Os exemplos de UMDF 1 arquivados podem ser encontrados no Windows 11, versão 22H2 – Atualização de exemplos de driver de maio de 2022.

Para obter mais informações, consulte Introdução com UMDF.

O UMDF usa um esquema de contagem de referências para gerenciar o tempo de vida de objetos de retorno de chamada e objetos de estrutura.

Gerenciando referências a objetos de retorno de chamada Driver-Supplied

Na maioria dos casos, um driver não é necessário para manter uma referência a um objeto de retorno de chamada. Se os métodos da interface do objeto de retorno de chamada forem chamados apenas pela estrutura e por objetos cujos tempos de vida dependem do objeto de retorno de chamada e do objeto de estrutura emparelhada do objeto de retorno de chamada, o driver não precisará manter uma referência. Em outras palavras, o driver ou a estrutura podem chamar com segurança métodos de interfaces de objeto mais altos na hierarquia de objetos.

Gerenciando referências a objetos framework

No UMDF, os princípios gerais de tempo de vida COM e o modelo de tempo de vida específico do WDF determinam o tempo de vida dos objetos de estrutura. Seu driver deve atender aos critérios de ambos os modelos para que os objetos de estrutura sejam liberados da memória em momentos apropriados.

Gerenciamento de Tempo de Vida COM

Em COM, um chamador normalmente mantém uma referência ao objeto enquanto o objeto está em uso e, em seguida, o chamador libera a referência quando não exige mais o objeto . No entanto, um driver UMDF não precisa manter uma referência a um objeto de estrutura. Na verdade, o driver pode liberar uma referência de objeto de estrutura imediatamente após o driver criar o objeto framework.

Por exemplo, os exemplos de UMDF liberam o objeto do dispositivo depois que chamam IWDFDriver::CreateDevice. Embora a referência seja lançada antecipadamente, o objeto do dispositivo continua a existir até que o dispositivo seja removido porque a árvore de objetos do WDF mantém uma referência a ele.

Como o UMDF rastreia todos os objetos de estrutura em uma árvore de objetos, o driver não precisa manter uma referência a objetos de estrutura.

No entanto, se o driver mantiver uma referência a um objeto de estrutura, o driver deverá liberar a referência quando não precisar mais do objeto. Uma referência circular permanece em vigor até que o driver libere sua referência. Para evitar referências circulares, o driver normalmente não deve manter uma referência explícita a um objeto de estrutura.

Se o driver precisar manter uma referência a um objeto de estrutura, o objeto de retorno de chamada do driver também deverá implementar a interface IObjectCleanup . Quando o driver chama IWDFObject::D eleteWdfObject no objeto framework, o objeto framework chama o método IObjectCleanup::OnCleanup do objeto de retorno de chamada correspondente. A implementação de IObjectCleanup::OnCleanup deve liberar a referência ao objeto framework para permitir que a estrutura conclua a remoção do objeto framework.

Gerenciamento de Tempo de Vida do WDF

Se você estiver criando um objeto de um tipo que permite substituir o pai padrão, selecione um pai com um tempo de vida que corresponda ao tempo de vida do objeto. Para obter mais informações sobre objetos pai padrão e se o driver puder substituir o pai padrão, consulte a tabela em Objetos framework.

Se você corresponder ao tempo de vida do objeto, a estrutura excluirá seu objeto quando o objeto pai for excluído. Se você não corresponder aos tempos de vida do objeto e quiser que o objeto seja excluído antes que o pai padrão seja excluído, você poderá excluir explicitamente o objeto chamando DeleteWdfObject quando o objeto não for mais necessário.

Por exemplo, se você criar um novo objeto de solicitação e chamar IWDFDriver::CreateWdfMemory para criar um objeto de memória para essa solicitação, poderá especificar o objeto de solicitação como o pai do novo objeto de memória. Como o WDF exclui objetos filho quando o objeto pai é excluído, o driver não precisa chamar DeleteWdfObject para excluir o objeto de memória.

No entanto, se não houver nenhum pai cujo tempo de vida corresponda ao tempo de vida do objeto e se você quiser que o objeto seja excluído antes que o pai padrão seja excluído, você deverá usar a exclusão explícita. Por exemplo, um driver pode criar vários objetos de solicitação que são usados por uma curta duração. Nesse caso, o driver pode conservar a memória excluindo explicitamente as solicitações quando elas não são mais necessárias.

Da mesma forma, se você estiver criando um objeto que não permite substituir o pai padrão e se quiser que o objeto seja excluído antes que o pai padrão seja excluído, o driver deverá excluir explicitamente o objeto.