다음을 통해 공유


FltQueueDeferredIoWorkItem 함수(fltkernel.h)

FltQueueDeferredIoWorkItem 루틴은 IRP 기반 I/O 작업을 작업 큐에 게시합니다.

구문

NTSTATUS FLTAPI FltQueueDeferredIoWorkItem(
  [in] PFLT_DEFERRED_IO_WORKITEM         FltWorkItem,
  [in] PFLT_CALLBACK_DATA                Data,
  [in] PFLT_DEFERRED_IO_WORKITEM_ROUTINE WorkerRoutine,
  [in] WORK_QUEUE_TYPE                   QueueType,
  [in] PVOID                             Context
);

매개 변수

[in] FltWorkItem

작업 큐에 추가할 작업 항목에 대한 포인터입니다. FltAllocateDeferredIoWorkItem을 호출하여 작업 항목을 할당해야 합니다.

[in] Data

I/O 작업에 대한 FLT_CALLBACK_DATA 구조체에 대한 포인터입니다. 작업은 IRP 기반 I/O 작업이어야 합니다. 지정된 콜백 데이터 구조가 IRP 기반 I/O 작업을 나타내는지 여부를 확인하려면 FLT_IS_IRP_OPERATION 매크로를 사용합니다.

[in] WorkerRoutine

호출자가 제공한 작업자 콜백 루틴에 대한 포인터입니다. 이 루틴은 다음과 같이 선언됩니다.

typedef VOID
(*PFLT_DEFERRED_IO_WORKITEM_ROUTINE) (
    _In_ PFLT_DEFERRED_IO_WORKITEM FltWorkItem,
    _In_ PFLT_CALLBACK_DATA CallbackData,
    _In_opt_ PVOID Context
    );

여기서

  • FltWorkItem 은 지연된 작업 항목 구조에 대한 불투명 포인터입니다.
  • CallbackData 는 I/O 작업의 콜백 데이터 구조에 대한 포인터입니다.
  • 컨텍스트FltQueueDeferredIoWorkItem컨텍스트 매개 변수로 전달된 선택적 컨텍스트 정보 포인터입니다.

[in] QueueType

FltWorkItem이 가리키는 작업 항목을 삽입할 큐를 지정합니다. QueueType 은 다음 값 중 하나일 수 있습니다.

의미
CriticalWorkQueue 실시간 우선 순위 특성이 있는 시스템 스레드가 작업 항목을 처리하는 큐에 작업 항목을 삽입합니다.
DelayedWorkQueue 변수 우선 순위 특성이 있는 시스템 스레드가 작업 항목을 처리하는 큐에 작업 항목을 삽입합니다.

QueueTypeHyperCriticalWorkQueue는 시스템 사용을 위해 예약되어 있습니다.

[in] Context

WorkerRoutine 매개 변수에 지정된 콜백 루틴의 Context 매개 변수로 전달될 호출자 정의 컨텍스트 정보에 대한 포인터입니다.

반환 값

FltQueueDeferredIoWorkItem 루틴은 STATUS_SUCCESS 또는 다음 중 하나와 같은 적절한 NTSTATUS 값을 반환합니다.

반환 코드 설명
STATUS_FLT_DELETING_OBJECT I/O 작업(Data-Iopb-TargetInstance>>)의 대상 instance 제거되고 있습니다. 오류 코드입니다.
STATUS_FLT_NOT_SAFE_TO_POST_OPERATION I/O 작업은 작업자 스레드에 안전하게 게시할 수 없습니다. 이 오류 코드가 반환되는 가능한 이유는 비고를 참조하세요.

설명

FltQueueDeferredIoWorkItem 루틴은 I/O 작업을 시스템 작업 큐에 게시합니다. 지정된 WorkerRoutine 콜백 루틴은 IRQL PASSIVE_LEVEL 시스템 스레드의 컨텍스트에서 호출됩니다.

작업은 IRP 기반 I/O 작업이어야 합니다. 지정된 콜백 데이터 구조가 IRP 기반 I/O 작업을 나타내는지 여부를 확인하려면 FLT_IS_IRP_OPERATION 매크로를 사용합니다.

FltQueueDeferredIoWorkItem 은 I/O 작업을 작업자 스레드에 안전하게 게시할 수 없는 경우 STATUS_FLT_NOT_SAFE_TO_POST_OPERATION 반환합니다. 가능한 이유는 다음과 같습니다.

  • FltQueueDeferredIoWorkItem 은 작업자 스레드에 페이징 I/O 작업을 게시할 수 없습니다.

  • 결과 파일 시스템 재귀로 인해 교착 상태 또는 스택 오버플로가 발생할 수 있으므로 현재 스레드의 TopLevelIrp 필드가 NULL이 아닌 경우 FltQueueDeferredIoWorkItem에서 작업자 스레드에 I/O 작업을 게시할 수 없습니다. 자세한 내용은 IoGetTopLevelIrp을 참조하세요.

미니필터 드라이버는 다음과 같이 PFLT_PRE_OPERATION_CALLBACK(사전 작업 콜백) 루틴에서 FltQueueDeferredIoWorkItem을 사용할 수 있습니다.

  1. 사전 작업 콜백은 FltAllocateDeferredIoWorkItem 을 호출하여 작업 항목을 할당합니다.

  2. 사전 작업 콜백은 FltQueueDeferredIoWorkItem 을 호출하여 작업을 작업 큐에 게시합니다.

  3. 사전 작업 콜백은 FLT_PREOP_PENDING 반환합니다.

  4. I/O 작업을 처리한 후 작업 루틴은 FltCompletePendedPreOperation 을 호출하여 I/O 작업을 필터 관리자로 반환합니다.

  5. 작업 루틴은 FltFreeDeferredIoWorkItem 을 호출하여 작업 항목을 해제합니다.

미니필터 드라이버는 다음과 같이 PFLT_POST_OPERATION_CALLBACK(작업 후 콜백) 루틴에서 FltQueueDeferredIoWorkItem을 사용할 수 있습니다.

  1. 작업 후 콜백은 FltAllocateDeferredIoWorkItem 을 호출하여 작업 항목을 할당합니다.

  2. 작업 후 콜백은 FltQueueDeferredIoWorkItem 을 호출하여 작업을 작업 큐에 게시합니다.

  3. 작업 후 콜백은 FLT_POSTOP_MORE_PROCESSING_REQUIRED 반환합니다.

  4. I/O 작업을 처리한 후 작업 루틴은 FltCompletePendedPostOperation 을 호출하여 I/O 작업을 필터 관리자로 반환합니다.

  5. 작업 루틴은 FltFreeDeferredIoWorkItem 을 호출하여 작업 항목을 해제합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000
대상 플랫폼 유니버설
헤더 fltkernel.h(Fltkernel.h 포함)
라이브러리 Fltmgr.lib
DLL Fltmgr.sys
IRQL <= DISPATCH_LEVEL

추가 정보

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateDeferredIoWorkItem

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltFreeDeferredIoWorkItem

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK