次の方法で共有


静的ドライバー検証ツールでの KMDF 関数の宣言

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

EvtChildListAddressDescriptionCleanup

EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY

EvtChildListAddressDescriptionCopy

EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE

Evt子リスト識別説明重複

EVT_WDF_CHILD_LIST_CREATE_DEVICE

EvtChildListCreateDevice

EVT_WDF_CHILD_LIST_DEVICE_REENUMERATED

EvtChildListDeviceReenumerated

EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP

EvtChildListIdentificationDescriptionCleanup

EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE

EvtChildListIdentificationDescriptionCompare

EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY

EvtChildListIdentificationDescriptionCopy

EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE

EvtChildListIdentificationDescriptionDuplicate

EVT_WDF_CHILD_LIST_SCAN_FOR_CHILDREN

EvtChildListScanForChildren

EVT_WDF_DEVICE_ARM_WAKE_FROM_S0

EvtDeviceArmWakeFromS0

EVT_WDF_DEVICE_ARM_WAKE_FROM_SX

EvtDeviceArmWakeFromSx

EVT_WDF_DEVICE_CONTEXT_CLEANUP

EvtCleanupCallback

EVT_WDF_DEVICE_CONTEXT_DESTROY

EvtDestroyCallback

EVT_WDF_DEVICE_D0_ENTRY

EvtDeviceD0Entry

EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED

EvtDeviceD0EntryPostInterruptsEnabled

EVT_WDF_DEVICE_D0_EXIT

EvtDeviceD0Exit

EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED

EvtDeviceD0ExitPreInterruptsDisabled

EVT_WDF_DEVICE_DISABLE_WAKE_AT_BUS

EvtDeviceDisableWakeAtBus

EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 (デバイスがS0状態からのウェイクアップを解除)

EvtDeviceDisarmWakeFromS0

EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX

EvtDeviceDisarmWakeFromSx

EVT_WDF_DEVICE_EJECT

EvtDeviceEject

EVT_WDF_DEVICE_ENABLE_WAKE_AT_BUS

EvtDeviceEnableWakeAtBus

EVT_WDF_DEVICE_FILE_CREATE

EvtDeviceFileCreate

EVT_WDF_DEVICE_FILTER_RESOURCE_REQUIREMENTS

EvtDeviceFilterAddResourceRequirements

EVT_WDF_DEVICE_PNP_STATE_CHANGE_NOTIFICATION

EvtDevicePnpStateChange

EVT_WDF_DEVICE_POWER_POLICY_STATE_CHANGE_NOTIFICATION

EvtDevicePnpStateChange

EVT_WDF_DEVICE_POWER_STATE_CHANGE_NOTIFICATION

EvtDevicePowerStateChange

EVT_WDF_DEVICE_PREPARE_HARDWARE

EvtDevicePrepareHardware

EVT_WDF_DEVICE_PROCESS_QUERY_INTERFACE_REQUEST

EvtDeviceProcessQueryInterfaceRequest

EVT_WDF_DEVICE_QUERY_REMOVE

EvtDeviceQueryRemove

EVT_WDF_DEVICE_QUERY_STOP

EvtDeviceQueryStop

EVT_WDF_DEVICE_RELATIONS_QUERY

EvtDeviceRelationsQuery

EVT_WDF_DEVICE_RELEASE_HARDWARE

EvtDeviceReleaseHardware

EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES

EvtDeviceRemoveAddedResources

EVT_WDF_DEVICE_RESOURCE_REQUIREMENTS_QUERY

EvtDeviceResourceRequirementsQuery

EVT_WDF_DEVICE_RESOURCES_QUERY

EvtDeviceResourcesQuery

EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP

EvtDeviceSelfManagedIoCleanup

EVT_WDF_DEVICE_SELF_MANAGED_IO_FLUSH

EvtDeviceSelfManagedIoFlush

EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT

EvtDeviceSelfManagedIoInit

EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART

EvtDeviceSelfManagedIoRestart

EVT_WDF_DEVICE_SELF_MANAGED_IO_SUSPEND

EvtDeviceSelfManagedIoSuspend

EVT_WDF_DEVICE_SET_LOCK

EvtDeviceSetLock

EVT_WDF_DEVICE_SHUTDOWN_NOTIFICATION

EvtDeviceShutdownNotification

EVT_WDF_DEVICE_SURPRISE_REMOVAL

EvtDeviceSurpriseRemoval

EVT_WDF_DEVICE_USAGE_NOTIFICATION

EvtDeviceUsageNotification

EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED(S0からのデバイスのウェイクアップがトリガーされたイベント)

EvtDeviceWakeFromS0Triggered

EVT_WDF_DEVICE_WAKE_FROM_SX_TRIGGERED

EvtDeviceWakeFromSxTriggered

EVT_WDF_DMA_ENABLER_DISABLE

EvtDmaEnablerDisable

EVT_WDF_DMA_ENABLER_ENABLE

EvtDmaEnablerEnable

EVT_WDF_DMA_ENABLER_FILL

EvtDmaEnablerFill

EVT_WDF_DMA_ENABLER_FLUSH

EvtDmaEnablerFlush

EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_START

EvtDmaEnablerSelfManagedIoStart

EVT_WDF_DMA_ENABLER_SELFMANAGED_IO_STOP

EvtDmaEnablerSelfManagedIoStop

EVT_WDF_DPC

EvtDpcFunc

EVT_WDF_DRIVER_DEVICE_ADD

EvtDriverDeviceAdd

EVT_WDF_DRIVER_UNLOAD

EvtDriverUnload

EVT_WDF_FILE_CLEANUP

EvtFileCleanupする

EVT_WDF_FILE_CLOSE

EvtFileClose

EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK

EvtCleanupCallback

EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK

EvtDestroyCallback

EVT_WDF_INTERRUPT_DISABLE

EvtInterruptDisable

EVT_WDF_INTERRUPT_DPC

EvtInterruptDpc

EVT_WDF_INTERRUPT_ENABLE

EvtInterruptEnable

EVT_WDF_INTERRUPT_ISR

EvtInterruptIsr

EVT_WDF_INTERRUPT_SYNCHRONIZE

EvtInterruptSynchronize

EVT_WDF_IO_IN_CALLER_CONTEXT

EvtIoInCallerContext

EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK

EvtCleanupCallback

EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK

EvtDestroyCallback

EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE

EvtIoCanceledOnQueue

EVT_WDF_IO_QUEUE_IO_DEFAULT

EvtIoDefault

EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL

EvtIoDeviceControl

EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL

EvtIoInternalDeviceControl

EVT_WDF_IO_QUEUE_IO_READ

EvtIoRead

EVT_WDF_IO_QUEUE_IO_RESUME

EvtIoResume

EVT_WDF_IO_QUEUE_IO_STOP

EvtIoStop

EVT_WDF_IO_QUEUE_IO_WRITE

EvtIoWrite

EVT_WDF_IO_QUEUE_STATE

EvtIoQueueState

EVT_WDF_IO_TARGET_QUERY_REMOVE

EvtIoTargetQueryRemove

EVT_WDF_IO_TARGET_REMOVE_CANCELED

EvtIoTargetRemoveCanceled

EVT_WDF_IO_TARGET_REMOVE_COMPLETE

EvtIoTargetRemoveComplete

EVT_WDF_OBJECT_CONTEXT_CLEANUP

EvtCleanupCallback

EVT_WDF_OBJECT_CONTEXT_DESTROY

EVT_WDF_PROGRAM_DMA

EvtProgramDma

EVT_WDF_REQUEST_CANCEL

EvtRequestCancel

EVT_WDF_REQUEST_COMPLETION_ROUTINE

完了ルーチン

EVT_WDF_TIMER

EvtTimerFunc

EVT_WDF_TRACE_CALLBACK

EVT_WDF_WMI_INSTANCE_EXECUTE_METHOD

EvtWmiInstanceExecuteMethod

EVT_WDF_WMI_INSTANCE_QUERY_INSTANCE

EvtWmiInstanceQueryInstance

EVT_WDF_WMI_INSTANCE_SET_INSTANCE

EvtWmiInstanceSetInstance

EVT_WDF_WMI_INSTANCE_SET_ITEM

EvtWmiInstanceSetItem

EVT_WDF_WMI_PROVIDER_FUNCTION_CONTROL

EvtWmiProviderFunctionControl

EVT_WDF_WORKITEM

EvtWorkItem

EVT_WDFDEVICE_WDM_IRP_PREPROCESS

EvtDeviceWdmIrpPreprocess

複数のコールバック関数を許可する関数ロールの種類

複数のイベント コールバック関数を関連付けることができる関数ロールの種類がいくつかあります。 たとえば、ドライバーに複数の 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