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.
Pokud chcete SDV povolit ověření ovladače KMDF, musíte deklarovat každou funkci zpětného volání pomocí typu role funkce zpětného volání. Typy rolí funkce zpětného volání jsou definovány v různých souborech hlaviček WDF a jsou zahrnuty při sestavování ovladače se souborem hlaviček Wdf.h. V následující tabulce jsou uvedeny typy rolí funkce a funkce zpětného volání událostí, ke kterým jsou přidružené.
Před definicemi funkcí zpětného volání musíte deklarovat funkce zpětného volání ovladače. Následující příklad ukazuje deklaraci typu role funkce pro zpětnou volací funkci EvtDriverDeviceAdd. V tomto příkladu se funkce zpětného volání nazývá EvtDriverDeviceAdd.
#include <NTDDK.h>
#include <wdf.h>
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
Pokud má funkce zpětného volání deklaraci prototypu funkce, je nutné nahradit prototyp funkce deklarací typu role funkce. Další informace o deklaracích typu role funkce naleznete v tématu Použití deklarací typu role funkce.
V následující tabulce jsou uvedeny typy funkcí zpětného volání a funkce zpětného volání událostí, ke kterým jsou přidružené.
| Typ role funkce | Funkce zpětného volání události |
|---|---|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP |
|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY |
|
EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE |
|
EVT_WDF_CHILD_LIST_CREATE_DEVICE |
|
EVT_WDF_CHILD_LIST_DEVICE_REENUMERATED |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE |
|
EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY |
|
EVT_WDF_SEZNAM_DĚTÍ_POPIS_IDENTIFIKACE_DUPLIKÁT |
|
EVT_WDF_CHILD_LIST_SCAN_FOR_CHILDREN |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_SX |
|
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
|
EVT_WDF_DEVICE_CONTEXT_DESTROY |
|
EVT_WDF_DEVICE_D0_ENTRY |
|
EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED |
|
EVT_WDF_DEVICE_D0_EXIT |
|
EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED |
|
EVT_WDF_DEVICE_DISABLE_WAKE_AT_BUS |
|
EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 |
|
EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX |
|
EVT_WDF_DEVICE_EJECT |
|
EVT_WDF_DEVICE_ENABLE_WAKE_AT_BUS |
|
EVT_WDF_DEVICE_FILE_CREATE |
|
EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS |
|
EVT_WDF_DEVICE_PNP_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_POWER_POLICY_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_POWER_STATE_CHANGE_NOTIFICATION |
|
EVT_WDF_DEVICE_PREPARE_HARDWARE |
|
EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST |
|
EVT_WDF_DEVICE_QUERY_REMOVE |
|
EVT_WDF_DEVICE_QUERY_STOP |
|
EVT_WDF_DEVICE_RELATIONS_QUERY |
|
EVT_WDF_DEVICE_RELEASE_HARDWARE |
|
EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES |
|
EVT_WDF_DEVICE_RESOURCE_REQUIREMENTS_QUERY |
|
EVT_WDF_DEVICE_RESOURCES_QUERY |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_FLUSH |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART |
|
EVT_WDF_DEVICE_SELF_MANAGED_IO_SUSPEND |
|
EVT_WDF_DEVICE_SET_LOCK |
|
EVT_WDF_DEVICE_SHUTDOWN_NOTIFICATION |
|
EVT_WDF_DEVICE_SURPRISE_REMOVAL |
|
EVT_WDF_DEVICE_USAGE_NOTIFICATION |
|
EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED |
|
EVT_WDF_DEVICE_WAKE_FROM_SX_TRIGGERED |
|
EVT_WDF_DMA_ENABLER_DISABLE |
|
EVT_WDF_DMA_ENABLER_ENABLE |
|
EVT_WDF_DMA_ENABLER_FILL |
|
EVT_WDF_DMA_ENABLER_FLUSH |
|
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_START |
|
EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP |
|
EVT_WDF_DPC |
|
EVT_WDF_DRIVER_DEVICE_ADD |
|
EVT_WDF_DRIVER_UNLOAD |
|
EVT_WDF_FILE_CLEANUP |
|
EVT_WDF_FILE_CLOSE |
|
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
|
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
|
EVT_WDF_INTERRUPT_DISABLE |
|
EVT_WDF_INTERRUPT_DPC |
|
EVT_WDF_INTERRUPT_ENABLE |
|
EVT_WDF_INTERRUPT_ISR |
|
EVT_WDF_INTERRUPT_SYNCHRONIZE |
|
EVT_WDF_IO_IN_CALLER_CONTEXT |
|
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
|
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
|
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE |
|
EVT_WDF_IO_QUEUE_IO_DEFAULT |
|
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL |
|
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL |
|
EVT_WDF_IO_QUEUE_IO_READ |
|
EVT_WDF_IO_QUEUE_IO_RESUME |
|
EVT_WDF_IO_QUEUE_IO_STOP |
|
EVT_WDF_IO_QUEUE_IO_WRITE |
|
EVT_WDF_IO_QUEUE_STATE |
|
EVT_WDF_IO_TARGET_QUERY_REMOVE |
|
EVT_WDF_IO_TARGET_REMOVE_CANCELED |
|
EVT_WDF_IO_TARGET_REMOVE_COMPLETE |
|
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
|
EVT_WDF_OBJECT_CONTEXT_DESTROY |
|
EVT_WDF_PROGRAM_DMA |
|
EVT_WDF_REQUEST_CANCEL |
|
EVT_WDF_REQUEST_COMPLETION_ROUTINE |
|
EVT_WDF_TIMER |
|
EVT_WDF_TRACE_CALLBACK |
|
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD |
|
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE |
|
EVT_WDF_WMI_INSTANCE_SET_INSTANCE |
|
EVT_WDF_WMI_INSTANCE_SET_ITEM |
|
EVT_WDF_WMI_PROVIDER_FUNCTION_CONTROL |
|
EVT_WDF_WORKITEM |
|
EVT_WDFDEVICE_WDM_IRP_PREPROCESS |
Typy rolí funkcí, které umožňují více funkcí zpětného volání
Existují některé typy rolí funkcí, které můžou mít přidružených více funkcí zpětného volání událostí. Například ovladač může mít více funkcí zpětného volání EvtTimerFunc nebo EvtDpcFunc . Následující tabulka ukazuje maximální počet zpětných volání, které SDV podporuje pro každý typ role funkce. I když není správné, aby ovladač měl více než maximální počet funkcí zpětného volání uvedených v tabulce, komplikuje proces ověření při použití SDV. Informace o změnách, které může být nutné provést v souboru Sdv-map.h, aby vyhovovaly dalším funkcím zpětného volání, naleznete v tématu Duplicitní vstupní body pro typ role funkce.
| Typ role funkce | Maximální počet funkcí zpětného volání |
|---|---|
EVT_WDF_DPC |
7 |
EVT_WDF_INTERRUPT_SYNCHRONIZE |
11 |
EVT_WDF_TIMER |
6 |
EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD |
5 |
EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE |
5 |
EVT_WDF_WMI_INSTANCE_SET_INSTANCE |
5 |
EVT_WDF_WMI_INSTANCE_SET_ITEM |
5 |
Typy rolí funkcí a vstupně-výstupní fronty
Následující typy rolí funkce použijte, když deklarujete obslužné rutiny požadavků a funkce zpětného volání, které spoléhají na architekturu KMDF k doručování vstupně-výstupních požadavků ovladači (pro sekvenční nebo paralelní odesílání). Nepoužívejte tyto typy rolí funkce pro funkce, které ručně přeposílají požadavky z výchozí fronty do jiných front (ruční odesílání). SDV nepodporuje model paměti, jenž umožňuje trasovat požadavky z jedné fronty do druhé.
Další informace o vstupně-výstupních frontách najdete v tématu Vytváření vstupně-výstupních front.
| Funkční role používané pro vstupně-výstupní frontu nakonfigurovanou pro ruční dispečink |
|---|
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE |
EVT_WDF_IO_QUEUE_IO_DEFAULT |
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL |
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL |
EVT_WDF_IO_QUEUE_IO_READ |
EVT_WDF_IO_QUEUE_IO_RESUME |
EVT_WDF_IO_QUEUE_IO_STOP |
EVT_WDF_IO_QUEUE_IO_WRITE |
EVT_WDF_IO_QUEUE_STATE |
Typy rolí funkcí pro funkce EvtCleanupCallback a EvtDestroyCallback
Je nutné deklarovat EvtCleanupCallback a EvtDestroyCallback funkce s typy rolí specifických pro objekt. SDV vyžaduje, aby tyto typy rolí specifické pro objekty určily, jestli ovladač správně používá funkci zpětného volání. Pomocí následujících tabulek určete, jaký typ funkce se má použít.
| Typ objektu | Typ role funkce pro EvtCleanupCallback |
|---|---|
Objekt zařízení |
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
Objekt fronty vstupně-výstupních operací |
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
Objekt souboru |
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
Všechny ostatní objekty |
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
| Typ objektu | Typ role funkce pro EvDestroyCallback |
|---|---|
Objekt zařízení |
EVT_WDF_DEVICE_CONTEXT_DESTROY |
Objekt fronty vstupně-výstupních operací |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
Objekt souboru |
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
Všechny ostatní objekty |
EVT_WDF_OBJECT_CONTEXT_DESTROY |