Aracılığıyla paylaş


WDM Sürücüleri için İşlev Rolü Türlerini Kullanarak İşlevleri Bildirme

Uyarı

Windows 10 Sürüm 2004'den başlayarak , Statik Sürücü Doğrulayıcı (SDV) artık WDM sürücüleri için dağıtım yordamlarının rol türlerini tanımlamak için ek açıklama gerektirmez. Lütfen bu sayfanın Temel ve Gelişmiş Başlatmalar bölümündeki yönergeleri izleyin.

Bir WDM sürücüsünü analiz ederken sürücünün giriş noktaları hakkında SDV'ye bilgi vermek için işlev rolü türü bildirimlerini kullanarak işlevleri bildirmeniz gerekir. İşlev rolü türleri Wdm.h içinde tanımlanır. WDM sürücünüzdeki DriverEntry yordamındaki her giriş noktası ilgili rol türü belirtilerek bildirilmelidir. Rol türleri, WDM sürücüsündeki tanınan giriş noktalarına karşılık gelen önceden tanımlanmış tür tanımlarıdır.

Örneğin, bir sürücünün CsampUnload adlı Unload yordamı için işlev rol türü bildirimi oluşturmak için önceden tanımlanmış typedef DRIVER_UNLOAD rol türü bildirimini kullanın. İşlev rolü türü bildirimi, işlev tanımından önce görünmelidir.

DRIVER_UNLOAD CsampUnload;

CsampUnload işlevinin tanımı değişmeden kalır:

VOID
CsampUnload(
    IN PDRIVER_OBJECT DriverObject
    )
{
    ...
}

SDV, aşağıdaki tabloda gösterilen giriş noktası türlerini tanır.

WDM işlev rolü türü WDM rutini

DRIVER_INITIALIZE

DriverEntry

DRIVER_STARTIO

StartIO

SÜRÜCÜ_BOŞALTMA

Boşaltma

SÜRÜCÜ_CİHAZ_EKLE

AddDevice

Dispatch_type(tür) DRIVER_DISPATCH

Sürücü tarafından kullanılan dağıtım yöntemleri. Bkz. Gönderim Yordamları Yazma.

IO_TAMAMLAMA_RUTİNİ

IoCompletion

IoCompletion yordamı, IoSetCompletionRoutine veya IoSetCompletionRoutineEx çağrılarak ve işlev işaretçisi ioCompletion yordamına ikinci parametre olarak geçirilerek ayarlanır.

Sürücü_İptal

İptal

Cancel yordamı, IoSetCancelRoutine çağrılarak ve iptal yordamı olan IRP'nin işlev işaretçisi işleve ikinci parametre olarak geçirilerek ayarlanır.

IO_DPC_ROUTINE

DpcForIsr

DpcForIsr yordamı, IoInitializeDpcRequest çağrılarak ve işlev işaretçisi ikinci parametre olarak DpcForIsr yordamına geçirilerek kaydedilir. DPC'yi kuyruğa almak için aynı DPC nesnesini kullanarak ISR yordamından IoQueueDpc'yi çağırın.

KDEFERRED_ROUTINE

CustomDpc

CustomDpc rutini, KeInitializeDpc çağrılarak ve işlev işaretçisi CustomDpc'ye ikinci parametre olarak geçirilerek ayarlanır. Sürücünün CustomDpc'sini kuyruğa almak için aynı DPC nesnesini kullanarak ISR yordamından KeInsertQueueDpc'i çağırın.

KSERVICE_ROUTINE

InterruptService

InterruptService rutini (ISR) bir cihaz kesintisini işler ve gerekirse alınan verilerin kesme sonrası işlenmesini programlar.

GÜÇ TAMAMLAMA TALEBİ

