Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 |
|
DRIVER_STARTIO |
|
DRIVER_UNLOAD |
|
PŘIDAT_ZAŘÍZENÍ_ŘIDIČ |
|
| Dispatch_type(typ) DRIVER_DISPATCH | Dispečerské rutiny používané řidičem. Viz Psaní rutin odesílání. |
IO_COMPLETION_ROUTINE |
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 |
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 |
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 |
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 |
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.