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 매개 변수에 지정된 콜백 루틴의 컨텍스트 매개 변수로 전달될 호출자 정의 컨텍스트 정보에 대한 포인터입니다.
반환 값
FltQueueDeferredIoWorkItem 루틴은 STATUS_SUCCESS 또는 다음 중 하나와 같은 적절한 NTSTATUS 값을 반환합니다.
| 반환 코드 | 설명 |
|---|---|
| STATUS_FLT_DELETING_OBJECT | I/O 작업의 대상 인스턴스(Data->Iopb->TargetInstance)가 삭제되고 있습니다. 오류 코드입니다. |
| 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 매크로를 사용합니다.
I/O 작업을 작업자 스레드에 안전하게 게시할 수 없는 경우 FltQueueDeferredIoWorkItem 은 STATUS_FLT_NOT_SAFE_TO_POST_OPERATION 반환합니다. 가능한 원인은 다음과 같습니다.
FltQueueDeferredIoWorkItem 은 페이징 I/O 작업을 작업자 스레드에 게시할 수 없습니다.
결과 파일 시스템 재귀로 인해 교착 상태 또는 스택 오버플로가 발생할 수 있으므로 현재 스레드의 TopLevelIrp 필드가 NULL 이 아닌 경우 FltQueueDeferredIoWorkItem 에서 작업자 스레드에 I/O 작업을 게시할 수 없습니다. 자세한 내용은 IoGetTopLevelIrp을 참조하세요.
미니 필터 드라이버는 다음과 같이 preoperation 콜백(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 |
참고 항목
피드백
다음에 대한 사용자 의견 제출 및 보기