Aracılığıyla paylaş


DispatchReadWrite ile Doğrudan G/Ç Kullanma

Cihaz nesnelerini doğrudan G/Ç için ayarlayan herhangi bir alt düzey cihaz sürücüsü, cihazından sistem fiziksel belleğine aktarılan verileri Irp-MdlAddress'te> MDL tarafından açıklanan sistem fiziksel belleğine döndürerek bir okuma isteğini karşılar. Sistem fiziksel belleğinden cihazına veri aktararak bir yazma isteğini karşılar.

Alt düzey sürücülerin okuma/yazma isteklerini zaman uyumsuz olarak işlemesi gerekir. Bu nedenle, her alt düzey sürücünün DispatchReadWrite yordamı, Sürücü Yığını'na IRP'leri Geçirme bölümünde açıklandığı gibi, geçerli parametrelere sahip IRP_MJ_READ ve IRP_MJ_WRITE IRP'lerini diğer sürücü yordamlarına iletmelidir.

Alt düzey sürücülere gönderilen okuma/yazma IRP'leri için, Irp-MdlAddress> MDL tarafından tanımlanan sayfa belleği, istenen aktarımı gerçekleştirmek için doğru erişim hakları bakımından zaten kontrol edilmiştir ve zincirin en üst düzey sürücüsü veya G/Ç yöneticisi tarafından zaten kilitlenmiştir. Cihaz nesnelerini doğrudan G/Ç için ayarlayan herhangi bir ara veya en düşük düzey sürücü, bu zaten yapılmış olduğundan MmProbeAndLockPages'i çağırmamalıdır. En düşük düzey sürücü MmGetSystemAddressForMdlSafe'i çağırır. (Windows 98 sürücüleri bunun yerine MmGetSystemAddressForMdl'yi çağırır. Windows Me, Windows 2000 ve sonraki Windows sürümleri için sürücüler MmGetSystemAddressForMdlSafe kullanmalıdır.)

Orta veya en düşük düzeyli herhangi bir cihaz sürücüsünün DispatchReadWrite rutinleri, yalnızca geçerli parametrelere sahip IRP'leri iletmek için üst düzey bir sürücüye güvenemiyorsa, G/Ç yığın konumundaki okuma/yazma IRP'lerinin parametrelerini doğrulamalıdır. DispatchReadWrite yordamı bir parametre hatası bulursa, IRP'yi IRP'leri Tamamlama bölümünde açıklandığı gibi uygun bir hata STATUS_XXX değeriyle tamamlaması gerekir. Parametreler geçerliyse, bir ara sürücünün DispatchReadWrite yordamının, Higher-Level Sürücüleri'ndeki DispatchReadWrite yönergelerine göre daha fazla işlem için isteği iletmesi gerekir.

En düşük düzeyli bir cihaz sürücüsünün DispatchReadWrite yordamı, Aktarım isteğiyle IoMarkIrpPending'i çağırmalı, diğer sürücü yordamları tarafından daha fazla işlem için IRP'yi geçirmeli ve Sürücü Yığını'nda IRP'leri geçirme bölümünde açıklandığı gibi STATUS_PENDING döndürmelidir.

Bir cihaz sürücüsünün DispatchReadWrite yordamının, sürücü tarafından belirlenen bir Anahtar değeriyle IoStartPacket'i çağırarak daha hızlı G/Ç aktarım hızı için IRP'lerin cihazında kuyruğa alınma sırasını denetleyebileceğini unutmayın. Sürücüdeki başka bir yordam daha sonra IRP'yi sıralar, istenen uzunluğun kısmi aktarım işlemlerine bölünmesi gerekip gerekmediğini belirler ve verileri aktarmak için cihazı programlar.

Genel olarak, büyük aktarım isteklerini cihazının sınırlamalarına uyacak şekilde bölmesi gereken bir cihaz sürücüsü, belirli bir aktarım isteği için cihazı ayarlamadan hemen önceye kadar bu işlemleri ertelemelidir. Böyle bir cihaz sürücüsünün DispatchReadWrite yordamı, cihaza özgü aktarım kısıtlamaları için gelen IRP'lerin G/Ç yığını konumunu denetlememeli veya sürücünün bu denetimleri StartIo (veya diğer sürücü yordamı) tarafından bir aktarım işlemi için programlanmadan hemen öncesine kadar erteleyebileceği kısmi aktarım aralıklarını hesaplamaya çalışmamalıdır.