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.
Sürücüler, diğer sürücülerin erişebileceği cihaza özgü arabirimler tanımlayabilir. Bu sürücü tanımlı arabirimler bir dizi çağrılabilen yordamdan, bir veri yapısı kümesinden veya her iki durumdan da oluşabilir. Sürücü, genellikle sürücü tarafından tanımlanan bir arabirim yapısında, bu yordamlara ve yapılara yönelik işaretçiler sağlar ve bu arabirim yapısını diğer sürücülerin kullanımına sunar.
Örneğin, bir otobüs şoförü, alt cihazın kaynak listesinde bu bilgiler yoksa, üst düzey sürücülerin bilgi almak için çağırabileceği bir veya daha fazla rutin sağlayabilir.
WDK'de belgelenen bir sürücü tanımlı arabirim kümesi örneği için bkz. USB Yordamları. Ayrıca , tost makinesi örneğinin çerçeve tabanlı sürümüne bakın.
Arabirim Oluşturma
Sürücü tanımlı her arabirim şu şekilde belirtilir:
A GUID
Sürüm numarası
Sürücü tanımlı arabirim yapısı
Referans ve dereferans işlemleri
Bir arabirim oluşturmak ve diğer sürücülerin kullanımına açmak için çerçeve tabanlı sürücüler aşağıdaki adımları kullanabilir:
Bir arabirim yapısı tanımlayın.
Bu sürücü tanımlı yapının ilk üyesi bir INTERFACE üst bilgi yapısı olmalıdır. Ek üyeler, arabirim verilerini ve başka bir sürücünün çağırabileceği ek yapıların veya yordamların işaretçilerini içerebilir.
Sürücünüz tanımladığınız arabirimi açıklayan bir WDF_QUERY_INTERFACE_CONFIG yapısı sağlamalıdır.
Uyarı
WDF, WDF_QUERY_INTERFACE_CONFIG kullanırken aynı arabirim GUID'sini kullanan tek bir arabirimin birden çok sürümünü desteklemez.
Sonuç olarak, mevcut arabirimin yeni bir sürümünü kullanıma sunarken, ARABIRIM yapısının Boyut veya Sürüm alanlarını gözden geçirme yerine yeni bir GUID oluşturmanızı öneririz.
Sürücünüz değiştirilmiş Boyut veya Sürüm alanlarıyla aynı arabirim GUID'sini yeniden kullanırsa, sürücü WDF_QUERY_INTERFACE_CONFIG sağlamamalı ve bunun yerine IRP_MN_QUERY_INTERFACE için bir EvtDeviceWdmIrpPreprocess geri çağırma yordamı sağlamalıdır.
WdfDeviceAddQueryInterface öğesini çağır.
WdfDeviceAddQueryInterface yöntemi aşağıdakileri yapar:
- Çerçevenin başka bir sürücünün arabirim isteğini tanıyabilmesi için arabirim hakkında GUID, sürüm numarası ve yapı boyutu gibi bilgileri depolar.
- Başka bir sürücü arabirimi istediğinde çerçevenin çağırdığı isteğe bağlı bir EvtDeviceProcessQueryInterfaceRequest olay geri çağırma işlevini kaydeder.
Sürücü tanımlı arabirimin her örneği tek bir cihazla ilişkilendirildiğinden, sürücüler genellikle EvtDriverDeviceAdd veya EvtChildListCreateDevice geri çağırma işlevinin içinden WdfDeviceAddQueryInterface'i çağırır.
Arabirime Erişmek
Sürücünüz bir arabirim tanımladıysa, başka bir çerçeve tabanlı sürücü WdfFdoQueryForInterface çağrısı yaparak ve bir GUID, sürüm numarası, bir yapı işaretçisi ve yapı boyutu geçirerek arabirime erişim isteyebilir. Çerçeve bir G/Ç isteği oluşturur ve sürücü yığınının en üstüne gönderir.
Bir sürücü genellikle EvtDriverDeviceAdd geri çağırma işlevinin içinden WdfFdoQueryForInterface'i çağırır. Alternatif olarak, cihaz çalışma durumunda olmadığında sürücünün arabirimi serbest bırakması gerekiyorsa, sürücü bir EvtDevicePrepareHardware geri çağırma işlevinin içinden WdfFdoQueryForInterface'i çağırabilir ve bir EvtDeviceReleaseHardware geri çağırma işlevinin içinden arabirimin başvuru yordamını çağırabilir.
A sürücüsü B sürücüsünden B sürücüsünün tanımladığı arabirimi isterse, çerçeve B sürücüsü isteğini işler. Çerçeve, GUID ve sürümün desteklenen bir arabirimi temsil ettiğini ve A sürücüsünün sağladığı yapı boyutunun arabirimi barındıracak kadar büyük olduğunu doğrular.
Bir sürücü WdfFdoQueryForInterface'i çağırdığında, çerçevenin oluşturduğu G/Ç isteği sürücü yığınının en altına kadar ilerler. Basit bir sürücü yığını A, B ve C olmak üzere üç sürücüden oluşuyorsa ve A sürücüsü arabirim isterse, hem B hem de C sürücüsü arabirimi destekleyebilir. Örneğin, B sürücüsü, isteği C sürücüsüne geçirmeden önce A sürücüsünün arabirim yapısını doldurabilir. C sürücüsü, arabirim yapısının içeriğini inceleyen ve muhtemelen bunları değiştiren bir EvtDeviceProcessQueryInterfaceRequest geri çağırma işlevi sağlayabilir.
A sürücüsünün B sürücüsünün arabirimine erişmesi gerekiyorsa ve B sürücüsü uzak bir G/Ç hedefiyse (başka bir ifadeyle, farklı bir sürücü yığınında yer alan bir sürücü), A sürücüsünün WdfFdoQueryForInterface yerine WdfIoTargetQueryForInterface çağrısı yapması gerekir.
One-Way veya Two-Way İletişimi Kullanma
Tek yönlü iletişim sağlayan bir arabirim veya iki yönlü iletişim sağlayan bir arabirim tanımlayabilirsiniz. İki yönlü iletişim belirtmek için, sürücünüz WDF_QUERY_INTERFACE_CONFIG yapısının ImportInterface üyesini TRUE olarak ayarlar.
Arabirim tek yönlü iletişim sağlıyorsa ve A sürücüsü B sürücüsünün arabirimini istiyorsa, arabirim verileri yalnızca B sürücüsünden A sürücüsüne akar. Çerçeve, A sürücüsünün tek yönlü iletişimi destekleyen bir arabirim isteğini aldığında, çerçeve sürücü tanımlı arabirim değerlerini A sürücüsünün arabirim yapısına kopyalar. Ardından, varsa sürücü B'nin EvtDeviceProcessQueryInterfaceRequest geri çağırma işlevini çağırır, böylece arabirim değerlerini inceleyebilir ve değiştirebilir.
Arabirim iki yönlü iletişim sağlıyorsa, arabirim yapısı A sürücüsünün B sürücüsüne istek göndermeden önce doldurduğu bazı üyeleri içerir. Sürücü B, A sürücüsünün sağladığı parametre değerlerini okuyabilir ve bu değerlere göre, A sürücüsüne hangi bilgilerin sağlandığı hakkında seçim yapabilir. Çerçeve, A sürücüsünün iki yönlü iletişimi destekleyen bir arabirim isteğini aldığında, çerçeve alınan değerleri inceleyebilmesi ve çıkış değerleri sağlayabilmesi için B'nin EvtDeviceProcessQueryInterfaceRequest geri çağırma işlevini çağırır. Çerçeve, arabirim değerlerini A sürücüsünün arabirim yapısına kopyalamadığından, iki yönlü iletişim için geri çağırma işlevi gereklidir.
Referans Sayısını Koruma
Her arabirim, arabirim için referans sayısını artıran bir referans işlevi ve azaltan bir referans azaltma işlevi içermelidir. Arabirimi tanımlayan sürücü, INTERFACE yapısında bu işlevlerin adreslerini belirtir.
A sürücüsü B sürücüsünden bir arabirim istediğinde, sistem arabirim A sürücüsünün kullanımına sunulmadan önce arabirimin referans fonksiyonunu çağırır. A sürücüsü arabirimi kullanmayı bitirdiğinde, arabirimin referans kaldırma fonksiyonunu çağırması gerekir.
Çoğu arabirim için referans ve referans kaldırma işlevleri, hiçbir şey yapmayan no-op işlevleri olabilir. Çerçeve, çoğu sürücünün kullanabileceği no-op başvuru sayısı işlevleri ( WdfDeviceInterfaceReferenceNoOp ve WdfDeviceInterfaceDereferenceNoOp) sağlar.
Sürücülerin bir arabirimin başvuru sayısını izlemesi ve gerçek başvuru ve başvuru kaldırma işlevleri sağlaması gereken tek zaman, A sürücüsünün uzak G/Ç hedefinden (başka bir sürücü yığınındaki bir sürücü) bir arabirim istemesidir. Bu durumda, A sürücüsü B sürücüsünün arabirimini kullanırken cihazının kaldırılmasını engelleyebilmesi için B sürücüsünün (farklı bir yığında) bir başvuru sayısı uygulaması gerekir.
Bir arabirimi tanımlayan B sürücüsünü tasarlıyorsanız, sürücünüzün arabirimine farklı bir sürücü yığınından erişilip erişilmeyeceğine karar vermeniz gerekir. (Sürücü B, arabirimine yönelik bir isteğin yerel sürücü yığınından mı yoksa uzak bir yığından mı olduğunu belirleyemez.) Sürücünüz uzak yığından gelen arabirim isteklerini destekleyecekse, sürücünün bir başvuru sayısı uygulaması gerekir.
Uzak G/Ç hedefindeki arabirime erişen A sürücüsünü tasarlıyorsanız, sürücü B'nin cihazı kaldırılmak üzereyken arabirimi serbest bırakan bir EvtIoTargetQueryRemove geri çağırma işlevi, B sürücüsünün cihazı sürpriz bir şekilde kaldırıldığında arabirimi serbest bırakan bir EvtIoTargetRemoveComplete geri çağırma işlevi ve cihazı kaldırma girişimi iptal edildiğinde arabirimi yeniden alan bir EvtIoTargetRemoveCanceled geri çağırma işlevi sağlamalıdır.