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_주소_설명_중복 |
|
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_하위_목록_식별_설명_중복) |
|
EVT_WDF_CHILD_LIST_SCAN_FOR_CHILDREN |
|
EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 (EVT_WDF_장치_ARM_웨이크_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 (D0 상태 종료) |
|
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_디바이스_릴리스_하드웨어) |
|
EVT_WDF_DEVICE_REMOVE_ADDED_RESOURCES |
|
EVT_WDF_장치_자원_요구_쿼리 (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 (DMA 관리자 셀프 관리된 I/O 중지 이벤트) |
|
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_인스턴스_설정_인스턴스 |
|
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_인스턴스_설정_인스턴스 |
5 |
EVT_WDF_WMI_INSTANCE_SET_ITEM |
5 |
함수 역할 형식 및 I/O 큐
요청 처리기 및 KMDF 프레임워크를 사용하는 콜백 함수를 선언하여 드라이버에 I/O 요청을 전달할 때 다음 함수 역할 형식을 사용합니다(순차적 또는 병렬 디스패치용). 기본 큐에서 다른 큐로 요청을 수동으로 전달하는 함수에는 이러한 함수 역할 형식을 사용하지 마세요(수동 디스패치). SDV는 한 큐에서 다른 큐로 요청을 추적할 수 있는 메모리 모델을 지원하지 않습니다.
I/O 큐에 대한 자세한 내용은 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 |
파일 개체 |
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK |
기타 모든 개체 |
EVT_WDF_OBJECT_CONTEXT_DESTROY |