Excluindo um objeto timer System-Allocated
Começando com Windows 8.1, a rotina ExDeleteTimer exclui um objeto de temporizador que foi criado pela rotina ExAllocateTimer. Esse objeto de temporizador é uma estrutura de EX_TIMER alocada pelo sistema cujos membros são opacos aos drivers. Antes que um objeto de temporizador seja excluído, ExDeleteTimer desabilita outras operações de temporizador no objeto e cancela ou conclui qualquer operação pendente no objeto que possa estar em andamento.
Depois que um driver chama ExDeleteTimer, essa rotina executa várias etapas para garantir que ele possa excluir com segurança o objeto de temporizador. Primeiro, ExDeleteTimer marca o objeto de temporizador como desabilitado para impedir que o driver inicie uma nova operação de temporizador que usa o objeto . Depois que o objeto de temporizador é desabilitado, uma chamada para a rotina ExSetTimer ou ExCancelTimer retorna imediatamente FALSE e não executa nenhuma operação. Além disso, uma segunda chamada para ExDeleteTimer retorna FALSE e não executa nenhuma operação.
Em seguida, ExDeleteTimer verifica se um temporizador ainda está pendente de uma chamada anterior para ExDeleteTimer. Desabilitar um objeto de temporizador não cancela um temporizador que foi definido antes de o objeto ser desabilitado. Em um dos dois casos a seguir, um temporizador definido anteriormente pode expirar depois que o objeto de temporizador for desabilitado:
- O temporizador é periódico.
- O temporizador é one-shot (ou nãoperiódico) e ainda não expirou.
Um temporizador periódico nunca pode expirar mais de uma vez depois que o objeto de temporizador é desabilitado.
Se o driver implementar uma rotina de retorno de chamada ExTimerCallback , o parâmetro Timer para essa rotina será sempre um ponteiro válido para o objeto de temporizador (uma estrutura EX_TIMER ), mesmo que o temporizador expire após o objeto de temporizador ser desabilitado.
Se nenhum temporizador estiver pendente, ExDeleteTimer excluirá o objeto de temporizador e retornará sem esperar.
Se um temporizador estiver pendente quando ExDeleteTimer for chamado, os valores dos parâmetros Cancelar e Aguardar fornecidos pelo driver para essa rotina controlarão o comportamento da rotina. O parâmetro Cancel informa ao ExDeleteTimer se deseja tentar cancelar um temporizador pendente. O parâmetro Wait informa a ExDeleteTimer se deve aguardar para retornar até que o objeto de temporizador seja excluído.
Se Cancel for FALSE (nesse caso, Wait deve ser FALSE) e um temporizador estiver pendente, ExDeleteTimer permitirá que o temporizador expire antes que o objeto de temporizador seja excluído. Nesse caso, ExDeleteTimer marca o objeto de temporizador para indicar que ele deve ser excluído depois que o temporizador pendente expirar (e qualquer último retorno de chamada para a rotina ExTimerCallback for concluído). Em seguida, ExDeleteTimer retorna sem esperar que o temporizador termine de expirar ou para que o objeto seja excluído.
Se Cancelar for TRUE, ExDeleteTimer tentará cancelar um temporizador pendente antes de expirar. ExDeleteTimer retornará TRUE se cancelar com êxito o temporizador. ExDeleteTimer retornará FALSE se não puder cancelar o temporizador, que é o caso de um temporizador único que já expirou ou está em processo de expiração. ExDeleteTimer também retornará FALSE se o temporizador (one-shot ou periódico) tiver sido cancelado antes da chamada de ExDeleteTimer ou se o temporizador nunca tiver sido definido.
Se Cancelar for TRUE e Wait for FALSE, ExDeleteTimer nunca bloqueará o thread de chamada. Se o objeto de temporizador não puder ser excluído imediatamente, ExDeleteTimer marcará o objeto de temporizador para indicar que ele deve ser excluído depois que o temporizador pendente terminar de expirar e retornará imediatamente sem esperar que o temporizador expire ou que o objeto seja excluído.
Se Cancel e Wait forem TRUE, ExDeleteTimer bloqueará o thread de chamada se o objeto de temporizador não puder ser excluído imediatamente. O ExDeleteTimer aguarda, se necessário, que o temporizador termine de expirar e que qualquer retorno de chamada para uma rotina ExTimerCallback implementada pelo driver seja concluída. Em seguida, ExDeleteTimer exclui o objeto de temporizador e chama a rotina ExTimerDeleteCallback , se o driver implementa essa rotina. Por fim, ExDeleteTimer retorna.
Um driver pode chamar ExDeleteTimer da rotina ExTimerCallback do driver, que é executada em IRQL = DISPATCH_LEVEL, mas o driver deve definir o parâmetro Wait nessa chamada como FALSE.
Como opção, um driver pode implementar uma rotina de retorno de chamada ExTimerDeleteCallback que é executada depois que um objeto de temporizador é excluído. Normalmente, uma rotina ExTimerDeleteCallback libera todos os recursos do sistema que o driver alocou para usar com o objeto de temporizador.
ExDeleteTimer agenda uma rotina ExTimerDeleteCallback implementada pelo driver para ser executada após a exclusão do objeto de temporizador, momento em que o ponteiro para esse objeto não é mais válido. Se o parâmetro Wait for TRUE na chamada exDeleteTimer , o retorno de chamada para a rotina ExTimerDeleteCallback será concluído antes que ExDeleteTimer retorne. Se Wait for FALSE, a rotina ExTimerDeleteCallback poderá ser executada antes ou depois que ExDeleteTimer retornar.
Para obter mais informações, consulte ExXxxTimer Routines and EX_TIMER Objects.