Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ovladač může zaregistrovat rutinu CustomTimerDpc voláním následujících rutin, obvykle z rutiny AddDevice :
KeInitializeDpc pro registraci své rutiny
KeInitializeTimer nebo KeInitializeTimerEx k nastavení objektu časovače
Následně může ovladač volat KeSetTimer nebo KeSetTimerEx určit čas vypršení platnosti a přidat objekt časovače do fronty časovače systému. Po dosažení doby vypršení platnosti systém odřadí objekt časovače a zavolá rutinu CustomTimerDpc . Následující obrázek znázorňuje tato volání.
Jak ukazuje předchozí obrázek, ovladač musí zadat úložiště pro objekt DPC i objekt časovače. Většina ovladačů poskytuje úložiště těchto objektů v rozšíření zařízení nebo v jiné přidělené paměti ovladače.
Ve volání KeSetTimer ovladač předá ukazatele na objekty Dpc a Timer spolu s dueTime vyjádřenou v jednotkách 100 nanosekund, jak je znázorněno na předchozím obrázku. Kladná hodnota pro DueTime určuje absolutní čas vypršení platnosti (od 1. ledna 1601), při kterém má být volána rutina CustomTimerDpc . Záporná hodnota dueTime určuje relativní čas vypršení platnosti.
Vzhledem k tomu, že absolutní časovač vyprší v určitém systémovém čase, doba čekání absolutního časovače není ovlivněna, pokud se systémový čas změní před vypršením platnosti časovače. Na druhou stranu relativní časovač vždy vyprší po uplynutí zadaného počtu časových jednotek bez ohledu na změny absolutního systémového času.
Chcete-li volat rutinu CustomTimerDpc opakovaně, použijte KeSetTimerEx k nastavení časovače a zadejte opakovaný interval v parametru Period . KeSetTimerEx je stejně jako KeSetTimer s výjimkou tohoto dalšího parametru.
Jak je znázorněno na předchozím obrázku, volání KeSetTimer nebo KeSetTimerEx zařadí objekt časovače do fronty pro zadaný interval následujícím způsobem:
Když vyprší DueTime, objekt časovače je vyřazen z fronty a nastaven do stavu "Signalizováno".
Pokud každý procesor v počítači aktuálně spouští kód na IRQL, který je větší nebo roven DISPATCH_LEVEL, je objekt DPC, který je přidružen k objektu časovače, umístěn do fronty DPC. Jinak se volá procedura CustomTimerDpc.
Pokud objekt DPC byl již ve frontě, když vypršela platnost intervalu DueTime , je rutina CustomTimerDpc volána, jakmile IRQL na libovolném procesoru v počítači spadá pod DISPATCH_LEVEL.
Poznámka:
Rutina CustomTimerDpc, podobně jako všechny rutiny DPC, je volána na úrovni IRQL = DISPATCH_LEVEL. Při spuštění rutiny DPC jsou všechna vlákna zabráněna v běhu na stejném procesoru. Vývojáři ovladačů by měli pečlivě navrhnout své rutiny CustomTimerDpc tak, aby běžely co nejkratší dobu.
Nejmenší časový interval, který lze zadat pro KeSetTimer a KeSetTimerEx , je přibližně deset milisekund, takže ovladač může použít rutinu CustomTimerDpc při časování menších intervalů než rutina IoTimer , která se spouští jednou za sekundu.
V každém okamžiku je možné zařazení do fronty pouze jedné instance konkrétního objektu časovače. Opětovné volání KeSetTimer nebo KeSetTimerEx se stejným ukazatelem objektu Časovač zruší objekt časovače ve frontě a resetuje ho.
Nastavení rutiny CustomTimerDpc je přesně stejné jako nastavení rutiny CustomDpc s dalším krokem pro inicializaci objektu časovače. Ve skutečnosti jsou jejich prototypy identické, ale rutina CustomTimerDpc nemůže použít dva ukazatele SystemArgument deklarované v jeho prototypu.