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.
Yeni sürücüler, bu bölümde açıklanan yöntemler yerine, iptale karşı güvenli IRP kuyruk çerçevesini tercih etmelidir.
Cihaza özel iş parçacıklarına sahip sürücüler veya yoğunlukla sistem FSD'leri gibi yönetici işçi parçacıklarını kullanan sürücüler, IRP'lerin iç çalışma zamanlamasının kilitlenmiş sıraya alınmasını yönetme olasılığı en yüksek olan sürücü türleridir. WDM sürücüleri de dahil olmak üzere tüm PnP sürücüleri, PnP ve güç durumu geçişleri yaparken belirli IRP'leri dahili olarak kuyruğa almalıdır.
Genellikle, bu sürücüler iki yönlü bağlı bir kilitli kuyruk ayarlar; her IRP, bir sürücünün şu anda tuttuğu IRP'leri çift yönlü olarak bağlamak için kullanabileceği LIST_ENTRY türünde bir üye içerir. Bir sürücü, tek bağlantılı bir kilitli kuyruk ayarlarsa, IRP'leri yeniden denemeler için tekrar kuyruğa alamaz.
Bir sürücünün cihazın başlatılması sırasında birbirine bağlı kuyruğunu ayarlaması gerekir. Aşağıdaki şekilde, birbirine bağlı ikiye katlanmış bir kuyruk, bir sürücünün böyle bir kuyruğu ayarlamak için çağırması gereken destek yordamları ve bir sürücünün IRP'leri kuyruktan eklemek ve kaldırmak için çağırabileceği bir Dizi ExInterlockedXxx yordamı gösterilmektedir.
Bu şekil gösteriyor ki, bir sürücünün çift yönlü kilitlenmiş bir kuyruk ayarlamak için kuyruğun kendisi ve aşağıdakiler için depolama sağlaması gerekir.
Sürücünün başlatmak için KeInitializeSpinLock çağrısı yapması gereken bir yönetici spin kilidi. Genellikle, bir sürücü AddDevice yordamında cihaz nesneleri için cihaz uzantılarını ayarlarken döndürme kilidini başlatır.
Sürücünün InitializeListHead çağrısı yaparak başlatması gereken kuyruğun liste başı.
Çift bağlantılı birbirine bağlı kuyruklar kullanan sürücülerin çoğu, sürücü tarafından oluşturulan bir cihaz nesnesinin cihaz uzantısında gerekli depolama alanını sağlar. Kuyruk ve yönetici döndürme kilidi bunun yerine bir denetleyici uzantısında (sürücü bir denetleyici nesnesi kullanıyorsa) veya sürücü tarafından ayrılan sayfalanmamış havuzda olabilir.
Sürücü G/Ç isteklerini kabul ederken, önceki şekilde gösterildiği gibi ListHeadLIST_ENTRY türündeyse aşağıdaki destek yordamlarından birini çağırarak kuyruğuna bir IRP ekleyebilir:
Kuyruğun sonuna IRP'yi yerleştirmek için ExInterlockedInsertTailList kullanın.
IRP'yi kuyruğun önüne yerleştirmek için ExInterlockedInsertHeadList. Sürücüler genellikle bu yordamı yalnızca belirli bir isteği yeniden denemeleri gerektiğinde çağırır.
Sürücü, bu ExInterlockedInsertXxxList yordamlarının her birine IRP (ListEntry) ve daha önce başlatmış olduğu ListHead ve executive spin lock (Lock) işaretçilerine işaretçiler geçirmelidir. Sürücü, ExInterlockedRemoveHeadList çağrısını yaparak bir IRP'yi kuyruktan çıkarttığında yalnızca ListHead ve Lock işaretçilerine ihtiyaç duyar. Kilitlenmeleri önlemek için, sürücünün ExInterlockedXxx rutine geçirdiği bir ExecutiveSpinLock tutmaması gerekir.
Kilitlemeli bir kuyruk yönetici spin kilidiyle korunduğundan, sürücü IRP'leri iki uçlu bağlı kuyruğuna ekleyebilir ve IRQL = DISPATCH_LEVEL veya daha düşük seviyede çalışan herhangi bir sürücü rutini üzerinden çok işlemcili güvenli bir şekilde kaldırabilir.
Önceki şekilde gösterildiği gibi LIST_ENTRY türünde ListHead içeren bir kuyruk, ikiye kat bağlantılı bir listedir. ListHead türü SLIST_HEADER olan liste sıralı, tek bağlantılı bir listedir. Sürücü, ExInitializeSListHead'i çağırarak sıralı tek bağlantılı, birbirine bağlı bir kuyruk için ListHead'i başlatır.
G/Ç işlemlerini hiçbir zaman yeniden denememiş bir sürücü, sıralı, tek bağlantılı birbirine bağlı bir kuyrukta IRP'lerin kuyruğa alınmasını yönetmek için ExInterlockedPushEntrySList ve ExInterlockedPopEntrySList kullanabilir. Bu tür kilitlenmiş kuyruğu kullanan herhangi bir sürücü, önceki şekilde gösterildiği gibi SLIST_HEADER türünde bir ListHead ve ExecutiveSpinLock için yerleşik depolama alanı sağlamalıdır. İlk girdiyi kuyruğuna eklemek için ExInterlockedPushEntrySList çağrısından önce döndürme kilidini başlatması ve kuyruğunu ayarlaması gerekir.
Daha fazla bilgi için bkz. Donanım Önceliklerini ve Spin Kilitlerini Yönetme. Belirli bir destek yordamına yönelik IRQL gereksinimleri için yordamın başvuru sayfasına bakın.