Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Daha önce ayarlanmış bir zamanlayıcı nesnesini devre dışı bırakmak için, bir sürücü KeCancelTimer'ı çağırır. Bu yordam, zamanlayıcı nesnesini sistemin zamanlayıcı kuyruğundan kaldırır. Genellikle zamanlayıcı nesnesi sinyalli duruma ayarlanmamıştır ve CustomTimerDpc yordamı yürütme için kuyruğa alınmaz. Ancak, KeCancelTimer çağrıldığında zamanlayıcının süresi dolmak üzereyse, KeCancelTimer'ın zaman kuyruğuna erişme şansı olmadan süre sonu gerçekleşebilir ve bu durumda sinyal ve DPC kuyruğa alma gerçekleşir.
Daha önce belirtilen süre dolmadan önce, daha önce belirtilen Süreölçer ve Dpc işaretçileriyle KeSetTimer veya KeSetTimerEx'in geri çağrılması aşağıdaki etkilere sahiptir:
Çekirdek, nesneyi sinyal durumuna ayarlamadan veya CustomTimerDpc yordamını kuyruğa almadan zamanlayıcı nesnesini zamanlayıcı kuyruğundan kaldırır.
Çekirdek, yeni DueTime değerini kullanarak zamanlayıcı nesnesini zamanlayıcı kuyruğuna yeniden ekler.
Aynı zamanlayıcı nesnesini farklı amaçlarla kullanmak yarış koşullarına veya ciddi sürücü hatalarına neden olabilir. Örneğin, bir sürücünün hem CustomTimerDpc yordamına çağrı ayarlamak hem de sürücüye ayrılmış bir iş parçacığında beklemeleri ayarlamak için tek bir zamanlayıcı nesnesi belirttiğini varsayalım. Sürücüye ayrılmış iş parçacığı ortak zamanlayıcı nesnesi için KeSetTimer, KeSetTimerEx veya KeCancelTimer'ı çağırsa, zamanlayıcı nesnesi bir CustomTimerDpc çağrısı için zaten kuyruğa alınmışsa, iş parçacığı CustomTimerDpc yordamına yapılan çağrıları iptal eder.
Bir sürücü CustomTimerDpc yordamlarına sahipse ve ayrıca sabit olmayan bir iş parçacığı bağlamında zamanlayıcı nesnelerini bekliyorsa, şu şekilde olmalıdır:
İş parçacığı bağlamına duyarlı zamanlayıcı nesnesini hiçbir zaman sabit olmayan bir iş parçacığı bağlamında (veya tam tersi) kullanmayın.
Her CustomTimerDpc yordamı için ayrı bir zamanlayıcı nesnesi ayırın. Sabit olmayan bir iş parçacığı bağlamında çağrılan her sürücü iş parçacığı veya sürücü yordamı kümesinin kendi "beklenebilir" zamanlayıcı nesneleri kümesi olmalıdır.
CustomTimerDpc rutinini kullanıyorsanız, sürücünün KeSetTimer veya KeSetTimerEx çağrılarına hangi aralıkta geçtiğini dikkatlice seçin. Ayrıca, özellikle SMP platformlarında bu çağrıyı yapan herhangi bir sürücü yordamından aynı zamanlayıcı nesnesine sahip KeCancelTimer çağrısının tüm olası etkilerini göz önünde bulundurun.
CustomTimerDpc yordamları hakkında aşağıdaki gerçeği aklınızda bulundurun:
Belirli bir DPC yordamını temsil eden bir DPC nesnesinin yalnızca bir örneği herhangi bir anda yürütülecek şekilde kuyruğa alınabilir.
İkinci bir sürücü yordamı, ilk arayan tarafından belirtilen aralık süresi dolmadan önce aynı CustomTimerDpc yordamını çalıştırmak için KeSetTimer veya KeSetTimerEx'i çağırırsa, CustomTimerDpc yordamı yalnızca ikinci arayan tarafından belirtilen süre dolduktan sonra çalıştırılır. Bu durumlarda CustomTimerDpc, ilk yordam olarak çağrılan KeSetTimer veya KeSetTimerEx için hiçbir işlemi gerçekleştirmez.
CustomTimerDpc yordamları olan ve düzenli zamanlayıcılar kullanan sürücüler için:
Bir sürücü, bir DPC yordamından düzenli bir zamanlayıcıyı serbest bırakamaz. Sürücüler, bir DPC rutininden yalnızca periyodik olmayan zamanlayıcıları serbest bırakabilir.
Hem CustomDpc hem de CustomTimerDpc yordamlarına sahip sürücüler için aşağıdaki tasarım kılavuzunu göz önünde bulundurun:
Yarış koşullarını önlemek için hiçbir zaman aynı Dpc işaretçisini KeSetTimer veya KeSetTimerEx ve KeInsertQueueDpc'e geçirmeyin.
Başka bir deyişle, bir sürücünün StartIo yordamının CustomTimerDpc yordamını kuyruğa almak için KeSetTimer veya KeSetTimerEx'i çağıracağını ve sürücünün ISR'sinin aynı Dpc işaretçisine sahip başka bir işlemciden KeInsertQueueDpc'i aynı anda çağıracağını varsayalım. bu DPC yordamı, bir işlemcideki IRQL DISPATCH_LEVEL altına düştüğünde veya zamanlayıcı aralığının süresi dolduğunda (hangisi önce olursa) çalıştırılır. Hangisi önce gelirse gelsin, StartIo veya ISR için bazı temel çalışmalar yalnızca DPC yordamı tarafından bırakılır.
Buna ek olarak, çok farklı işlevlere sahip iki standart sürücü yordamı tarafından kullanılan bir DPC, ayrı CustomTimerDpc ve CustomDpc yordamlarından daha düşük performans özelliklerine sahip olabilir. DPC'nin, StartIo yordamını veya ISR'yi kuyruğa ekleyen koşullara bağlı olarak hangi işlemlerin gerçekleştirileceğini belirlemesi gerekir. DPC'de bu koşulların test edilmesi ek CPU döngüleri kullanır.