다음을 통해 공유


WDM IRP 및 WDF 이벤트 콜백 함수

KMDF(Kernel-Mode Driver Framework) 및 UMDF(User-Mode Driver Framework)는 Windows IRP의 하위 집합을 지원합니다. 다음 표에는 주요 WDM IRP 형식 및 해당 프레임워크 이벤트 콜백 함수가 나와 있습니다. 달리 지정하지 않는 한 콜백은 KMDF와 UMDF 모두에 적용됩니다.

주요 IRP 코드 WDF 이벤트 콜백 함수
IRP_MJ_CLEANUP EvtFileCleanup
IRP_MJ_CLOSE EvtFileClose
IRP_MJ_CREATE EvtDeviceFileCreate 또는 EvtIoDefault
IRP_MJ_CREATE_MAILSLOT 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_DEVICE_CHANGE 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_DEVICE_CONTROL EvtIoDeviceControl 또는 EvtIoDefault
IRP_MJ_DIRECTORY_CONTROL 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_FILE_SYSTEM_CONTROL 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_FLUSH_BUFFERS 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl 또는 EvtIoDefault
IRP_MJ_LOCK_CONTROL 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_PNP 많은; IRP_MJ_PNP KMDF 콜백을 참조하세요.
IRP_MJ_POWER 많은; IRP_MJ_POWER KMDF 콜백을 참조하세요.
IRP_MJ_QUERY_EA 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_QUERY_INFORMATION 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_QUERY_QUOTA 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_QUERY_SECURITY 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_QUERY_VOLUME_INFORMATION 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_READ EvtIoRead 또는 EvtIoDefault
IRP_MJ_SET_EA 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_SET_INFORMATION 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_SET_QUOTA 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_SET_SECURITY 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_SET_VOLUME_INFORMATION 직접 지원 없음; EvtDeviceWdmIrpPreprocess 구현(KMDF에만 해당)
IRP_MJ_SHUTDOWN

제어 디바이스 개체의 경우 EvtDeviceShutdownNotification(KMDF만 해당)을 구현합니다.

모든 플러그 앤 플레이 디바이스 개체의 경우: 지원되지 않습니다. EvtDeviceWdmIrpPreprocess(KMDF만 해당)를 구현합니다.

IRP_MJ_SYSTEM_CONTROL WDFWMIPROVIDER 및 WDFWMIINSTANCE 개체를 만들고 EvtWmiXxx(KMDF에만 해당) 콜백을 구현합니다.
IRP_MJ_WRITE EvtIoWrite 또는 EvtIoDefault

IRP_MJ_PNP KMDF 콜백

다음 표에서는 실행 순서대로 IRP_MJ_PNP 대한 부 IRP 코드에 해당하는 KMDF 콜백을 나열합니다. 화살표는 WDM FDO가 스택을 위 또는 아래로 이동할 때 IRP를 처리하는지 여부를 나타냅니다.

참고 KMDF 드라이버에서 플러그 앤 플레이 및 전원 관리는 통합 작업이며 드라이버는 개별 사소한 IRP_MJ_PNP 또는 IRP_MJ_POWER 요청을 받지 않습니다. 대신, 프레임워크는 전원 켜기 시 핵심 콜백 집합과 전원이 켜진 해당 집합을 호출하고 각 개별 플러그 앤 플레이 요청에 적절하게 이 코어 집합 전후에 추가 콜백을 호출합니다. 전원 켜기 및 전원 다운 시퀀스를 보여 주는 포괄적인 다이어그램은 PnP 및 전원 관리 기능 포팅을 참조하세요.

