다음을 통해 공유


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_EAIRP_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_READIRP_MJ_WRITE 사용됩니다. 이 플래그를 설정하면 볼륨의 디바이스 개체에서 DO_VERIFY_VOLUME 플래그가 설정된 경우에도 I/O 작업을 수행해야 합니다.
SL_RESTART_SCAN IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EAIRP_MJ_SET_QUOTA 사용됩니다. 이 플래그를 설정하면 디렉터리 또는 목록의 첫 번째 항목에서 디렉터리, 할당량 또는 확장 특성 정보 검색이 시작됩니다. 그렇지 않으면 이전 검사에서 검사를 다시 시작해야 합니다.
SL_RETURN_SINGLE_ENTRY IRP_MJ_DIRECTORY_CONTROL, IRP_MJ_QUERY_EAIRP_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 입력 매개 변수로 받습니다.

미니필터의 사전 작업 및 사후 콜백 루틴은 MajorFunctionReserved 멤버를 제외하고 I/O 작업에 대한 FLT_IO_PARAMETER_BLOCK 구조체의 내용을 수정할 수 있습니다. 이 경우 작업에 대한 콜백 데이터 구조의 IoStatus 멤버도 수정하지 않는 한 FltSetCallbackDataDirty를 호출해야 합니다. 그렇지 않으면 수정된 값이 무시됩니다.

필터 관리자가 미니필터에 대한 사전 작업 또는 사후 콜백을 실행하면 FltObjects-FileObject>TargetFileObject(CallbackData-Iopb-TargetFileObject>>)는 처음에 동일합니다. 미니 필터가 TargetFileObject 또는 TargetInstance를 수정하는 경우 사전 작업 콜백에서 FltSetCallbackDataDirty에 대한 후속 호출로 인해 필터 관리자가 FltObjects-FileObjects>FltObjects-Instance>를 대체한 후 필터를 낮추기 위해 작업을 보냅니다.

미니필터의 사전 작업 콜백 루틴이 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 포함)

추가 정보

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateCallbackData

FltClearCallbackDataDirty

FltDecodeParameters

FltIsCallbackDataDirty

FltReadFile

FltSetCallbackDataDirty

IO_STACK_LOCATION

IRP

FLT_PARAMETERS

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_FLUSH_BUFFERS

IRP_MJ_SHUTDOWN

PFLT_COMPLETED_ASYNC_IO_CALLBACK

PFLT_GENERATE_FILE_NAME

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK