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.
Adından da anlaşılacağı gibi ControllerControl yordamı bir denetleyici nesnesiyle ilişkilendirilir. ControllerControl rutini yürütüldüğünde, denetleyici nesnesi tarafından temsil edilen donanım boştadır ve denetleyici uzantısı, sürücünün ISR'siyle paylaşılan bir bağlam içermediği sürece, denetleyici uzantısına genellikle başka bir sürücü rutin tarafından erişilmez.
Genellikle, ControllerControl "işleyişi" en azından aşağıdakileri yapar:
Sürücünün hedef cihaz nesnesinin cihaz uzantısında ve denetleyici uzantısında koruduğu bağlamı güncelleştirir veya başlatır
Sürücü DMA kullanıyorsa , ControllerControl yordamı genellikle her DMA aktarımının boyutuyla ilgili sistem tarafından uygulanan veya cihaz tarafından uygulanan sınırlamalar nedeniyle belirli bir aktarım isteğinin kısmi aktarımlara bölünmesi gerekip gerekmediğini belirlemekle sorumludur. Bu durumlarda ControllerControl yordamı, sürücüde AdapterControl yordamı varsa AllocateAdapterChannel çağrısından da sorumludur.
Sürücü PIO kullanıyorsa, ControllerControl yordamı, donanımı gerektiriyorsa aktarım isteklerini kısmi aktarım aralıklarına bölme ve Irp-MdlAddress'de> MDL ile MmGetSystemAddressForMdlSafe çağrısından da sorumludur.
Donanımı istenen G/Ç işlemi için programlar
Cihaz veya denetleyici uzantısına ISR'den erişilebiliyorsa ControllerControl yordamı, KeSynchronizeExecution çağrılarak çağrılan bir SynchCritSection yordamı kullanmalıdır. Daha fazla bilgi için bkz . Kritik Bölümleri Kullanma.
Sürücünün cancel yordamı varsa ControllerControl yordamının da geçerli IRP'nin iptal edilip edilmeyeceğini belirlemek için Irp-Cancel> alanını denetlemesi ve aşağıdakilerden birini yapması gerekir:
Irp-Cancel>TRUE olarak ayarlanırsa ControllerControl yordamı aşağıdakileri yapmalıdır:
IRP'nin G/Ç durum bloğunda, Durum için STATUS_CANCELLED ve Bilgiler için sıfır olarak ayarlayın.
Sonraki cihaz işleminin hemen başlatılabilmesi için denetleyici nesnesini serbest bırakmak için IoFreeController'ı çağırın.
IoStartNextPacket'i çağırın veya sürücü kendi kuyruğa alma işlemini yönetiyorsa bir sonraki IRP'yi kuyruktan kaldırın.
IoCompleteRequest ile iptal edilen IRP'yi tamamlayın ve denetimi döndürin.
Irp-Cancel>TRUE olarak ayarlanmadıysa ControllerControl yordamının aşağıdakileri yapması gerekir:
IRP için cancel yordamı giriş noktasını NULL olarak sıfırlamak için IoSetCancelRoutine'i çağırın. Sürücü, cihaz nesnesinde G/Ç yöneticisi tarafından sağlanan bir cihaz kuyruğunu kullanıyorsa, bu çağrı için iptal döndürme kilidini edinin.
İstenen G/Ç işlemi için donanımı programlamak üzere, KeSynchronizeExecution çağrısıyla tetiklenen bir SynchCritSection rutinini kullan. Daha fazla bilgi için bkz . Kritik Bölümleri Kullanma
İptal edilebilir IRP'leri işleme hakkında daha fazla bilgi için bkz. IRP'leri İptal Etme.
Fiziksel denetleyici/bağdaştırıcıya bağlı farklı cihazlar üzerinde örtüşmeyen işlemler hariç, çoğu kesme temelli G/Ç işleminde, DpcForIsr veya CustomDpc yordamı işlemi ve IRP'yi tamamladığı için ControllerControl yordamının KeepObject döndürmesi gerekmektedir.
Geçerli isteği karşılamak için G/Ç işlemleri yapılır tamamlanmaz, IRP'yi tamamlayacak yordam, sonraki isteğin mümkün olan en kısa sürede işlenebilmesi için IoFreeController ve IoStartNextPacket'i çağırmalıdır.
ControllerControl yordamının kendisi bir IRP'yi tamamlarsa veya başka bir cihaz nesnesi için bir işlemle çakışabilecek bir hedef cihaz nesnesi (disk) için disk arama gibi bir işlem ayarlayabiliyorsa, ControllerControl yordamı DeallocateObject döndürmelidir.