PowerCompletion geri çağırma yordamı, bir güç IRP'sinin işlenmesini tamamlar. Diğer tüm sürücüler IRP'yi tamamladıktan sonra sürücünün ek görevler gerçekleştirmesi gerekiyorsa, sürücü IRP'yi ayıran PoRequestPowerIrp yordamına yapılan çağrı sırasında bir PowerCompletion geri çağırma yordamı kaydeder.

WORKER_THREAD_ROUTINE

Olağan

Yordam , ExInitializeWorkItem işlevinin ikinci parametresinde belirtilen geri çağırma yordamıdır.

Yordam, yalnızca sürücü iş öğesini bir sistem kuyruğuna eklemek için ExQueueWorkItem'i çağırırsa bu şekilde bildirilmelidir.

Sürücü Dağıtım Rutinlerini Tanımlama

Windows 10 Sürüm 2004'ten itibaren, WDM sürücüsünün DriverEntry yordamında DriverObject-MajorFunction tablosunun başlatılmasına bağlı olarak, dağıtım rutinleri için işlev rolü türü bildirimleri IRP kategorileriyle otomatik olarak düzenlenir.

Sürücü Foo' nun SDV ile uyumlu olması için temel veya gelişmiş bildirim stilini kullanarak rol bildirimlerini gerçekleştirmesi gerekir.

Temel ve Gelişmiş Başlatmalar

Temel stil aşağıdaki örnekte görülebilir (FooCreate ve FooCleanup dağıtım yordamı adlarının yalnızca örnek olduğunu ve uygun herhangi bir adın kullanılabileceğini unutmayın):

DriverObject->MajorFunction[IRP_MJ_CREATE] = FooCreate; //Basic style
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCleanup;

Gerekli listeyi kısaltmak için daha gelişmiş bir yaklaşım benimsilebilir. Birden fazla IRP kategorisi için aynı gönderim yordamı kullanılırken, bir sürücü iki başlatmayı şu şekilde kodlanabilir:

DriverObject->MajorFunction[IRP_MJ_CREATE] = 
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCreateCleanup; // Advanced style for a multi-role dispatch routine 

Bir sürücünün SDV'yi düzgün çalıştırabilmesi için , sürücünün yalnızca yukarıda gösterilen temel veya gelişmiş stili kullanması gerekir. Bu iki yöntemden biri kullanılmazsa sürücüdeki SDV doğrulaması beklendiği gibi çalışmaz .

İşlev Parametreleri ve İşlev Rolü Türleri

C programlama dilinde gerektiği gibi, işlev tanımında kullandığınız parametre türleri işlev prototipinin parametre türleriyle veya bu durumda işlev rolü türüyle eşleşmelidir. SDV, analiz için işlev imzalarına bağlıdır ve imzaları eşleşmeyen işlevleri yoksayar.

Örneğin, IO_COMPLETION_ROUTINE işlev rol türünü kullanarak bir IoCompletion yordamı bildirmeniz gerekir:

IO_COMPLETION_ROUTINE myCompletionRoutine;

myCompletionRoutine uyguladığınızda, parametre türleri IO_COMPLETION_ROUTINE tarafından kullanılanlarla (yani, PDEVICE_OBJECT, PIRP ve PVOID) eşleşmelidir (söz dizimi için bkz. IoCompletion yordamı).

NTSTATUS
myCompletionRoutine(
 PDEVICE_OBJECT  DeviceObject,
 PIRP  Irp,
 PVOID  Context
 )
{
}

İşlev bildirimlerini doğrulamak için Sürücüler için Kod Analizi çalıştırma

Kaynak kodun hazır olup olmadığını belirlemenize yardımcı olması için Sürücüler için Kod Analizi'ni çalıştırın. Sürücüler için Kod Analizi, işlev rolü türü bildirimlerini denetler ve yanıtsız bırakılmış olabilecek işlev bildirimlerini tanımlamaya yardımcı olabilir veya işlev tanımının parametreleri işlev rolü türündekilerle eşleşmediğinde sizi uyarır.