ExXxxTimer-Routinen und EX_TIMER-Objekte

Ab Windows 8.1 steht ein umfassender Satz von ExXxxTimer-Routinen zur Verwaltung von Zeitgebern zur Verfügung. Diese Routinen verwenden Zeitgeberobjekte, die auf der EX_TIMER-Struktur basieren. Die Ex Xxx-Timerroutinen ersetzen die KeXxxTimer-Routinen, die ab Windows 2000 verfügbar sind. Treiber, die nur unter Windows 8.1 und höheren Versionen von Windows ausgeführt werden sollen, können die Ex Xxx-Timerroutinen anstelle der Ke Xxx-Timerroutinen verwenden. Windows 8.1 und höheren Versionen von Windows unterstützen weiterhin die KeXxxTimer-Routinen.

Die ExXxxTimer-Routinen verfügen über alle wichtigen Funktionen, die von den KeXxxTimer-Routinen bereitgestellt werden. Darüber hinaus unterstützen die Ex Xxx-Zeitgeberroutinen zwei Zeitgebertypen, Zeitgeber mit hoher Auflösung und Timer ohne Aktivierung, die von den Ke Xxx-Zeitgeberroutinen nicht unterstützt werden. Timer mit hoher Auflösung sind Zeitgeber, deren Ablaufzeiten mit höherer Genauigkeit angegeben werden können als timer, deren Genauigkeit durch die Standardauflösung der Systemuhr begrenzt ist. Timer ohne Aktivierung sind Timer, die vermeiden, dass Prozessoren unnötig aus Stromsparzuständen aktiviert werden. Weitere Informationen finden Sie in den folgenden Themen:

Timer mit hoher Auflösung

Timer ohne Aktivierung

Ab Windows 8.1 sind die folgenden Ex Xxx-Timerroutinen verfügbar:

ExAllocateTimer

ExSetTimer

ExCancelTimer

ExDeleteTimer

Die ExSetTimer-Routine kann anstelle der KeSetTimer - oder KeSetTimerEx-Routine verwendet werden. Die ExCancelTimer-Routine kann anstelle der KeCancelTimer-Routine verwendet werden.

Die Routinen ExAllocateTimer und ExDeleteTimer verfügen über keine direkten Ke Xxx-Timer-Entsprechungen. Diese beiden Routinen ordnen ein Timerobjekt zu und geben es frei. Dieses Timerobjekt ist eine systemseitig zugeordnete EX_TIMER-Struktur , deren Member für Treiber undurchsichtig sind. Im Gegensatz dazu ist das timer-Objekt, das von den Ke Xxx-Timerroutinen verwendet wird, eine vom Treiber zugewiesene KTIMER-Struktur. Der Treiber ruft die KeInitializeTimer - oder KeInitializeTimerEx-Routine auf, um dieses Objekt zu initialisieren. ExAllocateTimer initialisiert die Timerobjekte, die zugewiesen werden. Weitere Informationen zu ExDeleteTimer finden Sie unter Löschen eines System-Allocated Timer-Objekts.

EX_TIMER - und KTIMER-Strukturen sind wartebare Objekte. Nachdem ein Treiber ExSetTimer, KeSetTimer oder KeSetTimerEx aufgerufen hat, um einen Timer festzulegen, kann der Treiber eine Routine wie KeWaitForSingleObject oder KeWaitForMultipleObjects aufrufen, um auf das Ablaufen des Timers zu warten. Das Timerobjekt wird signalisiert, wenn der Timer abläuft. Optional kann ein Treiber einen Zeiger auf eine vom Treiber implementierte ExTimerCallback - oder CustomTimerDpc-Rückrufroutine bereitstellen, die das Betriebssystem nach Ablauf des Timers aufruft.

Die Ke Xxx-Timerroutinen verfügen über zwei Funktionen, die nicht von den Ex Xxx-Timerroutinen bereitgestellt werden, aber diese Funktionen werden von den meisten Treibern nicht benötigt.

Zunächst wird die KTIMER-Struktur, die von den Ke Xxx-Timerroutinen als Zeitgeberobjekt verwendet wird, vom Treiber zugewiesen. Der Treiber kann dieses Objekt vorab zuweisen, um sicherzustellen, dass das Objekt auch in Situationen verfügbar ist, in denen Ressourcen eingeschränkt sind und Speicherbelegungen fehlschlagen können. Im Gegensatz dazu kann ein Aufruf von ExAllocateTimer zum Zuordnen eines Timerobjekts in einer umgebung mit Ressourcenbeschränkung fehlschlagen. Allerdings müssen nur wenige Treiber für den Betrieb in Umgebungen konzipiert werden, in denen Speicherbelegungen fehlschlagen, und die meisten Treiber profitieren vom Komfort einer ExAllocateTimer-Routine , die sowohl ein Zeitgeberobjekt zuordnet als auch initialisiert.

Zweitens gibt es keine Ex Xxx-Timer-Entsprechung der KeReadStateTimer-Routine, die angibt, ob sich ein Timerobjekt im signalierten Zustand befindet. Diese Routine wird jedoch selten verwendet. Bei Bedarf kann ein Treiber, der die Ex Xxx-Zeitgeberroutinen verwendet, überprüfen, ob sich ein Timerobjekt im signalierten Zustand befindet, indem er einen booleschen Wert liest, der von der ExTimerCallback-Rückrufroutine festgelegt wird, die der Treiber für die ExAllocateTimer-Routine bereitstellt.