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.
Bazen sürücülerin, çerçeve tarafından sağlanan eşitlemeye ek olarak veya bunun yerine G/Ç isteğiyle ilgili geri çağırma işlevlerinin sürücüye özgü eşitlemesini sağlaması gerekir. Sürücüler sürücü kodunu eşitlemek için geri çağırma eşitleme kilitlerini, döndürme kilitlerini, bekleme kilitlerini ve kesme kilitlerini kullanabilir.
Geri Çağırma Eşitleme Kilitleri
Sürücünüzü çerçevenin otomatik eşitleme özelliğini kullanacak şekilde ayarladıysanız, sürücünün G/Ç isteğiyle ilgili olay geri çağırma işlevlerini çağırmadan önce çerçeve bir eşitleme kilidi alır.
Çerçeve cihaz nesneleri ve kuyruk nesneleriyle ilişkili bu geri çağırma eşitleme kilitleri sürücüler tarafından da edinilebilir. Bir eşitleme kilidi almak için bir sürücü WdfObjectAcquireLock'u çağırır. Kilidi serbest bırakmak için sürücü WdfObjectReleaseLock'u çağırır.
Sürücü, G/Ç isteğiyle ilgili geri çağırma işlevlerinin cihaz düzeyinde veya kuyruk düzeyinde eşitlemesini kullanıyorsa ancak IRQL = PASSIVE_LEVEL'da çalışan bazı kodları IRQL = DISPATCH_LEVEL'de çalışan geri çağırma işlevleriyle eşitlemesi gerekiyorsa, sürücünüzün geri çağırma eşitleme kilitlerini kullanmasını isteyebilirsiniz. Bunun nedeni, sürücülerin otomatik eşitlemeyi yalnızca aynı IRQL'de yürütülen geri çağırma işlevleri için kullanabilmesidir.
Örneğin, bir sürücü bir iş öğesi nesnesi için otomatik eşitlemeyi yalnızca iş öğesi nesnesinin üst öğesinin yürütme düzeyi WdfExecutionLevelPassive ise kullanabilir (çünkü bir iş öğesinin geri çağırma işlevi her zaman IRQL= PASSIVE_LEVEL' de yürütülür). Bu nedenle, bir sürücü bir cihaz nesnesinin WDF_OBJECT_ATTRIBUTES yapısının ExecutionLevel üyesinde WdfExecutionLevelDispatch belirtirse, sürücü alt iş öğesi nesnesinin yapılandırma yapısının AutomaticSerialization üyesini ayarlayamaz. Bunun yerine, sürücünün EvtWorkItem geri çağırma işlevlerini üst cihaz nesnesinin geri çağırma işlevleriyle eşitlemek için bir geri çağırma eşitleme kilidi alması gerekir.
Çerçeve Bekleme Kilitleri
IRQL = PASSIVE_LEVEL'de çalışan koddan sürücü verilerine erişimi eşitlemek için çerçeve bekleme kilitlerini kullanın. Bir sürücünün bir çerçeve bekleme kilidi kullanabilmesi için önce WdfWaitLockCreate'ı çağırarak bir wait-lock nesnesi oluşturması gerekir. Sürücü daha sonra kilidi almak için WdfWaitLockAcquire ve serbest bırakmak için WdfWaitLockRelease çağırabilir.
Çerçeve Spin Kilitleri
IRQL <= DISPATCH_LEVEL'de çalışan koddan sürücü verilerine erişimi eşitlemek için çerçeve döndürme kilitlerini kullanın. Sürücü iş parçacığı bir döndürme kilidi aldığı zaman sistem, iş parçacığının IRQL değerini DISPATCH_LEVEL olarak ayarlar. İş parçacığı kilidi serbest bıraktığında, sistem iş parçacığının IRQL'ini önceki seviyesine geri döndürür.
Otomatik çerçeve senkronizasyonu kullanmayan bir sürücü, bağlam alanı yazılabilir durumdaysa ve sürücünün birden fazla olay geri çağırma işlevi bu alana erişiyorsa, bir cihaz nesnesinin bağlam alanına erişimi senkronize etmek için bir dönüşlü kilit kullanabilir.
Bir sürücünün çerçeve döndürme kilidi kullanabilmesi için WdfSpinLockCreate çağrısı yapması ve bir spin-lock nesnesi oluşturması gerekir. Sürücü daha sonra kilidi almak için WdfSpinLockAcquire ve serbest bırakmak için WdfSpinLockRelease çağırabilir.
Döndürme kilitlerinin örnek kullanımı için bkz. Gönderilen İsteklerin İptalini Eşitleme.
Çerçeve Kesme Kilitleri
DIRQL kesme işlemeyi destekleyen kesme nesneleri için çerçeve kesme kilitleri spin kilitleridir. Sürücünüz bir kesme dönüş kilidi aldıktan sonra, kilidi serbest bırakana kadar cihazın DIRQL düzeyinde çalışır. Kesme kilitlerini kullanma hakkında daha fazla bilgi için bkz. Kesme Kodunu Eşitleme.
Pasif düzeyde işlemeyi destekleyen kesme nesneleri için çerçeve kesme kilitleri bekleme kilitleridir. Sürücü bir kesme bekleme kilidi aldıktan sonra, kilidi bırakana kadar IRQL = PASSIVE_LEVEL seviyesinde çalışır. Pasif düzeyde işleme hakkında daha fazla bilgi için bkz. Pasif Düzey Kesmelerini Destekleme.