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 | 작업은 master 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 작업의 대상인 미니필터에 대한 불투명 instance 포인터입니다.
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
Minifilter의 사전 운용 및 사후 콜백 루틴은 MajorFunction 및 예약 멤버를 제외하고 I/O 작업에 대한 FLT_IO_PARAMETER_BLOCK 구조체의 내용을 수정할 수 있습니다. 이 경우 작업에 대한 콜백 데이터 구조의 IoStatus 멤버도 수정하지 않는 한 FltSetCallbackDataDirty를 호출해야 합니다. 그렇지 않으면 수정된 값이 무시됩니다.
필터 관리자가 미니필터에 대한 사전 작업 또는 사후 콜백을 실행하면 FltObjects-FileObject> 및 TargetFileObject(CallbackData-Iopb-TargetFileObject>>)는 처음에 동일합니다. 미니필터가 TargetFileObject 또는 TargetInstance를 수정하는 경우 후속 FltSetCallbackDataDirty를 사전 작업 콜백에서 호출하면 필터 관리자가 FltObjects-FileObject> 및 FltObjects-Instance> 를 대체한 후 필터를 낮추기 위해 작업을 보냅니다.
미니필터의 사전 운용 콜백 루틴이 I/O 작업에 대한 매개 변수를 수정하는 경우 미니필터 instance 스택 아래의 모든 미니필터는 사전 작업 및 사후 콜백 루틴에서 수정된 매개 변수를 받습니다.
수정된 매개 변수는 미니필터의 자체 사후 콜백 루틴 또는 미니필터 instance 스택의 해당 미니필터 위의 미니 필터에서 수신되지 않습니다. 모든 경우에 미니필터의 사전 작업 및 사후 콜백 루틴은 동일한 입력 매개 변수 값을 받습니다.
미니 필터가 TargetInstance 멤버의 값을 변경하는 경우 새 값은 다른 볼륨의 동일한 고도에서 동일한 미니필터의 instance 대한 포인터여야 합니다. 또한 새 볼륨의 디바이스 개체에는 원래 볼륨의 디바이스 개체보다 크거나 같은 스택 크기가 있어야 합니다.
볼륨에 연결된 instance 대한 불투명 instance 포인터가 지정된 볼륨 디바이스 개체의 스택 크기를 얻으려면 다음을 수행합니다.
- FltGetVolumeFromInstance를 호출하여 볼륨 포인터를 가져옵니다.
- FltGetDeviceObject를 호출하여 볼륨 디바이스 개체에 대한 포인터를 가져옵니다. 이 포인터는 DeviceObject 매개 변수에 반환됩니다. 디바이스 개체의 스택 크기는 DeviceObject-StackSize>에서 찾을 수 있습니다.
- 볼륨 포인터가 더 이상 필요하지 않으면 FltObjectDereference 를 호출하여 참조 수를 감소합니다.
- 볼륨 디바이스 개체 포인터가 더 이상 필요하지 않으면 ObDereferenceObject 를 호출하여 참조 수를 감소합니다.
미니필터는 TargetFileObject 멤버의 값을 변경할 수 있습니다. 그러나 새 값은 TargetInstance 멤버가 지정한 instance 동일한 볼륨에 있는 파일의 파일 개체에 대한 포인터여야 합니다.
미니필터는 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_INTERNAL_DEVICE_CONTROL
IRP_MJ_QUERY_VOLUME_INFORMATION
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기