다음을 통해 공유


사전 작업 콜백 루틴에서 I/O 작업 보류 중

미니필터 드라이버의 사전 운용 콜백 루틴 은 작업을 시스템 작업 큐에 게시하고 FLT_PREOP_PENDING 반환하여 I/O 작업을 보류할 수 있습니다. 이 상태 값을 반환하면 미니필터 드라이버가 FltCompletePendedPreOperation을 호출하여 I/O 작업에 대한 처리를 다시 시작할 때까지 I/O 작업의 제어를 유지하고 있음을 나타냅니다.

미니필터 드라이버의 사전 운용 콜백 루틴은 다음 단계를 수행하여 I/O 작업을 보류합니다.

  1. FltQueueDeferredIoWorkItem과 같은 루틴을 호출하여 I/O 작업을 시스템 작업 큐에 게시합니다.

  2. FLT_PREOP_PENDING 반환합니다.

들어오는 모든 I/O 작업을 보류해야 하는 미니필터 드라이버는 FltQueueDeferredIoWorkItem 과 같은 루틴을 보류 중인 작업에 사용하면 안 됩니다. 이 루틴을 호출하면 시스템 작업 큐가 플러드될 수 있기 때문입니다. 대신 이러한 미니필터 드라이버는 취소가 안전한 큐를 사용해야 합니다. 취소 안전 큐 사용에 대한 자세한 내용은 FltCbdqInitialize를 참조하세요.

다음 조건이 충족되면 FltQueueDeferredIoWorkItem 에 대한 호출이 실패합니다.

  • 작업은 IRP 기반 I/O 작업이 아닙니다.

  • 작업은 페이징 I/O 작업입니다.

  • 현재 스레드의 TopLevelIrp 필드가 NULL이 아닙니다. (이 필드의 값을 찾는 방법에 대한 자세한 내용은 IoGetTopLevelIrp을 참조하세요.)

  • I/O 작업에 대한 대상 instance 삭제되고 있습니다.

미니필터 드라이버의 사전 운용 콜백 루틴이 FLT_PREOP_PENDING 반환하는 경우 CompletionContext 출력 매개 변수에서 NULL을 반환해야 합니다.

미니필터 드라이버는 IRP 기반 I/O 작업에 대해서만 FLT_PREOP_PENDING 반환할 수 있습니다. 작업이 IRP 기반 I/O 작업인지 확인하려면 FLT_IS_IRP_OPERATION 매크로를 사용합니다.

I/O 작업을 큐에서 제거하고 처리하는 작업 루틴은 FltCompletePendedPreOperation 을 호출하여 작업에 대한 처리를 다시 시작해야 합니다.