SDV で KMDF ドライバーを検証できるようにするには、コールバック関数の役割の種類を使用して、各コールバック関数を宣言する必要があります。 コールバック関数の役割の種類は、さまざまな WDF ヘッダー ファイルで定義され、Wdf.h ヘッダー ファイルを使用してドライバーをビルドするときに含まれます。 次の表は、関数ロールの種類と、それらが関連付けられているイベント コールバック関数を示しています。
コールバック関数の定義の前に、ドライバーのコールバック関数を宣言する必要があります。 次の例は、 EvtDriverDeviceAdd コールバック関数の関数ロール型宣言を示しています。 この例では、コールバック関数は EvtDriverDeviceAdd と呼ばれます。
#include <NTDDK.h>
#include <wdf.h>
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
コールバック関数に関数プロトタイプ宣言がある場合は、関数プロトタイプを関数ロール型宣言に置き換える必要があります。 関数ロール型宣言の詳細については、「 関数ロール型宣言の使用」を参照してください。
次の表は、コールバック関数の型と、それらが関連付けられているイベント コールバック関数を示しています。
| 機能ロールの種類 | イベント コールバック関数 |
|---|---|
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_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE |
|
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 (デバイスが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 |
EvtDeviceQueryRemoveの |
EVT_WDF_DEVICE_QUERY_STOP |
EvtDeviceQueryStopの |
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(S0からのデバイスのウェイクアップがトリガーされたイベント) |
|
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 |
EvtDriverDeviceAddの |
EVT_WDF_DRIVER_UNLOAD |
|
EVT_WDF_FILE_CLEANUP |
EvtFileCleanupをする |
EVT_WDF_FILE_CLOSE |
EvtFileCloseの |
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 |
EvtIoInCallerContextの |
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 |
複数のコールバック関数を許可する関数ロールの種類
複数のイベント コールバック関数を関連付けることができる関数ロールの種類がいくつかあります。 たとえば、ドライバーに複数の EvtTimerFunc または EvtDpcFunc コールバック関数がある場合があります。 次の表は、SDV が各関数ロールの種類に対してサポートするコールバックの最大数を示しています。 ドライバーが、表に示されているコールバック関数の最大数を超える値を持つことは正しくありませんが、SDV を使用する場合、検証プロセスが複雑になります。 追加のコールバック関数に対応するために Sdv-map.h ファイルに加える必要がある変更については、 関数ロールの種類のエントリ ポイントの重複を参照してください。
| 機能ロールの種類 | コールバック関数の最大数 |
|---|---|
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 |
関数役割タイプと I/O キュー
KMDF フレームワークに依存して I/O 要求をドライバーに配信する 要求ハンドラー とコールバック関数を宣言する場合は、次の関数ロールの種類を使用します (順次ディスパッチまたは並列ディスパッチの場合)。 既定のキューから他のキュー (手動ディスパッチ) に要求を手動で転送する関数には、これらの関数ロールの種類を使用しないでください。 SDV では、あるキューから別のキューへの要求を追跡できるメモリ モデルはサポートされていません。
I/O キューの詳細については、 入出力キューの作成を参照してください。
| 手動ディスパッチ用に構成された I/O キューに使用される関数ロールの種類 |
|---|
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 |
EvtCleanupCallback 関数と EvtDestroyCallback 関数の関数ロールの種類
オブジェクト固有の関数ロール型を使用して、 EvtCleanupCallback 関数と EvtDestroyCallback 関数を 宣言する必要があります。 SDV では、ドライバーがコールバック関数を適切に使用しているかどうかを判断するために、これらのオブジェクト固有のロールの種類が必要です。 使用する関数の種類を決定するには、次の表を使用します。
| オブジェクトの種類 | EvtCleanupCallback の関数役割タイプ |
|---|---|
デバイス オブジェクト |
EVT_WDF_DEVICE_CONTEXT_CLEANUP |
I/O キュー オブジェクト |
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK |
ファイルオブジェクト |
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK |
他のすべてのオブジェクト |
EVT_WDF_OBJECT_CONTEXT_CLEANUP |
| オブジェクトの種類 | EvDestroyCallback の関数ロールの種類 |
|---|---|
デバイス オブジェクト |
EVT_WDF_DEVICE_CONTEXT_DESTROY |
I/O キュー オブジェクト |
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK |
File オブジェクト |
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
他のすべてのオブジェクト |
EVT_WDF_OBJECT_CONTEXT_DESTROY |