Deklarace funkcí pomocí typů rolí funkcí pro ovladače WDM

Poznámka:

Počínaje Systémem Windows 10 verze 2004 už nástroj Static Driver Verifier (SDV) nevyžaduje poznámky k identifikaci typů rutin odesílání pro ovladače WDM. Postupujte podle pokynů v části Základní a Pokročilá inicializace na této stránce.

Chcete-li informovat SDV o vstupních bodech ovladače při analýze ovladače WDM, je nutné deklarovat funkce pomocí deklarací typu role funkce. Typy rolí funkcí jsou definovány v wdm.h. Každý vstupní bod v rutině DriverEntry v ovladači WDM musí být deklarován zadáním odpovídajícího typu role. Typy rolí jsou předdefinované typedefy, které odpovídají rozpoznaným vstupním bodům v ovladači WDM.

Pokud chcete například vytvořit deklaraci typu role funkce pro rutinu ovladače Unload, která se nazývá CsampUnload, použijte předdefinovanou deklaraci typu role typedef DRIVER_UNLOAD. Deklarace typu role funkce musí být uvedena před definicí funkce.

DRIVER_UNLOAD CsampUnload;

Definice funkce CsampUnload zůstává beze změny:

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

SDV rozpozná typy vstupních bodů zobrazených v následující tabulce.

Typ role funkce WDM Rutina WDM

DRIVER_INITIALIZE

DriverEntry

DRIVER_STARTIO

StartIO

DRIVER_UNLOAD

Vyložit

PŘIDAT_ZAŘÍZENÍ_ŘIDIČ

PřidatZařízení

Dispatch_type(typ) DRIVER_DISPATCH

Dispečerské rutiny používané řidičem. Viz Psaní rutin odesílání.

IO_COMPLETION_ROUTINE

IoCompletion

Rutina IoCompletion je nastavena voláním IoSetCompletionRoutine nebo IoSetCompletionRoutineEx a předáním ukazatele funkce do rutiny IoCompletion jako druhého parametru.

ZRUŠENÍ_OVLADAČE

Zrušit

Rutina Cancel je nastavena voláním IoSetCancelRoutine a předáním ukazatele funkce na rutinu zrušení pro IRP jako druhý parametr do funkce.

IO_DPC_ROUTINE

DpcForIsr

Rutina DpcForIsr je registrována voláním IoInitializeDpcRequest a předáním ukazatele funkce do rutiny DpcForIsr jako druhý parametr. Chcete-li zařadit DPC do fronty, zavolejte IoQueueDpc z ISR rutiny pomocí stejného objektu DPC.

KDEFERRED_ROUTINE

CustomDpc

Rutina CustomDpc je nastavena voláním KeInitializeDpc a předáním ukazatele funkce CustomDpc jako druhý parametr. Chcete-li vytvořit frontu CustomDpc pro ovladač, zavolejte KeInsertQueueDpc z rutiny ISR pomocí stejného objektu DPC.

KSERVICE_ROUTINE

InterruptService

Rutina InterruptService (ISR) v případě potřeby provádí přerušení zařízení a plánuje zpracování přijatých dat po přerušení.

Žádost o dokončení napájení

Rutina zpětného volání PowerCompletion dokončí zpracování napájecího IRP. Pokud ovladač potřebuje provést další úlohy poté, co všechny ostatní ovladače dokončily IRP, zaregistruje rutinu zpětného volání PowerCompletion během volání rutiny PoRequestPowerIrp, která přiděluje IRP.

WORKER_THREAD_ROUTINE

Rutina

Rutina je rutina zpětného volání, která je zadaná ve druhém parametru funkce ExInitializeWorkItem .

Rutina by měla být deklarována pouze tímto způsobem, pokud ovladač volá ExQueueWorkItem pro přidání pracovní položky do systémové fronty.

Deklarování rutin odesílání ovladačů

Počínaje systémem Windows 10 verze 2004 jsou deklarace typu role funkce pro rutiny odesílání upřesněny s jejich kategorií IRP automaticky na základě inicializace tabulky DriverObject-MajorFunction> v rutině DriverEntry ovladače WDM.

Ovladač Foo musí provádět deklarace rolí pomocí základního nebo pokročilého stylu deklarace, aby byl kompatibilní s SDV.

Základní a pokročilé inicializace

Základní styl je vidět v následujícím příkladu (všimněte si, že názvy rutin odesílání FooCreate a FooCleanup jsou pouze příklady, libovolný vhodný název lze použít):

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

Pokud chcete seznam zkrátit, můžete použít pokročilejší přístup. Zatímco stejná rutina odesílání se používá pro více než jednu kategorii protokolu IRP, ovladač může tímto způsobem zakódovat dvě inicializace:

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

Aby mohl ovladač správně spouštět SDV, musí ovladač používat pouze základní nebo pokročilý styl uvedený výše. Ověření SDV na ovladači nebude fungovat podle očekávání , pokud se nepoužívá jedna z těchto dvou metod.

Parametry funkce a typy rolí funkcí

Podle potřeby v programovacím jazyce C musí typy parametrů, které použijete v definici funkce, odpovídat typům parametrů prototypu funkce, nebo v tomto případě typu role funkce. SDV závisí na podpisech funkce pro analýzu a ignoruje funkce, jejichž podpisy se neshodují.

Měli byste například deklarovat rutinu IoCompletion pomocí typu role IO_COMPLETION_ROUTINE funkce:

IO_COMPLETION_ROUTINE myCompletionRoutine;

Při implementaci myCompletionRoutine musí typy parametrů odpovídat typům parametrů používaným IO_COMPLETION_ROUTINE, konkrétně PDEVICE_OBJECT, PIRP a PVOID (viz rutina IoCompletion pro syntaxi).

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

Spuštění analýzy kódu pro ovladače k ověření deklarací funkcí

Pokud chcete zjistit, jestli je zdrojový kód připravený, spusťte analýzu kódu pro ovladače. Analýza kódu pro ovladače kontroluje deklarace typu role funkce a může pomoct identifikovat deklarace funkcí, které mohly být zmeškané, nebo vás varovat, když parametry definice funkce neodpovídají parametrům v typu role funkce.