Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een stuurprogramma kan een CustomTimerDpc-routine registreren door de volgende routines aan te roepen, meestal uit de AddDevice-routine :
KeInitializeDpc om zijn routine te registreren
KeInitializeTimer of KeInitializeTimerEx om een timerobject in te stellen
Vervolgens kan het stuurprogramma KeSetTimer of KeSetTimerEx aanroepen om een verlooptijd op te geven en het timerobject toe te voegen aan de timerwachtrij van het systeem. Wanneer de verlooptijd is bereikt, wordt het timerobject in de wachtrij geplaatst en wordt de CustomTimerDpc-routine aangeroepen. De volgende afbeelding illustreert deze aanroepen.
Zoals in de vorige afbeelding wordt weergegeven, moet het stuurprogramma opslag leveren voor zowel een DPC-object als een timerobject. De meeste stuurprogramma's bieden de opslag voor deze objecten in een apparaatextensie of in een ander geheugen dat aan stuurprogramma's is toegewezen.
In de aanroep van KeSetTimer geeft het stuurprogramma de aanwijzers door aan de Dpc - en Timer-objecten , samen met een DueTime uitgedrukt in eenheden van 100 nanoseconden, zoals weergegeven in de vorige afbeelding. Een positieve waarde voor DueTime geeft een absolute verlooptijd aan (sinds 1 januari 1601) waarop de CustomTimerDpc-routine moet worden aangeroepen. Een negatieve waarde voor DueTime geeft een relatieve verlooptijd aan.
Omdat een absolute timer op een specifieke systeemtijd verloopt, wordt de wachttijd van een absolute timer niet beïnvloed als de systeemtijd verandert voordat de timer verloopt. Aan de andere kant verloopt een relatieve timer altijd nadat het opgegeven aantal tijdseenheden is verstreken, ongeacht de wijzigingen in de absolute systeemtijd.
Als u herhaaldelijk een CustomTimerDpc-routine wilt aanroepen, gebruikt u KeSetTimerEx om de timer in te stellen en een terugkerend interval op te geven in de parameter Periode . KeSetTimerEx is net als KeSetTimer , met uitzondering van deze extra parameter.
Zoals in de vorige afbeelding wordt weergegeven, wordt het timerobject voor een opgegeven interval als volgt in de wachtrij geplaatst door de aanroep naar KeSetTimer of KeSetTimerEx :
Wanneer de DueTime verloopt, wordt het timerobject uit de wachtrij verwijderd en ingesteld op de status Gesignaleerd.
Als elke processor op de computer momenteel code uitvoert op een IRQL groter dan of gelijk aan DISPATCH_LEVEL, wordt het DPC-object dat is gekoppeld aan het timerobject in een DPC-wachtrij geplaatst. Anders wordt de CustomTimerDpc-routine aangeroepen.
Als het DPC-object zich al in de wachtrij bevond toen het DueTime-interval is verlopen, wordt de CustomTimerDpc-routine aangeroepen zodra de IRQL op een processor op de computer onder DISPATCH_LEVEL valt.
Opmerking
De CustomTimerDpc-routine , zoals alle DPC-routines, wordt aangeroepen bij IRQL = DISPATCH_LEVEL. Hoewel een DPC-routine wordt uitgevoerd, kunnen alle threads niet worden uitgevoerd op dezelfde processor. Stuurprogrammaontwikkelaars moeten hun CustomTimerDpc-routines zorgvuldig ontwerpen om zo kort mogelijk uit te voeren.
Het kleinste tijdsinterval dat kan worden opgegeven voor KeSetTimer en KeSetTimerEx is ongeveer tien milliseconden, zodat een stuurprogramma een CustomTimerDpc-routine kan gebruiken wanneer het tijdsinterval kleiner is dan een IoTimer-routine , die eenmaal per seconde wordt uitgevoerd, kan verwerken.
Slechts één instantie van een bepaald timerobject kan op elk moment in de wachtrij worden geplaatst. Als u KeSetTimer of KeSetTimerEx opnieuw aanroept met dezelfde timerobjectaanwijzer , wordt het timerobject in de wachtrij geannuleerd en opnieuw ingesteld.
Het instellen van een CustomTimerDpc-routine is precies hetzelfde als het instellen van een CustomDpc-routine , met een extra stap om het timerobject te initialiseren. In feite zijn hun prototypen identiek, maar CustomTimerDpc-routine kan de twee SystemArgument-aanwijzers die in het prototype zijn gedeclareerd, niet gebruiken.