FLT_IO_PARAMETER_BLOCK 구조체(fltkernel.h)
FLT_IO_PARAMETER_BLOCK 구조에는 FLT_CALLBACK_DATA 콜백 데이터 구조로 표현되는 I/O 작업에 대한 매개 변수가 포함됩니다.
통사론
typedef struct _FLT_IO_PARAMETER_BLOCK {
ULONG IrpFlags;
UCHAR MajorFunction;
UCHAR MinorFunction;
UCHAR OperationFlags;
UCHAR Reserved;
PFILE_OBJECT TargetFileObject;
PFLT_INSTANCE TargetInstance;
FLT_PARAMETERS Parameters;
} FLT_IO_PARAMETER_BLOCK, *PFLT_IO_PARAMETER_BLOCK;
회원
IrpFlags
I/O 작업의 다양한 측면을 지정하는 플래그의 비트 마스크입니다. 이러한 플래그는 IRP 기반 작업에만 사용됩니다. 다음 표에는 플래그 값이 표시됩니다.
값 | 의미 |
---|---|
IRP_BUFFERED_IO | 작업은 버퍼링된 I/O 작업입니다. |
IRP_CLOSE_OPERATION | 작업은 정리 또는 닫기 작업입니다. |
IRP_DEALLOCATE_BUFFER | I/O 관리자는 IRP에 대한 완료 단계에서 버퍼를 해제합니다. |
IRP_INPUT_OPERATION | 이 작업은 입력 작업입니다. |
IRP_NOCACHE | 이 작업은 캐시되지 않은 I/O 작업입니다. |
IRP_PAGING_IO | 이 작업은 페이징 I/O 작업입니다. |
IRP_SYNCHRONOUS_API | I/O 작업은 동기식입니다. |
IRP_SYNCHRONOUS_PAGING_IO | 이 작업은 동기 페이징 I/O 작업입니다. |
IRP_MOUNT_COMPLETION | 작업에 대한 볼륨 탑재가 완료되었습니다. |
IRP_CREATE_OPERATION | 작업은 만들기 또는 열기 작업입니다. |
IRP_READ_OPERATION | I/O 작업은 읽기용입니다. |
IRP_WRITE_OPERATION | I/O 작업은 쓰기용입니다. |
IRP_DEFER_IO_COMPLETION | 작업의 I/O 완료가 지연됩니다. |
IRP_ASSOCIATED_IRP | 작업은 마스터 IRP와 연결됩니다. |
IRP_OB_QUERY_NAME | 작업은 비동기 이름 쿼리입니다. |
IRP_HOLD_DEVICE_QUEUE | 예약. |
IRP_UM_DRIVER_INITIATED_IO | 작업은 사용자 모드 드라이버에서 시작되었습니다. |
MajorFunction
I/O 작업의 주요 함수 코드입니다. 주요 함수 코드는 IRP 기반 작업, 빠른 I/O 작업 및 FSFilter(파일 시스템) 콜백 작업에 사용됩니다. 추가 작업에 대한 자세한 내용은 FLT_PARAMETERS참조하세요.
MinorFunction
I/O 작업에 대한 부 함수 코드입니다. 이 멤버는 선택 사항이며 NULL 수 있습니다. MajorFunction 멤버의 값에 따라 가능한 값이 결정됩니다. 부 함수 코드에 대한 자세한 내용은 FLT_PARAMETERS참조하세요.
OperationFlags
I/O 작업의 다양한 측면을 지정하는 플래그의 비트 마스크입니다. 이러한 플래그는 IRP 기반 작업에만 사용됩니다. 필터 관리자는 IRP연결된 IO_STACK_LOCATION 구조체의 Flags 멤버에서 이러한 플래그를 복사합니다. 다음 표에서는 가장 일반적으로 사용되는 플래그 값을 보여줍니다.
값 | 의미 |
---|---|
SL_CASE_SENSITIVE | IRP_MJ_CREATE데 사용됩니다. 이 플래그를 설정하면 파일 이름 비교는 대/소문자를 구분해야 합니다. |
SL_EXCLUSIVE_LOCK | IRP_MJ_LOCK_CONTROL데 사용됩니다. 이 플래그를 설정하면 전용 바이트 범위 잠금이 요청됩니다. 그렇지 않으면 공유 잠금이 요청됩니다. |
SL_FAIL_IMMEDIATELY | IRP_MJ_LOCK_CONTROL데 사용됩니다. 이 플래그를 설정하면 잠금 요청을 즉시 부여할 수 없으면 실패해야 합니다. |
SL_FORCE_ACCESS_CHECK | IRP_MJ_CREATE데 사용됩니다. 이 플래그를 설정하면 IRP의 RequestorMode 멤버 값이 KernelMode 경우에도 액세스 검사를 수행해야 합니다. |
SL_FORCE_DIRECT_WRITE | IRP_MJ_WRITE 및 IOCTL_DISK_COPY_DATA 사용됩니다. 이 플래그를 설정하면 커널 모드 드라이버는 일반적으로 보안상의 이유로 쓰기가 차단되는 볼륨 영역에 쓸 수 있습니다. 이 플래그는 파일 시스템 계층과 스토리지 스택 계층 모두에서 확인됩니다. SL_FORCE_DIRECT_WRITE 플래그는 Windows Vista 이상 버전의 Windows에서 사용할 수 있습니다. |
SL_INDEX_SPECIFIED | IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA및 IRP_MJ_SET_QUOTA사용됩니다. 이 플래그를 설정하면 인덱스가 지정된 목록의 항목에서 디렉터리, 할당량 또는 확장 특성 정보에 대한 검색을 시작해야 합니다. |
SL_OPEN_PAGING_FILE | IRP_MJ_CREATE데 사용됩니다. 이 플래그가 설정되면 파일은 페이징 파일입니다. |
SL_OPEN_TARGET_DIRECTORY | IRP_MJ_CREATE데 사용됩니다. 이 플래그가 설정되면 파일의 부모 디렉터리를 열어야 합니다. |
SL_OVERRIDE_VERIFY_VOLUME | IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_READ및 IRP_MJ_WRITE사용됩니다. 이 플래그를 설정하면 볼륨의 디바이스 개체에 DO_VERIFY_VOLUME 플래그가 설정된 경우에도 I/O 작업을 수행해야 합니다. |
SL_RESTART_SCAN | IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA및 IRP_MJ_SET_QUOTA사용됩니다. 이 플래그를 설정하면 디렉터리, 할당량 또는 확장 특성 정보에 대한 검색이 디렉터리 또는 목록의 첫 번째 항목에서 시작됩니다. 그렇지 않으면 이전 검사에서 검사를 다시 시작해야 합니다. |
SL_RETURN_SINGLE_ENTRY | IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EA및 IRP_MJ_SET_QUOTA사용됩니다. 이 플래그가 설정되면 디렉터리, 할당량 또는 확장 특성 정보에 대한 검색은 발견된 첫 번째 항목만 반환해야 합니다. |
SL_WATCH_TREE | IRP_MJ_DIRECTORY_CONTROL데 사용됩니다. 이 플래그가 설정되면 이 디렉터리의 모든 하위 디렉터리도 확인해야 합니다. 그렇지 않으면 디렉터리 자체만 감시해야 합니다. |
SL_WRITE_THROUGH | IRP_MJ_WRITE데 사용됩니다. 이 플래그를 설정하는 경우 파일 데이터는 캐시에 기록되는 것이 아니라 영구 스토리지에 기록되어야 합니다. |
Reserved
시스템 사용을 위해 예약되어 있습니다. 사용하지 마세요.
TargetFileObject
이 I/O 작업의 대상인 파일 또는 디렉터리에 대한 파일 개체 포인터입니다.
TargetInstance
이 I/O 작업의 대상인 미니 필터에 대한 불투명 인스턴스 포인터입니다.
Parameters
MajorFunction 및 MinorFunction 멤버로 지정된 I/O 작업에 대한 매개 변수를 포함하는 FLT_PARAMETERS 구조체입니다.
발언
FLT_IO_PARAMETER_BLOCK 구조체에는 콜백 데이터(FLT_CALLBACK_DATA) 구조체로 표현되는 I/O 작업에 대한 매개 변수가 포함됩니다. 콜백 데이터 구조에는 Iopb 멤버의 FLT_IO_PARAMETER_BLOCK 구조에 대한 포인터가 포함됩니다.
미니 필터는 콜백 데이터 구조에 대한 포인터를 Data 또는 CallbackData 입력 매개 변수를 다음 콜백 루틴 형식으로 받습니다.
- PFLT_POST_OPERATION_CALLBACK
- PFLT_PRE_OPERATION_CALLBACK
- PFLT_COMPLETED_ASYNC_IO_CALLBACK
- PFLT_GENERATE_FILE_NAME
미니 필터의 사전 작업 및 사후 콜백 루틴은 MajorFunction 및 예약된 멤버를 제외하고 I/O 작업에 대한 FLT_IO_PARAMETER_BLOCK 구조의 내용을 수정할 수 있습니다. 이 경우 작업에 대한 콜백 데이터 구조의 IoStatus 멤버도 수정하지 않는 한 FltSetCallbackDataDirty호출해야 합니다. 그렇지 않으면 수정된 값이 무시됩니다.
필터 관리자가 미니 필터에 대한 사전 작업 또는 사후 콜백을 실행하면 FltObjects->FileObject 및 TargetFileObject(CallbackData->Iopb->TargetFileObject)는 처음에 동일합니다. 미니 필터가 TargetFileObject 또는 TargetInstance 수정하는 경우 FltSetCallbackDataDirty에 대한 후속 호출은 preop에서. 필터 콜백을 사용하면 필터 관리자가 FltObjects->FileObject 및 FltObjects->인스턴스 대체한 후 작업을 하위 필터로 보냅니다.
미니 필터의 사전 작업 콜백 루틴이 I/O 작업에 대한 매개 변수를 수정하는 경우 미니 필터 인스턴스 스택 아래의 모든 미니 필터는 사전 작업 및 사후 콜백 루틴에서 수정된 매개 변수를 받습니다.
수정된 매개 변수는 미니 필터의 자체 사후 콜백 루틴 또는 미니 필터 인스턴스 스택의 해당 미니 필터 위에 있는 미니 필터에서 수신되지 않습니다. 모든 경우에 미니 필터의 사전 작업 및 사후 콜백 루틴은 동일한 입력 매개 변수 값을 받습니다.
미니 필터가 TargetInstance 멤버의 값을 변경하는 경우 새 값은 다른 볼륨의 동일한 고도에 있는 동일한 미니 필터의 인스턴스에 대한 포인터여야 합니다. 또한 새 볼륨의 디바이스 개체에는 원래 볼륨의 디바이스 개체보다 크거나 같은 스택 크기가 있어야 합니다.
볼륨에 연결된 인스턴스에 대한 불투명 인스턴스 포인터가 지정된 볼륨 디바이스 개체의 스택 크기를 얻으려면 다음을 수행합니다.
- FltGetVolumeFromInstance 호출하여 볼륨 포인터를 가져옵니다.
- FltGetDeviceObject 호출하여 볼륨 디바이스 개체에 대한 포인터를 가져옵니다. 이 포인터는 DeviceObject 매개 변수에 반환됩니다. 디바이스 개체의 스택 크기는 DeviceObject->StackSize찾을 수 있습니다.
- 볼륨 포인터가 더 이상 필요하지 않으면 FltObjectDereference 호출하여 참조 수를 줄입니다.
- 볼륨 디바이스 개체 포인터가 더 이상 필요하지 않은 경우 ObDereferenceObject 호출하여 참조 수를 줄입니다.
미니 필터는 TargetFileObject 멤버의 값을 변경할 수 있습니다. 그러나 새 값은 TargetInstance 멤버가 지정한 인스턴스와 동일한 볼륨에 있는 파일의 파일 개체에 대한 포인터여야 합니다.
미니 필터는 MajorFunction 멤버의 값을 안전하게 변경할 수 없습니다. 대신 새 I/O 작업을 시작해야 합니다.
미니 필터는 FltReadFile 같은 지원 루틴을 호출하거나 FltAllocateCallbackData 호출하여 콜백 데이터 구조를 할당하여 I/O 작업을 시작할 수 있습니다. FLT_IO_PARAMETER_BLOCK 구조에서 I/O 매개 변수를 초기화하고 콜백 데이터 구조를 fltPerformSynchronousIo또는 FltPerformAsynchronousIo전달합니다.
메모
I/O 작업을 시작할 때 가능한 경우 지원 루틴을 사용합니다. 미니 필터는 특정 I/O 작업에 대한 지원 함수가 없는 경우에만 자체 콜백 데이터를 할당해야 합니다.
요구 사항
요구 | 값 |
---|---|
헤더 | fltkernel.h(Fltkernel.h 포함) |
참고 항목
- IRP_MJ_ACQUIRE_FOR_MOD_WRITE대한FLT_PARAMETERS
- IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION대한FLT_PARAMETERS
- IRP_MJ_CREATE대한FLT_PARAMETERS
- IRP_MJ_CREATE_MAILSLOT대한FLT_PARAMETERS
- IRP_MJ_CREATE_NAMED_PIPE대한FLT_PARAMETERS
- IRP_MJ_DEVICE_CONTROL대한FLT_PARAMETERS
- IRP_MJ_DIRECTORY_CONTROL대한FLT_PARAMETERS
- IRP_MJ_FAST_IO_CHECK_IF_POSSIBLE대한FLT_PARAMETERS
- IRP_MJ_FILE_SYSTEM_CONTROL대한FLT_PARAMETERS
- IRP_MJ_INTERNAL_DEVICE_CONTROL대한FLT_PARAMETERS
- IRP_MJ_LOCK_CONTROL대한FLT_PARAMETERS
- IRP_MJ_MDL_READ대한FLT_PARAMETERS
- IRP_MJ_MDL_READ_COMPLETE대한FLT_PARAMETERS
- IRP_MJ_MDL_WRITE_COMPLETE대한FLT_PARAMETERS
- IRP_MJ_NETWORK_QUERY_OPEN대한FLT_PARAMETERS
- IRP_MJ_PNP대한FLT_PARAMETERS
- IRP_MJ_PREPARE_MDL_WRITE대한FLT_PARAMETERS
- IRP_MJ_QUERY_EA대한FLT_PARAMETERS
- IRP_MJ_QUERY_INFORMATION대한FLT_PARAMETERS
- IRP_MJ_QUERY_OPEN대한FLT_PARAMETERS
- IRP_MJ_QUERY_QUOTA대한FLT_PARAMETERS
- IRP_MJ_QUERY_SECURITY대한FLT_PARAMETERS
- IRP_MJ_QUERY_VOLUME_INFORMATION대한FLT_PARAMETERS
- IRP_MJ_READ대한FLT_PARAMETERS
- IRP_MJ_RELEASE_FOR_MOD_WRITE대한FLT_PARAMETERS
- IRP_MJ_RELEASE_FOR_SECTION_SYNCHRONIZATION대한FLT_PARAMETERS
- IRP_MJ_SET_EA대한FLT_PARAMETERS
- IRP_MJ_SET_INFORMATION대한FLT_PARAMETERS
- IRP_MJ_SET_QUOTA대한FLT_PARAMETERS
- IRP_MJ_SET_SECURITY대한FLT_PARAMETERS
- IRP_MJ_SET_VOLUME_INFORMATION대한FLT_PARAMETERS
- IRP_MJ_SYSTEM_CONTROL대한FLT_PARAMETERS
- IRP_MJ_VOLUME_MOUNT대한FLT_PARAMETERS
- IRP_MJ_WRITE대한FLT_PARAMETERS