Condividi tramite


Eliminazione di un oggetto timer System-Allocated

A partire da Windows 8.1, la routine ExDeleteTimer elimina un oggetto timer creato dalla routine ExAllocateTimer. Questo oggetto timer è una struttura EX_TIMER allocata dal sistema i cui membri sono opachi ai driver. Prima dell'eliminazione di un oggetto timer, ExDeleteTimer disabilita ulteriori operazioni timer sull'oggetto e annulla o completa qualsiasi operazione in sospeso sull'oggetto che potrebbe essere in corso.

Dopo che un driver chiama ExDeleteTimer, questa routine esegue diversi passaggi per assicurarsi che possa eliminare in modo sicuro l'oggetto timer. Prima di tutto, ExDeleteTimer contrassegna l'oggetto timer come disabilitato per impedire al driver di avviare una nuova operazione timer che usa l'oggetto . Dopo aver disabilitato l'oggetto timer, una chiamata alla routine ExSetTimer o ExCancelTimer restituisce immediatamente FALSE e non esegue alcuna operazione. Inoltre, una seconda chiamata a ExDeleteTimer restituisceFALSE e non esegue alcuna operazione.

Successivamente, ExDeleteTimer verifica se un timer è ancora in sospeso da una chiamata precedente a ExDeleteTimer. La disabilitazione di un oggetto timer non annulla un timer impostato prima che l'oggetto sia stato disabilitato. In uno dei due casi seguenti, un timer impostato in precedenza potrebbe scadere dopo che l'oggetto timer è disabilitato:

  • Il timer è periodico.
  • Il timer è one-shot (o nonperiodic) e non è ancora scaduto.

Un timer periodico non può mai scadere più di una volta dopo che l'oggetto timer è disabilitato.

Se il driver implementa una routine di callback exTimerCallback , il parametro Timer per questa routine è garantito essere sempre un puntatore valido all'oggetto timer (una struttura EX_TIMER ), anche se il timer scade dopo la disabilitazione dell'oggetto timer.

Se non è in sospeso alcun timer, ExDeleteTimer elimina l'oggetto timer e restituisce senza attendere.

Se un timer è in sospeso quando viene chiamato ExDeleteTimer , i valori dei parametri Annulla e Wait forniti dal driver a questa routine controllano il comportamento della routine. Il parametro Cancel indica a ExDeleteTimer se provare a annullare un timer in sospeso. Il parametro Wait indica a ExDeleteTimer se attendere la restituzione fino all'eliminazione dell'oggetto timer.

Se Cancel è FALSE (in questo caso, Wait deve essere FALSE) e un timer è in sospeso, ExDeleteTimer consente al timer di scadere prima dell'eliminazione dell'oggetto timer. In questo caso, ExDeleteTimer contrassegna l'oggetto timer per indicare che deve essere eliminato dopo la scadenza del timer in sospeso (e qualsiasi ultimo callback alla routine ExTimerCallback termina). Quindi ExDeleteTimer restituisce senza attendere che il timer finisca la scadenza o che l'oggetto venga eliminato.

Se Cancel è TRUE, ExDeleteTimer tenta di annullare un timer in sospeso prima della scadenza. ExDeleteTimer restituisceTRUE se annulla correttamente il timer. ExDeleteTimer restituisceFALSE se non è in grado di annullare il timer, ovvero il caso di un timer one-shot già scaduto o in fase di scadenza. ExDeleteTimer restituisce anche FALSE se il timer (uno colpo o periodico) è stato annullato prima della chiamata exDeleteTimer o se il timer non è mai stato impostato.

Se Cancel è TRUE e Wait è FALSE, ExDeleteTimer non blocca mai il thread chiamante. Se l'oggetto timer non può essere eliminato immediatamente, ExDeleteTimer contrassegna l'oggetto timer per indicare che deve essere eliminato dopo la scadenza del timer in sospeso e restituisce immediatamente senza attendere la scadenza del timer o per l'eliminazione dell'oggetto.

Se Cancel e Wait sono entrambi TRUE, ExDeleteTimer blocca il thread chiamante se l'oggetto timer non può essere eliminato immediatamente. ExDeleteTimer attende, se necessario, per completare la scadenza del timer e per qualsiasi callback a una routine exTimerCallback implementata dal driver. Successivamente, ExDeleteTimer elimina l'oggetto timer e chiama la routine ExTimerDeleteCallback , se il driver implementa questa routine. Infine, ExDeleteTimer restituisce .

Un driver può chiamare ExDeleteTimer dalla routine ExTimerCallback del driver, che viene eseguita in IRQL = DISPATCH_LEVEL, ma il driver deve impostare il parametro Wait in questa chiamata su FALSE.

Come opzione, un driver può implementare una routine di callback ExTimerDeleteCallback eseguita dopo l'eliminazione di un oggetto timer. In genere, una routine ExTimerDeleteCallback libera qualsiasi risorsa di sistema allocata dal driver per l'uso con l'oggetto timer.

ExDeleteTimer pianifica una routine exTimerDeleteCallback implementata dal driver da eseguire dopo l'eliminazione dell'oggetto timer, al momento in cui il puntatore a questo oggetto non è più valido. Se il parametro Wait è TRUE nella chiamata ExDeleteTimer , il callback alla routine ExTimerDeleteCallback termina prima che ExDeleteTimer restituisca. Se Wait è FALSE, la routine ExTimerDeleteCallback potrebbe essere eseguita prima o dopo la restituzione di ExDeleteTimer .

Per altre informazioni, vedere Routine timer exxxxe oggetti EX_TIMER.