부 코드 IRP_MJ_PNP KMDF 콜백
IRP_MN_CANCEL_REMOVE_DEVICE 없음
IRP_MN_CANCEL_STOP_DEVICE 없음
IRP_MN_DEVICE_USAGE_NOTIFICATION EvtDeviceUsageNotification
IRP_MN_EJECT EvtDeviceEject(KMDF에만 해당)
IRP_MN_FILTER_RESOURCE_REQUIREMENTS EvtDeviceFilterRemoveResourceRequirements(KMDF에만 해당)
IRP_MN_FILTER_RESOURCE_REQUIREMENTS EvtDeviceFilterAddResourceRequirements(KMDF에만 해당)
IRP_MN_QUERY_BUS_INFORMATION 없음 KMDF 드라이버는 WdfDeviceInitXxx 메서드를 호출하여 초기화 중에 디바이스 속성을 설정하여 프레임워크가 드라이버에 알리지 않고 이 쿼리에 자체적으로 응답할 수 있도록 합니다.
IRP_MN_QUERY_CAPABILITIES 없음 KMDF 드라이버는 WdfDeviceInitXxx 메서드를 호출하여 초기화 중에 디바이스 속성을 설정하여 프레임워크가 드라이버에 알리지 않고 이 쿼리에 자체적으로 응답할 수 있도록 합니다.
IRP_MN_QUERY_DEVICE_RELATIONS (버스, 제거 및 배출 관계) EvtDeviceRelationsQuery
IRP_MN_QUERY_DEVICE_TEXT 없음 KMDF 드라이버는 WdfDeviceInitXxx 메서드를 호출하여 초기화 중에 디바이스 속성을 설정하여 프레임워크가 드라이버에 알리지 않고 이 쿼리에 자체적으로 응답할 수 있도록 합니다.
IRP_MN_QUERY_ID 없음 KMDF 드라이버는 WdfDeviceInitXxx 메서드를 호출하여 초기화 중에 디바이스 속성을 설정하여 프레임워크가 드라이버에 알리지 않고 이 쿼리에 자체적으로 응답할 수 있도록 합니다.
IRP_MN_QUERY_INTERFACE EvtDeviceProcessQueryInterfaceRequest(KMDF만 해당)
IRP_MN_QUERY_PNP_DEVICE_STATE 없음 KMDF 드라이버는 WdfDeviceInitXxx 메서드를 호출하여 초기화 중에 디바이스 속성을 설정하여 프레임워크가 드라이버에 알리지 않고 이 쿼리에 자체적으로 응답할 수 있도록 합니다.
IRP_MN_QUERY_REMOVE_DEVICE EvtDeviceQueryRemove
IRP_MN_QUERY_RESOURCE_REQUIREMENTS EvtDeviceResourceRequirementsQuery(KMDF에만 해당)
IRP_MN_QUERY_RESOURCES EvtDeviceResourcesQuery(KMDF에만 해당)
IRP_MN_QUERY_STOP_DEVICE EvtDeviceQueryStop
IRP_MN_READ_CONFIG 없음 KMDF 드라이버는 WdfDeviceInitXxx 메서드를 호출하여 초기화 중에 디바이스 속성을 설정하여 프레임워크가 드라이버에 알리지 않고 이 쿼리에 자체적으로 응답할 수 있도록 합니다.
IRP_MN_REMOVE_DEVICE

IRP_MN_QUERY_REMOVE_DEVICE 후:

EvtDeviceSelfManagedIoSuspendEvtIoStop(WdfRequestStopActionSuspend 플래그) EvtDmaEnablerSelfManagedIoStop(KMDF만 해당)EvtDmaEnablerDisable(KMDF만 해당)EvtDmaEnablerFlush (KMDF만 해당)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final state) EvtDeviceReleaseHardwareEvtIoStop ( WDFDEVICEWDFDEVICE EvtDestroyCallback용 전원 관리 큐 EvtDeviceSelfManagedIoFlushEvtIoStop(WdfRequestStopActionPurge 플래그)에 대한 WdfRequestStopActionPurge 플래그)

IRP_MN_SURPRISE_REMOVAL 후:

WDFDEVICE용 WDFDEVICE EvtDestroyCallback용 EvtDeviceSelfManagedIoCleanup EvtCleanupCallback 비전력 관리 큐에 대한 EvtIoStop(WdfRequestStopActionPurge 플래그)
IRP_MN_SET_LOCK EvtDeviceSetLock(KMDF에만 해당)
IRP_MN_START_DEVICE

열거 후:

EvtDeviceRemoveAddedResources(KMDF만 해당)EvtDevicePrepareHardwareEvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnablerFill(KMDF만 해당)EvtDmaEnablerEnable(KMDF만 해당)EvtDmaEnablerSelfManagedIoStart(KMDF만 해당)EvtDeviceSelfManagedIoInit

IRP_MN_STOP_DEVICE 후:

EvtDeviceRemoveAddedResources(KMDF만 해당)EvtDevicePrepareHardwareEvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnablerFill(KMDF만 해당)EvtDmaEnablerEnable(KMDF만 해당)EvtDmaEnablerSelfManagedIoStart(KMDF만 해당)EvtIoResumeEvtDeviceSelfManagedIoRestart
IRP_MN_STOP_DEVICE EvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend 플래그) EvtDmaEnablerSelfManagedIoStop(KMDF만 해당)EvtDmaEnablerDisable(KMDF만 해당)EvtDmaEnablerFlush(KMDF만 해당)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit (WdfPowerDeviceD3Final 상태) EvtDeviceReleaseHardware
IRP_MN_SURPRISE_REMOVAL EvtDeviceSurpriseRemovalEvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend 플래그) EvtDmaEnablerSelfManagedIoStop (KMDF만 해당)EvtDmaEnablerDisable (KMDF만 해당)EvtDmaEnablerFlush(KMDF만 해당)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit(WdfPowerDeviceD3Final 상태) EvtDeviceReleaseHardwareEvtIoStop 전원 관리 큐 EvtDeviceSelfManagedIoFlush에 대한 (WdfRequestStopActionPurge 플래그)
IRP_MN_WRITE_CONFIG 없음 KMDF 드라이버는 WdfDeviceInitXxx 메서드를 호출하여 초기화 중에 디바이스 속성을 설정하여 프레임워크가 드라이버에 알리지 않고 이 쿼리에 자체적으로 응답할 수 있도록 합니다.

IRP_MJ_POWER KMDF 콜백

다음 표에서는 실행 순서대로 IRP_MJ_POWER 대한 부 IRP 코드에 해당하는 KMDF 콜백을 나열합니다. 화살표는 WDM FDO가 스택을 위 또는 아래로 이동할 때 IRP를 처리하는지 여부를 나타냅니다.

참고 참고: KMDF 드라이버에서 플러그 앤 플레이 및 전원 관리는 통합 작업이며 드라이버는 개별 사소한 IRP_MJ_PNP 또는 IRP_MJ_POWER 요청을 받지 않습니다. 대신 프레임워크는 전원 켜기 시 핵심 콜백 집합과 전원이 낮을 때 해당 집합을 호출하고 각 개별 플러그 앤 플레이 요청에 적절하게 이 코어 집합 전후에 추가 콜백을 호출합니다. 전원 켜기 및 전원 다운 시퀀스를 보여 주는 포괄적인 다이어그램은 PnP 및 전원 관리 기능 포팅을 참조하세요.

부 코드 IRP_MJ_POWER 프레임워크 콜백
D1, D2 또는 D3의 경우 IRP_MN_SET_POWER(전원이 닫됨) EvtDeviceSelfManagedIoSuspendEvtIoStop (WdfRequestStopActionSuspend 플래그) EvtDeviceArmWakeFromS0 또는 EvtDeviceArmWakeFromSxEvtDmaEnablerSelfManagedIoStop (KMDF만 해당)EvtDmaEnablerDisable (KMDF만 해당)EvtDmaEnablerFlush (KMDF만 해당)EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisableEvtDeviceD0Exit
D0용 IRP_MN_SET_POWER(전원 켜기) EvtDeviceD0EntryEvtInterruptEnableEvtDeviceD0EntryPostInterruptsEnabledEvtDmaEnablerFill (KMDF에만 해당)EvtDmaEnablerEnablerEnable(KMDF만 해당)EvtDmaEnablerSelfManagedIoStart (KMDF만 해당)EvtIoResumeEvtDeviceSelfManagedIoRestart
Sx에 대한 IRP_MN_SET_POWER 없음
Sx에 대한 IRP_MN_SET_POWER 없음
IRP_MN_POWER_SEQUENCE 없음
IRP_MN_WAIT_WAKE EvtDeviceEnableWakeAtBus(KMDF에만 해당)
IRP_MN_WAIT_WAKE EvtDeviceDisableWakeAtBus(KMDF에만 해당)