Eliminación de un objeto de temporizador de System-Allocated

A partir de Windows 8.1, la rutina ExDeleteTimer elimina un objeto de temporizador creado por la rutina ExAllocateTimer. Este objeto de temporizador es una estructura de EX_TIMER asignada por el sistema cuyos miembros son opacos para los controladores. Antes de eliminar un objeto de temporizador, ExDeleteTimer deshabilita más operaciones de temporizador en el objeto y cancela o completa cualquier operación pendiente en el objeto que pueda estar en curso.

Después de que un controlador llame a ExDeleteTimer, esta rutina realiza varios pasos para asegurarse de que puede eliminar de forma segura el objeto de temporizador. En primer lugar, ExDeleteTimer marca el objeto de temporizador como deshabilitado para evitar que el controlador inicie una nueva operación del temporizador que usa el objeto . Una vez deshabilitado el objeto de temporizador, una llamada a la rutina ExSetTimer o ExCancelTimer devuelve inmediatamente FALSE y no realiza ninguna operación. Además, una segunda llamada a ExDeleteTimer devuelve FALSE y no realiza ninguna operación.

A continuación, ExDeleteTimer comprueba si un temporizador sigue pendiente de una llamada anterior a ExDeleteTimer. Deshabilitar un objeto de temporizador no cancela un temporizador establecido antes de deshabilitar el objeto. En cualquiera de los dos casos siguientes, un temporizador que se estableció anteriormente podría expirar después de deshabilitar el objeto de temporizador:

  • El temporizador es periódico.
  • El temporizador es de un solo disparo (o noperiódico) y aún no ha expirado.

Un temporizador periódico nunca puede expirar más de una vez después de deshabilitar el objeto del temporizador.

Si el controlador implementa una rutina de devolución de llamada ExTimerCallback , se garantiza que el parámetro Timer de esta rutina siempre sea un puntero válido al objeto de temporizador (una estructura EX_TIMER ), incluso si el temporizador expira después de deshabilitar el objeto de temporizador.

Si no hay ningún temporizador pendiente, ExDeleteTimer elimina el objeto de temporizador y devuelve sin esperar.

Si hay un temporizador pendiente cuando se llama a ExDeleteTimer , los valores del parámetro Cancel y Wait que el controlador proporciona a esta rutina controlan el comportamiento de la rutina. El parámetro Cancel indica a ExDeleteTimer si se intenta cancelar un temporizador pendiente. El parámetro Wait indica a ExDeleteTimer si se debe esperar a que se devuelva hasta que se elimine el objeto del temporizador.

Si Cancel es FALSE (en cuyo caso, Wait debe ser FALSE) y un temporizador está pendiente, ExDeleteTimer permite que el temporizador expire antes de que se elimine el objeto del temporizador. En este caso, ExDeleteTimer marca el objeto de temporizador para indicar que se va a eliminar después de que expire el temporizador pendiente (y cualquier última devolución de llamada a la rutina ExTimerCallback finaliza). A continuación, ExDeleteTimer devuelve sin esperar a que el temporizador termine de expirar o para que se elimine el objeto.

Si Cancel es TRUE, ExDeleteTimer intenta cancelar un temporizador pendiente antes de que expire. ExDeleteTimer devuelve TRUE si cancela correctamente el temporizador. ExDeleteTimer devuelve FALSE si no puede cancelar el temporizador, que es el caso de un temporizador de un solo disparo que ya ha expirado o está en proceso de expiración. ExDeleteTimer también devuelve FALSE si el temporizador (one-shot o periódico) se canceló antes de la llamada a ExDeleteTimer o si el temporizador nunca se estableció.

Si Cancel es TRUE y Wait es FALSE, ExDeleteTimer nunca bloquea el subproceso que realiza la llamada. Si el objeto de temporizador no se puede eliminar inmediatamente, ExDeleteTimer marca el objeto de temporizador para indicar que se va a eliminar después de que el temporizador pendiente termine de expirar y se devuelva inmediatamente sin esperar a que expire el temporizador o para que se elimine el objeto.

Si Cancel y Wait son TRUE, ExDeleteTimer bloquea el subproceso que llama si el objeto del temporizador no se puede eliminar inmediatamente. ExDeleteTimer espera, si es necesario, para que el temporizador termine de expirar y para que finalice cualquier devolución de llamada a una rutina exTimerCallback implementada por el controlador. A continuación, ExDeleteTimer elimina el objeto de temporizador y llama a la rutina ExTimerDeleteCallback , si el controlador implementa esta rutina. Por último, ExDeleteTimer devuelve.

Un controlador puede llamar a ExDeleteTimer desde la rutina ExTimerCallback del controlador, que se ejecuta en IRQL = DISPATCH_LEVEL, pero el controlador debe establecer el parámetro Wait en esta llamada a FALSE.

Como opción, un controlador puede implementar una rutina de devolución de llamada ExTimerDeleteCallback que se ejecuta después de eliminar un objeto de temporizador. Normalmente, una rutina ExTimerDeleteCallback libera los recursos del sistema que el controlador ha asignado para usar con el objeto de temporizador.

ExDeleteTimer programa una rutina exTimerDeleteCallback implementada por el controlador para que se ejecute después de eliminar el objeto del temporizador, momento en el que el puntero a este objeto ya no es válido. Si el parámetro Wait es TRUE en la llamada ExDeleteTimer , la devolución de llamada a la rutina ExTimerDeleteCallback finaliza antes de que se devuelva ExDeleteTimer . Si Wait es FALSE, la rutina ExTimerDeleteCallback podría ejecutarse antes o después de que se devuelva ExDeleteTimer .

Para obtener más información, vea ExXxxTimer Routines and EX_TIMER Objects.