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.
DpcForIsr veya CustomDpc yordamı yazarken aşağıdaki noktaları göz önünde bulundurun:
DpcForIsr veya CustomDpc yordamı, fiziksel bir cihaza ve sürücünün koruduğu paylaşılan durum bilgilerine veya kaynaklarına erişimini, sürücünün aynı cihaza veya bellek konumlarına erişen diğer yordamlarıyla eşitlemelidir.
DpcForIsr veya CustomDpc yordamı cihazı veya durumu bir ISR ile paylaşıyorsa, cihazı programlayan veya paylaşılan duruma erişen sürücü tarafından sağlanan SynchCritSection yordamının adresini sağlayarak KeSynchronizeExecution'ı çağırması gerekir. Daha fazla bilgi için bkz . Kritik Bölümleri Kullanma.
DpcForIsr veya CustomDpc yordamı, ISR dışındaki yordamlarla birlikte kilitlenmiş bir kuyruk veya zamanlayıcı nesnesi gibi durumu veya kaynakları paylaşıyorsa, paylaşılan durumu veya kaynakları sürücü tarafından başlatılan yönetici döndürme kilidiyle koruması gerekir. Daha fazla bilgi için Spin Locks'a bkz.
DpcForIsr ve CustomDpc yordamları, çağırabilecekleri destek yordamları kümesini kısıtlayan IRQL = DISPATCH_LEVEL'de çalışır.
Örneğin, DpcForIsr ve CustomDpc rutinleri ne sayfalı belleğe erişebilir ne de bellek ayırabilir, ayrıca çekirdek dağıtıcı nesnelerinin sinyalli durumuna ayarlanmasını bekleyemez. Öte yandan, KeAcquireSpinLockAtDpcLevel ve KeReleaseSpinLockFromDpcLevel ile keAcquireSpinLock ve KeReleaseSpinLock'tan daha hızlı çalışan bir sürücünün yönetici spin kilidini alabilir ve serbest bırakabilirsiniz.
Bir DPC rutini engelleme çağrıları yapamasa da, bir iş öğesini PASSIVE_LEVEL'e eşit IRQL'de çalışan bir sistem çalışan iş parçacığında çalışmak üzere kuyruğa alabilir. İş öğesi, dağıtıcı nesnelerde bekleyen bloklama çağrıları yapabilir. Bir iş öğesini kuyruğa almak için DpcForIsr yordamı genellikle IoQueueWorkItem gibi bir yordamı çağırır ve CustomDpc yordamı genellikle ExQueueWorkItem yordamını çağırır.
DpcForIsr ve CustomDpc yordamları genellikle cihazda bir sonraki G/Ç işlemini başlatmakla sorumludur.
Doğrudan G/Ç kullanan en düşük düzey fiziksel cihaz sürücüleri için bu sorumluluk, sürücü IoStartNextPacket'i çağırmadan önce geçerli IRP'yi karşılamak üzere cihazı daha fazla veri aktaracak şekilde programlayan bir SynchCritSection yordamı kullanmayı içerebilir.
DpcForIsr ve CustomDpc rutinleri yalnızca kısa süreler boyunca çalışmalı ve mümkün olduğunca çok işlemi çalışan iş parçacıklarına devretmelidir.
DPC yordamı bir işlemci üzerinde çalıştırılırken, tüm iş parçacıklarının aynı işlemcide çalışması engellenir. Kuyruğa alınan ve çalıştırılmaya hazır olan diğer DPC yordamlarının geçerli DPC yordamı tamamlanana kadar yürütülmesi engellenebilir. Sistem yanıt hızını düşürmekten kaçınmak için tipik bir DPC yordamı her çağrıldığında 100 mikrosaniyeden fazla çalışmamalıdır. Bir görev 100 mikrosaniyeden uzun gerektiriyorsa ve DISPATCH_LEVEL eşit IRQL'de yürütülmesi gerekiyorsa, DPC yordamı 100 mikrosaniye sonra bitmeli ve görevi daha sonra tamamlamak için bir veya daha fazla CustomTimerDpc yordamı zamanlanmalıdır. CustomTimerDpc yordamları hakkında daha fazla bilgi için bkz. Zamanlayıcı Nesneleri ve DPC'ler.
DPC yordamı yalnızca DISPATCH_LEVEL'de çalışması gereken görevleri gerçekleştirmeli ve ardından kesintiyle ilgili kalan işleri IRQL = PASSIVE_LEVEL çalışan iş parçacıklarına devretmelidir. Örneğin, DPC yordamı bir iş öğesini sistem çalışan iş parçacığında çalışacak şekilde kuyruğa alabilir.
100 mikrosaniyeden uzun gecikmeleri belirtmemesi gereken DPC rutinleri, yürütmeyi geciktirmek için KeStallExecutionProcessor rutinini çağırır.
DPC yordamlarının yürütme sürelerini değerlendirmek için WDK'deki performans analizi araçlarını kullanın. DPC yürütme sürelerini izlemek için Tracelog aracını kullanan bir örnek için bkz . Örnek 15: DPC/ISR Saatini Ölçme.
Sürücü DMA kullanıyorsa ve AdapterControl yordamı KeepObject veya DeallocateObjectKeepRegisters döndürürse (böylece ek aktarım işlemleri için sistem DMA denetleyici kanalını veya veri yolu ana bağdaştırıcısını korur), DpcForIsr veya CustomDpc yordamı, geçerli IRP'yi tamamlayıp denetimi döndürmeden önce FreeAdapterChannel veya FreeMapRegisters ile bağdaştırıcı nesnesini veya eşleme yazmaçlarını serbest bırakmaktan sorumludur.
En düşük düzey fiziksel cihaz sürücüsü, denetleyici aracılığıyla G/Ç işlemlerini bağlı cihazlara eşitlemek için bir denetleyici nesnesi ayarlarsa, DpcForIsr veya CustomDpc yordamı, geçerli IRP'yi tamamlayıp denetimi döndürmeden önce IoFreeController kullanarak denetleyici nesnesini serbest bırakmakla sorumludur.
DpcForIsr ve CustomDpc yordamları genellikle belirli bir isteğin işlenmesi sırasında oluşan cihaz hatalarını günlüğe kaydetmek, gerekirse ve mümkünse geçerli isteği yeniden denemek ve G/Ç durum bloğunu ayarlamak ve geçerli IRP için IoCompleteRequest'i çağırmaktan sorumludur.
Sürücü ve cihaz çakışan G/Ç işlemlerini destekliyorsa, sürücünün çakışan G/Ç işlemlerini işleme kurallarına uyması gerekir.
Herhangi bir sürücünün DpcForIsr veya CustomDpc yordamı genellikle G/Ç işlemini yalnızca sürücünün desteklemesi gereken genel G/Ç denetim kodlarının bir alt kümesi için tamamlar. DPC yordamı özellikle aşağıdaki özelliklere sahip cihaz denetimi isteklerine yönelik işlemleri tamamlar:
Fiziksel cihazın durumunu değiştiren istekler
Fiziksel cihaz hakkındaki doğal olarak geçici bilgilerin döndürülmesi gereken istekler