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.
En alt düzey fiziksel sürücülerin, daha üst düzeydeki sürücülerin gereksinim duymadığı belirli standart yordamları vardır. En düşük düzey sürücüler için standart yordamlar kümesi de aşağıdaki ölçütlere göre değişir:
Her sürücünün kontrol ettiği cihazın doğası
Sürücünün cihaz nesnelerini doğrudan G/Ç veya arabellekli G/Ç için ayarlaması
Bireysel sürücünün tasarımı
Standart sürücü rutinlerinin rollerini göstermek için aşağıdaki şekilde, bir örnek IRP'nin en alt seviyedeki bir yığın depolama aygıtı sürücüsü tarafından işlenirken izlediği yol gösterilmektedir. Şekildeki sürücü aşağıdaki özelliklere sahiptir:
Cihaz her G/Ç işleminin sonunda kesme sinyalleri oluşturur, bu nedenle bu sürücü ISR ve DpcForIsr rutinlerine sahiptir.
Sürücünün, IRP'ler için iç kuyruklar kurup kendi kuyruk yönetimini yapmak yerine bir StartIo rutini vardır.
Sürücü sistem DMA'sını kullandığından, cihaz nesnelerinin doğrudan Girdi/Çıktı işlemleri için Bayrakları ayar ve AdapterControl işlemi vardır.
Bu şekilden görüldüğü gibi, G/Ç yöneticisi bir IRP oluşturur ve verilen ana işlev kodu için sürücünün dağıtım yordamına gönderir. İşlev kodunun IRP_MJ_READ veya IRP_MJ_WRITEolduğunu varsayarsak, dağıtım yordamı DDDispatchReadWrite'dur.
IoGetCurrentIrpStackLocation Çağrısı
IRP parametreleri gerektiren tüm sürücü yordamları, sürücününG/Ç yığını konumunu almak için ioGetCurrentIrpStackLocationçağırmalıdır. Bu yordamlar, birden fazla ana G/Ç işlev kodunu (IRP_MJ_*XXX), ikincil işlevleri destekleyen bir işlevi işleyen (IRP_MN_XXX) veya cihaz G/Ç denetim isteklerini işleyen (*IRP_MJ_DEVICE_CONTROL ve/veya IRP_MJ_INTERNAL_DEVICE_CONTROL) dağıtma yordamlarını içerir. IRP işleyen diğer tüm sürücü yordamlarıyla birlikte.
Bu sürücünün G/Ç yığını konumu, belirsiz sayıda üst düzey sürücülerin G/Ç yığını konumlarının gölgeli gösterildiği en düşük konumdur. Basitlik sağlamak için, DispatchReadWrite, StartIo, AdapterControlve DpcForIsr yordamlarından IoGetCurrentIrpStackLocation çağrıları önceki şekilde gösterilmez.
IoMarkIrpPending ve IoStartPacket'i çağırma
Örnek sürücü, dağıtım yordamında IRP'yi tamamlamaz, bunun yerine IRP'yi StartIo yordamında işler. Bunu yapamadan önce, gönderme yordamı IRP'nin henüz tamamlanmadığını belirtmek için IoMarkIrpPending çağırır. Ardından IoStartPacket çağırarak sürücünün StartIo yordamı tarafından daha fazla işlem yapılması için IRP'yi kuyruğa alır. Gönderme yordamı ayrıca NTSTATUS değeri olan STATUS_PENDING'i döndürür.
Aşağıdaki şekilde ioStartPacket çağrısı gösterilmektedir.
iostartpacket çağrısı gösteren 
Sürücü cihazda başka bir IRP işlemekle meşgulse IoStartPacket IRP'yi cihaz nesnesiyle ilişkili cihaz kuyruğuna ekler. Sürücü, cihaz kuyruğundaki IRP'lere sürücü tarafından belirlenen bir sıra uygulamak için isteğe bağlı olarak bir Anahtar değerini IoStartPacket'e parametre olarak sağlayabilir.
Sürücü meşgul değilse ve cihaz kuyruğu boşsa G/Ç yöneticisi hemen giriş IRP'sini geçirerek StartIo yordamını çağırır.
Yığın depolama cihazları için, en düşük düzey sürücünün IoStartPacket çağırdığında İptal rutinini sağlaması iki nedenden dolayı gerekmez:
Böyle bir sürücü üzerine katmanlanmış bir dosya sistemi genellikle dosya G/Ç isteklerinin iptalini işler.
Yığın depolama cihaz sürücüleri IRP'leri hızlı bir şekilde işler.
Genellikle, katmanlı sürücü zincirindeki en üst düzey sürücü IRP'lerin iptalini yönetir.
AllocateAdapterChannel ve MapTransfer Çağrısı
En düşük seviyedeki sürücü rutinleri aracılığıyla bir IRP yolunu gösteren şekildeki StartIo rutinini varsayarsak, bu rutin aktarım isteğinin tek bir DMA işlemiyle yapılabileceğini belirler. Ardından, StartIo rutini AllocateAdapterChannel'i, sürücünün AdapterControl rutininin ve IRP'nin giriş noktası ile çağırır.
Sistem DMA denetleyicisi kullanılabilir olduğunda, G/Ç yöneticisi aktarım işlemini ayarlamak için sürücünün AdapterControl yordamını çağırır. AdapterControl yordamı, sistem DMA denetleyicisini ayarlamak için MapTransferçağırır. Ardından sürücü, cihazını DMA işlemi için programlayıp döndürür. (DMA ve bağdaştırıcı nesnelerini kullanma hakkında daha fazla bilgi için bkz. Giriş/Çıkış Teknikleri.)
Sürücünün ISR'sinden IoRequestDpc çağırma
Cihaz, aktarım işleminin tamamlandığını belirtmek için bir kesinti yaptığında, sürücünün ISR'si aygıtın kesmeyi durdurmasını sağlar ve en düşük düzey sürücü rutinlerinden geçen bir IRP yolunu gösteren şekilde görüldüğü gibi IoRequestDpc çağrılır.
Bu çağrı, sürücünün DpcForIsr yordamını daha düşük bir donanım önceliğinde (IRQL) mümkün olduğunca aktarım işleminin çoğunu tamamlamak üzere kuyruğa alır.
IoStartNextPacket ve IoCompleteRequest'i çağırma
DpcForIsr rutini aktarımı işlemeyi tamamladığında, IoStartNextPacket hemen çağırır, böylelikle cihaz kuyruğunda sıradaki IRP varsa, sürücü StartIo rutini onu işlemek üzere çağrılır. DpcForIsr yordamı da yeni tamamlanan IRP'nin G/Ç durum bloğunu ayarlar ve ardından IRP için ioCompleteRequestçağırır.
Aşağıdaki şekilde bu sürücünün IoStartNextPacket ve IoCompleteRequestçağrıları gösterilmektedir.
Sürücülerin ioStartNextPacket veya IoStartNextPacketByKey çağrısı yapması ve tercihen ioCompleteRequest çağırmadan önce bir sonraki istenen G/Ç işlemini en kısa sürede başlatması gerekir.
Cihaz için herhangi bir IRP kuyruğa alınırsa, IoStartNextPacket, bir sonraki IRP'yi kuyruktan kaldırmak içinKeRemoveDeviceQueue çağırır. G/Ç yöneticisi daha sonra kuyruktan çıkarılmış IRP'yi geçirerek sürücünün StartIo rutinini çağırır. Şu anda cihaz kuyruğunda IRP yoksa IoStartNextPacket yalnızca çağırana geri döner.
IRP'de G/Ç Durum Bloğunu Ayarlama
Her alt düzey sürücü, IoCompleteRequestçağırmadan önce IRP'nin G/Ç durum bloğunu ayarlamalıdır. (Önceki şekilde, ikinci gölgeli alan durum bloğunu belirtir.) G/Ç durum bloğu, üst düzey sürücülere ve sonuçta G/Ç işleminin özgün istek sahibine bilgi sağlar. Önceki şekildeki sürücünün üzerinde yer alan herhangi bir yüksek seviyeli sürücü, bu sürücü tarafından ayarlanan G/Ç durum bloğunu okuyan bir IoCompletion yordamı ayarlamış olabilir. Üst düzey sürücüler genellikle, cihaz sürücüsü tarafından tamamlanmış bir IRP'deki G/Ç durum bloğunu değiştirmez, üst düzey sürücü IRP'yi yeniden deniyorsa, bu durumda G/Ç durum bloğunu yeniden başlatır.
Bir IRP'yi sonraki alt sürücüye göndermeden tamamlayan her üst düzey sürücü, IoCompleteRequest çağırmadan önce bu IRP'deki G/Ç durum bloğunu da ayarlamalıdır. Genel G/Ç aktarım hızının iyi olması için, üst düzey bir sürücü her IRP'nin kendi G/Ç yığını konumundaki parametreleri denetlemeli ve parametreler geçersizse G/Ç durum bloğunu ayarlamalı ve isteğin kendisini tamamlamalıdır. Mümkün olduğunda, bir sürücü zincirdeki düşük sürücülere geçersiz bir istek geçirmekten kaçınmalıdır.
Önceki şekildeki aktarım işleminin başarılı olduğunu varsayarsak, en düşük düzey sürücü yordamları aracılığıyla IRP yolunu gösteren şekilde gösterilen DpcForIsr yordamı, Durum STATUS_SUCCESS ve IRP'nin G/Ç durum bloğu için Bilgi aktarılan bayt sayısını ayarlar.
Standart sürücü yordamlarının çoğu NTSTATUS türü değerleri de döndürür. STATUS_SUCCESS gibi NTSTATUS sabitleri hakkında daha fazla bilgi için bkz. Günlük Hataları.