Aracılığıyla paylaş


CustomTimerDpc Yordamını Kaydetme ve Kuyruğa Alma

Bir sürücü, genellikle AddDevice yordamından aşağıdaki yordamları çağırarak CustomTimerDpc yordamını kaydedebilir:

  1. Rutinini kaydetmek için KeInitializeDpc kullanılır.

  2. Bir zamanlayıcı nesnesi ayarlamak için KeInitializeTimer veya KeInitializeTimerEx

Daha sonra, sürücü bir süre sonu süresi belirtmek ve zamanlayıcı nesnesini sistemin zamanlayıcı kuyruğuna eklemek için KeSetTimer veya KeSetTimerEx'i çağırabilir. Süre sonu süresine ulaşıldığında sistem zamanlayıcı nesnesinin sıralamasını kaldırır ve CustomTimerDpc yordamını çağırır. Aşağıdaki şekilde bu çağrılar gösterilmektedir.

Customtimerdpc yordamını açıklayan, zamanlayıcı ve dpc nesnelerinin kullanımını gösteren diyagram.

Önceki şekilde gösterildiği gibi, sürücünün hem DPC nesnesi hem de zamanlayıcı nesnesi için depolama sağlaması gerekir. Sürücülerin çoğu bu nesneler için depolama alanını bir cihaz uzantısında veya sürücü tarafından ayrılan diğer yerleşik bellekte sağlar.

KeSetTimer çağrısında sürücü, önceki şekilde gösterildiği gibi 100 nanosaniyelik birimlerle ifade edilen DueTime ile birlikte Dpc ve Timer nesnelerine işaretçiler geçirir. DueTime için pozitif bir değer, CustomTimerDpc yordamının çağrılması gereken mutlak süre sonu süresini (1 Ocak 1601'den bu yana) belirtir. DueTime için negatif bir değer, göreli süre sonu süresini belirtir.

Mutlak süreölçerin süresi belirli bir sistem zamanında dolduğundan, zamanlayıcının süresi dolmadan önce sistem süresi değişirse mutlak süreölçer bekleme süresi etkilenmez. Öte yandan, mutlak sistem süresindeki değişikliklerden bağımsız olarak, belirtilen birim sayısı geçtikten sonra göreli süreölçer her zaman sona erer.

CustomTimerDpc yordamını tekrar tekrar çağırmak için KeSetTimerEx kullanarak zamanlayıcıyı ayarlayın ve Period parametresinde yinelenen bir aralık belirtin. KeSetTimerEx , bu ek parametre dışında Aynı KeSetTimer gibidir.

Önceki şekilde gösterildiği gibi, KeSetTimer veya KeSetTimerEx çağrısı, zamanlayıcı nesnesini belirtilen bir aralık için aşağıdaki gibi kuyruğa alır:

  1. DueTime süresi dolduğunda zamanlayıcı nesnesi kuyruktan çıkarılır ve Signaled durumu olarak ayarlanır.

  2. Makinedeki her işlemci şu anda DISPATCH_LEVEL'den büyük veya buna eşit bir IRQL'de kod çalıştırıyorsa, zamanlayıcı nesnesiyle ilişkili DPC nesnesi bir DPC kuyruğuna konur. Aksi takdirde CustomTimerDpc yordamı çağrılır.

  3. DueTime aralığı sona erdiğinde DPC nesnesi zaten kuyruktaysa, makinedeki herhangi bir işlemcideki IRQL DISPATCH_LEVEL altına düştüğünde CustomTimerDpc yordamı çağrılır.

    Uyarı

    Tüm DPC yordamları gibi CustomTimerDpc yordamı da IRQL = DISPATCH_LEVEL olarak adlandırılır. Bir DPC rutini çalışırken, aynı işlemcide tüm iş parçacıklarının çalışması engellenir. Sürücü geliştiricilerin CustomTimerDpc rutinlerini olabildiğince kısa bir süre çalışacak şekilde dikkatlice tasarlamaları gerekir.

KeSetTimer ve KeSetTimerEx için belirtilebilen en küçük zaman aralığı yaklaşık on milisaniyedir, bu nedenle bir sürücü saniyede bir çalıştırılan IoTimer yordamından daha küçük aralıklar zamanlarken CustomTimerDpc yordamını kullanabilir.

Herhangi bir anda belirli bir zamanlayıcı nesnesinin yalnızca bir örneği kuyruğa alınabiliyor. KeSetTimer veya KeSetTimerEx'in aynı Zamanlayıcı nesne işaretçisiyle yeniden çağrılması, kuyruğa alınan zamanlayıcı nesnesini iptal eder ve sıfırlar.

CustomTimerDpc yordamını ayarlamak, zamanlayıcı nesnesini başlatmak için ek bir adımla CustomDpc yordamını ayarlamaya benzer. Aslında prototipleri aynıdır, ancak CustomTimerDpc yordamı prototipinde bildirilen iki SystemArgument işaretçisini kullanamaz.