Aracılığıyla paylaş


G/Ç Kuyrukları Oluşturma

Çerçeve kuyruğu nesneleri, bir sürücünün aldığı G/Ç isteklerinin kapsayıcıları olan G/Ç kuyrukları'i temsil eder. Her sürücü her cihaz için bir veya daha fazla G/Ç kuyruğu oluşturabilir. Çerçeve kuyruğu nesnesi, sürücünün sağlayabilecekleri olay geri çağırma işlevleri kümesini ve sürücünün çağırabileceği bir dizi nesne yöntemini tanımlar.

Çerçeve, sürücünün cihazlarından birine yönlendirilen bir G/Ç isteği aldığında, çerçeve isteği uygun G/Ç kuyruğuna yerleştirir. Sürücünüz bir veya daha fazlaistek işleyicisi kaydederse, yazılım çerçevesi her G/Ç isteği mevcut olduğunda sürücünüzü bilgilendirebilir. Alternatif olarak, sürücünüz istekler için G/Ç kuyruğunu yoklayabilir.

Sürücülerin çoğu EvtDriverDeviceAdd geri çağırma işlevinde G/Ç kuyrukları oluşturur. Bir cihaz için G/Ç kuyruğu oluşturmak için sürücü, çerçeve kuyruğu nesnesinin WdfIoQueueCreate yöntemini (bir çerçeve kuyruğu nesnesi oluşturur) çağırır. Sürücü yöntemine WDF_IO_QUEUE_CONFIG bir yapı sağlar. Bu yapı, kuyrukla ilgili yapılandırma bilgilerini, örneğin kuyruğun dağıtım yöntemi ve çerçevenin çağırdığı istek işleyicilerine yönelik işaretçileri içerir; bu çağrılar, istekler kuyrukta kullanılabilir hale geldiğinde gerçekleşir. Yapı ayrıca kuyruğun güçle yönetilen olup olmayacağını ve sürücünün kuyruğun G/Ç istekleri için sıfır uzunluklu arabellekleri destekleyip desteklemediğini gösterir.

Sürücü, WDF_IO_QUEUE_CONFIG yapısının DefaultQueue üyesini TRUE olarak ayarlarsa, kuyruk cihazınvarsayılan G/Ç kuyruğu olur. Sürücünüz varsayılan bir G/Ç kuyruğu oluşturursa, isteklerden bazılarını almak için ek kuyruklar oluşturmadığınız sürece çerçeve, cihazın tüm G/Ç isteklerini bu kuyruğa yerleştirir. Sürücü, WdfDeviceGetDefaultQueue yöntemini çağırarak cihazın varsayılan G/Ç kuyruğuna bir tanıtıcı elde edebilir.

Bir cihaz için birden fazla G/Ç kuyruğu kullanmak istiyorsanız, sürücü WdfIoQueueCreateCreate çağırarak istediğiniz kadar kuyruk nesnesi oluşturabilir. Bir sürücü birden çok kuyruk oluşturursa, WdfDeviceConfigureRequestDispatchingçağırabilir ve bu da çerçeveye farklı türde istekleri farklı kuyruklara yönlendirmesini sağlar. Örneğin, tüm okuma isteklerinin bir kuyruğa, tüm yazma isteklerinin ise başka bir kuyruğa teslim edilebileceğini belirtebilirsiniz.

Sürücünüz bir G/Ç kuyruğu kümesi oluşturur ve sürücünüzün alabileceği her istek türünü belirli bir kuyruğa yönlendirmek için WdfDeviceConfigureRequestDispatchingçağırırsa, sürücünün varsayılan kuyruğa ihtiyacı yoktur.

Bir sürücü belirli bir türdeki istekler için G/Ç kuyruğu sağlamazsa ve sürücünüz bir işlev sürücüsüyse, çerçeve bu tür istekleri STATUS_INVALID_DEVICE_REQUEST tamamlanma durumu değeriyle tamamlar. Sürücünüz bir filtre sürücüsüyse ve WdfFdoInitSetFilterçağrısı yapmışsa, çerçeve bu istekleri otomatik olarak sürücü yığınındaki sonraki alt sürücüye iletir. Bu nedenle, örneğin, okuma isteklerini işlemeyen bir filtre sürücüsünün okuma istekleri alan bir G/Ç kuyruğu sağlaması gerekmez.

Sürücülerin G/Ç kuyruklarını nasıl kullanabileceğine ilişkin örnekler için bkz. G/Ç Kuyruklarının Örnek Kullanımları.