Löschen eines System-Allocated Timer-Objekts
Ab Windows 8.1 löscht die ExDeleteTimer-Routine ein Timerobjekt, das von der ExAllocateTimer-Routine erstellt wurde. Dieses Timerobjekt ist eine systemseitig zugeordnete EX_TIMER-Struktur , deren Member für Treiber undurchsichtig sind. Bevor ein Timerobjekt gelöscht wird, deaktiviert ExDeleteTimer weitere Timervorgänge für das Objekt und bricht jeden ausstehenden Vorgang für das Objekt ab, der möglicherweise ausgeführt wird.
Nachdem ein Treiber ExDeleteTimer aufgerufen hat, führt diese Routine mehrere Schritte aus, um sicherzustellen, dass das Timerobjekt sicher gelöscht werden kann. Zunächst markiert ExDeleteTimer das Timerobjekt als deaktiviert, um zu verhindern, dass der Treiber einen neuen Timervorgang startet, der das Objekt verwendet. Nachdem das Timerobjekt deaktiviert wurde, gibt ein Aufruf der ExSetTimer - oder ExCancelTimer-Routine sofort FALSE zurück und führt keinen Vorgang aus. Außerdem gibt ein zweiter Aufruf von ExDeleteTimerFALSE zurück und führt keinen Vorgang aus.
Als Nächstes überprüft ExDeleteTimer , ob ein Timer von einem vorherigen Aufruf von ExDeleteTimer noch aussteht. Durch das Deaktivieren eines Timerobjekts wird kein Timer abgebrochen, der vor der Deaktivierung des Objekts festgelegt wurde. In einem der beiden folgenden Fälle läuft ein zuvor festgelegter Timer möglicherweise ab, nachdem das Timerobjekt deaktiviert wurde:
- Der Timer ist periodisch.
- Der Timer ist one-shot (oder nichtperiodisch) und ist noch nicht abgelaufen.
Ein periodischer Timer kann nie mehr als einmal ablaufen, nachdem das Timerobjekt deaktiviert wurde.
Wenn Ihr Treiber eine ExTimerCallback-Rückrufroutine implementiert, wird garantiert, dass der Timer-Parameter für diese Routine immer ein gültiger Zeiger auf das Zeitgeberobjekt (eine EX_TIMER-Struktur ) ist, auch wenn der Timer abläuft, nachdem das Timerobjekt deaktiviert wurde.
Wenn kein Timer aussteht, löscht ExDeleteTimer das Timerobjekt und gibt ohne Wartezeit zurück.
Wenn ein Timer aussteht, wenn ExDeleteTimer aufgerufen wird, steuern die Parameterwerte Cancel und Wait , die Ihr Treiber für diese Routine bereitstellt, das Verhalten der Routine. Der Cancel-Parameter teilt ExDeleteTimer mit, ob versucht werden soll, einen ausstehenden Timer abzubrechen. Der Wait-Parameter teilt ExDeleteTimer mit, ob auf die Rückgabe gewartet werden soll, bis das Timerobjekt gelöscht wird.
Wenn Cancelfalse ist (in diesem Fall muss WaitFALSE sein) und ein Timer ausstehend ist, lässt ExDeleteTimer den Timer ablaufen, bevor das Timerobjekt gelöscht wird. In diesem Fall markiert ExDeleteTimer das Timerobjekt , um anzugeben, dass es gelöscht werden soll, nachdem der ausstehende Timer abläuft (und jeder letzte Rückruf der ExTimerCallback-Routine beendet wird). Anschließend wird ExDeleteTimer zurückgegeben, ohne darauf zu warten, dass der Timer abläuft oder das Objekt gelöscht wird.
Wenn CancelTRUE ist, versucht ExDeleteTimer , einen ausstehenden Timer abzubrechen, bevor er abläuft. ExDeleteTimer gibt TRUE zurück, wenn der Timer erfolgreich abgebrochen wird. ExDeleteTimer gibt FALSE zurück, wenn der Timer nicht abgebrochen werden kann. Dies ist bei einem One-Shot-Timer der Fall, der bereits abgelaufen ist oder sich gerade im Ablauf befindet. ExDeleteTimer gibt auch FALSE zurück, wenn der (einmalige oder periodische) Timer vor dem ExDeleteTimer-Aufruf abgebrochen wurde oder wenn der Timer nie festgelegt wurde.
Wenn CancelTRUE und Waitfalse ist, blockiert ExDeleteTimer den aufrufenden Thread nie. Wenn das Timerobjekt nicht sofort gelöscht werden kann, markiert ExDeleteTimer das Timerobjekt, um anzugeben, dass es gelöscht werden soll, nachdem der ausstehende Timer abläuft, und gibt sofort zurück, ohne darauf zu warten, dass der Timer abläuft oder das Objekt gelöscht wird.
Wenn Cancel und Waittrue sind, blockiert ExDeleteTimer den aufrufenden Thread, wenn das Timerobjekt nicht sofort gelöscht werden kann. ExDeleteTimer wartet bei Bedarf darauf, dass der Timer abläuft und jeder Rückruf einer vom Treiber implementierten ExTimerCallback-Routine abgeschlossen ist. Als Nächstes löscht ExDeleteTimer das Timerobjekt und ruft die ExTimerDeleteCallback-Routine auf, wenn der Treiber diese Routine implementiert. Schließlich wird ExDeleteTimer zurückgegeben.
Ein Treiber kann ExDeleteTimer aus der ExTimerCallback-Routine des Treibers aufrufen, die mit IRQL = DISPATCH_LEVEL ausgeführt wird, aber der Treiber muss den Parameter Wait in diesem Aufruf auf FALSE festlegen.
Optional kann ein Treiber eine ExTimerDeleteCallback-Rückrufroutine implementieren, die ausgeführt wird, nachdem ein Timerobjekt gelöscht wurde. In der Regel gibt eine ExTimerDeleteCallback-Routine alle Systemressourcen frei, die der Treiber für die Verwendung mit dem Timerobjekt zugewiesen hat.
ExDeleteTimer plant die Ausführung einer vom Treiber implementierten ExTimerDeleteCallback-Routine , nachdem das Timerobjekt gelöscht wurde, wobei der Zeiger auf dieses Objekt nicht mehr gültig ist. Wenn der Wait-Parameter im ExDeleteTimer-Aufruf TRUE ist, wird der Rückruf für die ExTimerDeleteCallback-Routine abgeschlossen, bevor ExDeleteTimer zurückgegeben wird. Wenn Waitfalse ist, kann die ExTimerDeleteCallback-Routine vor oder nach der Rückgabe von ExDeleteTimer ausgeführt werden.
Weitere Informationen finden Sie unter Ex Xxx-Timerroutinen und EX_TIMER-Objekte.