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.
Eğer bir sürücü ne arabelleğe alınmış ne de doğrudan G/Ç kullanıyorsa, G/Ç yöneticisi sürücüye gönderdiği IRP'lerdeki kullanıcı alanının özgün sanal adreslerini iletir. Bu arabelleklere güvenli bir şekilde erişmek için, sürücünün çağıran iş parçacığı bağlamında yürütülüyor olması gerekir. Bu nedenle genellikle arabelleklere erişmek için yalnızca FSD gibi en üst düzey sürücüler bu yöntemi kullanabilir.
Ara veya en düşük düzey sürücü her zaman bu koşulu karşılayamaz. Örneğin, bir iş parçacığı G/Ç isteğinin tamamlanmasını bekliyorsa veya ara veya en düşük düzeyli sürücünün üzerine daha üst düzey bir sürücü katmanlanmışsa, alt düzey sürücünün yordamlarının istekte bulunan iş parçacığının bağlamında çağrılma olasılığı düşüktür.
G/Ç yöneticisi, bir G/Ç işleminin ne tamponlu G/Ç'yi ne de doğrudan G/Ç'yi kullandığını aşağıdaki gibi belirler:
IRP_MJ_READ ve IRP_MJ_WRITE istekleri için, DEVICE_OBJECT yapısının Bayrakları üyesinde DO_BUFFERED_IO veya DO_DIRECT_IO ayarlanmadı. Daha fazla bilgi için bkz. Cihaz Nesnesi Başlatma.
IRP_MJ_DEVICE_CONTROL ve IRP_MJ_INTERNAL_DEVICE_CONTROL istekleri için IOCTL kodunun değeri, IOCTL değerindeki TransferType değeri olarak METHOD_NEITHER içerir. Daha fazla bilgi için bkz. G/Ç Denetim Kodlarını Tanımlama .
Sürücü, ne arabelleğe alınmış ne de doğrudan G/Ç kullanan bir G/Ç işlemi belirten bir IRP aldığında, aşağıdakileri yapmalıdır:
ProbeForReadve ProbeForWrite destek yordamlarını kullanarak kullanıcı arabelleğinin adres aralığının geçerliliğini denetleyin ve uygun okuma veya yazma erişimine izin verilip verilmediğini denetleyin. Sürücü, kullanıcı iş parçacığının arabellek için erişim haklarını sürücü belleğe erişirken değiştirememesi için, arabelleğin adres aralığına erişimlerini, sürücü tarafından sağlanan bir özel durum işleyicisi içinde kapsamalıdır. Yoklama bir özel durum oluşturursa, sürücü bir hata döndürmelidir. Sürücü, G/Ç isteğini yapan iş parçacığının bağlamında bu yordamları çağırmalıdır. Bu nedenle, bu görevi yalnızca üst düzey bir sürücü gerçekleştirebilir.
Arabellekleri ve bellek işlemlerini aşağıdaki yollardan biriyle yönetin:
- G/Ç yöneticisinin, arabelleğe alınmış G/Ç kullanan sürücüler için yaptığı gibi, kendi çift arabelleği operasyonlarını yürütün. Daha fazla bilgi için bkz. Arabelleğe Alınmış G/Ç'yi Kullanma.
- Özellikle doğrudan I/O kullanan sürücüler için I/O yöneticisinin yaptığı gibi kendi MDL'lerinizi oluşturun ve bellek yöneticisinin destek yordamlarını çağırarak arabelleği kilitleyin. Daha fazla bilgi için bkz. Doğrudan G/Ç kullanma.
- Kullanıcı arabelleği üzerinde gerekli tüm işlemleri doğrudan çağıran iş parçacığı bağlamında gerçekleştirin. Sürücü, bir kullanıcı iş parçacığının, sürücü belleğe erişirken arabellekteki verilere veya erişim haklarına müdahale etmesi durumuna karşı, arabelleğe erişimini sürücü tarafından sağlanan bir özel durum işleyicisi içinde sarmalamalıdır. Daha fazla bilgi için bkz. İşleme Özel Durumları.
Sonuç olarak, sürücü, her IRP için arabelleğe alınan G/Ç, doğrudan G/Ç veya çağıran iş parçacığının bağlamında G/Ç yapmayı ayrı ayrı seçmeli ve kullanıcı modu iş parçacığı bağlamında oluşabilecek özel durumları yönetmelidir. Sürücü, G/Ç yöneticisinin sürücü için bu işlemleri işlemesine izin vermek yerine, gerektiğinde kendi kullanıcı arabelleği erişimlerini, çift arabelleğe alma işlemlerini ve bellek eşlemelerini yönetmelidir.