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 | 변수 우선 순위 특성이 있는 시스템 스레드가 작업 항목을 처리하는 큐에 작업 항목을 삽입합니다. |
QueueType 값 HyperCriticalWorkQueue는 시스템 사용을 위해 예약되어 있습니다.
[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을 사용할 수 있습니다.
사전 작업 콜백은 FltAllocateDeferredIoWorkItem 을 호출하여 작업 항목을 할당합니다.
사전 작업 콜백은 FltQueueDeferredIoWorkItem 을 호출하여 작업을 작업 큐에 게시합니다.
사전 작업 콜백은 FLT_PREOP_PENDING 반환합니다.
I/O 작업을 처리한 후 작업 루틴은 FltCompletePendedPreOperation 을 호출하여 I/O 작업을 필터 관리자로 반환합니다.
작업 루틴은 FltFreeDeferredIoWorkItem 을 호출하여 작업 항목을 해제합니다.
미니필터 드라이버는 다음과 같이 PFLT_POST_OPERATION_CALLBACK(작업 후 콜백) 루틴에서 FltQueueDeferredIoWorkItem을 사용할 수 있습니다.
작업 후 콜백은 FltAllocateDeferredIoWorkItem 을 호출하여 작업 항목을 할당합니다.
작업 후 콜백은 FltQueueDeferredIoWorkItem 을 호출하여 작업을 작업 큐에 게시합니다.
작업 후 콜백은 FLT_POSTOP_MORE_PROCESSING_REQUIRED 반환합니다.
I/O 작업을 처리한 후 작업 루틴은 FltCompletePendedPostOperation 을 호출하여 I/O 작업을 필터 관리자로 반환합니다.
작업 루틴은 FltFreeDeferredIoWorkItem 을 호출하여 작업 항목을 해제합니다.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 2000 |
대상 플랫폼 | 유니버설 |
헤더 | fltkernel.h(Fltkernel.h 포함) |
라이브러리 | Fltmgr.lib |
DLL | Fltmgr.sys |
IRQL | <= DISPATCH_LEVEL |