IRP_MJ_FILE_SYSTEM_CONTROL(FS 및 필터 드라이버)

보낸 경우

I/O 관리자, 기타 운영 체제 구성 요소 및 기타 커널 모드 드라이버는 IRP_MJ_FILE_SYSTEM_CONTROL 요청을 보냅니다. 예를 들어 사용자 모드 애플리케이션이 Win32 DeviceIoControl 함수를 호출하여 FSCTL(파일 시스템 I/O 컨트롤) 요청을 보낸 경우 전송할 수 있습니다.

작업: 파일 시스템 드라이버

파일 시스템 드라이버 또는 인식기는 요청된 파일 시스템 제어 작업을 결정하기 위해 부 함수 코드를 검사 합니다.

파일 시스템 드라이버는 다음 부 함수 코드를 처리해야 합니다.

코드 Description
IRP_MN_KERNEL_CALL 이 요청은 요청의 원본이 신뢰할 수 있는 커널 구성 요소라는 점을 제외하고 IRP_MN_USER_FS_REQUEST(다음 설명)와 동일합니다.
IRP_MN_MOUNT_VOLUME 볼륨 탑재 요청을 나타냅니다. 파일 시스템 드라이버가 파일 시스템의 형식과 일치하지 않는 볼륨에 대해 이 IRP를 수신하는 경우 파일 시스템 드라이버는 STATUS_UNRECOGNIZED_VOLUME 반환해야 합니다.
IRP_MN_USER_FS_REQUEST Microsoft Win32 DeviceIoControl 함수를 호출한 사용자 모드 애플리케이션을 대신하거나 ZwDeviceIoControlFile 또는 IoBuildDeviceIoControlRequest를 호출한 커널 모드 구성 요소를 대신하여 FSCTL 요청을 나타냅니다. FSCTL 요청에 대한 자세한 내용은 Windows SDK 설명서의 "디바이스 입력 및 출력 제어 코드"를 참조하세요.
IRP_MN_VERIFY_VOLUME 볼륨 확인 요청을 나타냅니다. 이동식 미디어의 경우 파일 시스템은 미디어가 제거되고 반환된 것을 감지할 때 볼륨을 확인하여 알려진 볼륨이 여전히 동일한지 확인해야 합니다. 볼륨이 변경된 경우 파일 시스템은 미해결 핸들을 모두 무효화해야 합니다. 이 새 미디어의 파일 시스템이 변경된 경우에도 오류를 반환해야 합니다. 이 요청은 플로피 드라이브에 가장 자주 사용됩니다.

파일 시스템 인식기는 다음 부 함수 코드를 처리해야 합니다.

코드 Description
IRP_MN_LOAD_FILE_SYSTEM 로드 파일 시스템 요청을 나타냅니다.

파일 시스템 드라이버 또는 인식기가 요청된 작업을 수행한 다음 IRP를 완료해야 합니다.

작업: 레거시 파일 시스템 필터 드라이버

필터 드라이버는 이 IRP를 스택의 다음 하위 드라이버로 전달해야 합니다.

매개 변수

파일 시스템 또는 필터 드라이버는 지정된 IRP에 대해 IoGetCurrentIrpStackLocation 을 호출하여 IRP의 자체 스택 위치에 대한 포인터를 가져옵니다. 다음 매개 변수에서 IrpIRP 를 가리키고 IrpSpIO_STACK_LOCATION 가리킵니다. 드라이버는 IRP 및 IRP 스택 위치의 다음 멤버에 설정된 정보를 사용하여 파일 시스템 제어 요청을 처리할 수 있습니다.

  • DeviceObject 는 대상 디바이스 개체에 대한 포인터입니다.

  • Irp->ASSOCIATedIrp.SystemBuffer 는 대상 볼륨에 대한 파일 시스템 또는 파일 시스템 필터 드라이버에 전달될 시스템 제공 입력 버퍼를 가리킵니다. METHOD_BUFFERED 또는 METHOD_DIRECT I/O에 사용됩니다. 이 매개 변수가 필요한지 여부는 특정 파일 시스템 제어 코드에 따라 달라집니다.

  • Irp->IoStatus는 최종 완료 상태 수신하는 IO_STATUS_BLOCK 구조와 요청된 작업에 대한 정보를 가리킵니다.

  • Irp->MdlAddress 는 대상 볼륨에 대한 파일 시스템 또는 파일 시스템 필터 드라이버에 전달될 출력 버퍼를 설명하는 MDL(메모리 설명자 목록)의 주소입니다. METHOD_DIRECT I/O에 사용됩니다. 이 매개 변수가 필요한지 여부는 특정 I/O 제어 코드에 따라 달라집니다.

  • Irp->UserBuffer 는 대상 볼륨에 대한 파일 시스템 또는 파일 시스템 필터 드라이버에 전달될 호출자 제공 출력 버퍼를 가리킵니다. METHOD_BUFFERED 또는 METHOD_NEITHER I/O에 사용됩니다. 이 매개 변수가 선택 사항인지 필수인지 여부는 특정 I/O 제어 코드에 따라 달라집니다.

  • IrpSp->FileObjectDeviceObject와 연결된 파일 개체를 가리킵니다.

    IrpSp-FileObject> 매개 변수에는 relatedFileObject 필드에 대한 포인터가 포함되어 있으며 이는 FILE_OBJECT 구조체이기도 합니다. FILE_OBJECT 구조체의 RelatedFileObject 필드는 IRP_MJ_FILE_SYSTEM_CONTROL 처리하는 동안 유효하지 않으므로 사용하면 안 됩니다.

  • IrpSp->플래그 는 IRP_MN_VERIFY_VOLUME SL_ALLOW_RAW_MOUNT 설정할 수 있습니다.

  • IrpSp->MajorFunction 은 IRP_MJ_FILE_SYSTEM_CONTROL 설정됩니다.

  • IrpSp->MinorFunction은 다음 값 중 하나로 설정할 수 있습니다.

    • IRP_MN_KERNEL_CALL
    • IRP_MN_LOAD_FILE_SYSTEM
    • IRP_MN_MOUNT_VOLUME
    • IRP_MN_USER_FS_REQUEST
    • IRP_MN_VERIFY_VOLUME
  • IrpSp->Parameters.FileSystemControl.FsControlCode 는 대상 볼륨에 대한 파일 시스템 또는 파일 시스템 필터 드라이버에 전달할 FSCTL 함수 코드입니다. IRP_MN_USER_FS_REQUEST만 사용합니다.

    IOCTL 및 FSCTL 요청에 대한 자세한 내용은 Windows SDK 설명서에서 I/O 제어 코드 사용 및 "디바이스 입력 및 출력 제어 코드"를 참조하세요.

  • IrpSp->Parameters.FileSystemControl.InputBufferLengthIrp-AssociatedIrp.SystemBuffer>가 가리키는 버퍼의 크기(바이트)입니다.

  • IrpSp->Parameters.FileSystemControl.OutputBufferLength 는 Irp-UserBuffer가 가리키는 버퍼의 크기(바이트 )>입니다.

  • IrpSp->Parameters.FileSystemControl.Type3InputBuffer 는 METHOD_NEITHER 사용하는 커널 모드 요청에 대한 입력 버퍼입니다.

  • IrpSp->Parameters.MountVolume.DeviceObject 는 볼륨을 탑재할 실제 디바이스의 디바이스 개체를 가리킵니다. 파일 시스템 필터 드라이버는 이 매개 변수를 사용하면 안 됩니다.

  • IrpSp->Parameters.MountVolume.Vpb 는 탑재할 볼륨의 VPB(볼륨 매개 변수 블록)를 가리킵니다. 이동식 미디어를 지원하는 파일 시스템은 이전에 사용한 VPB를 이 매개 변수에 전달된 VPB로 대체할 수 있습니다. 이러한 파일 시스템에서 볼륨이 탑재된 후 이 포인터는 더 이상 유효한 것으로 간주될 수 없습니다. 이러한 파일 시스템을 필터링하는 파일 시스템 필터 드라이버는 다음과 같이 이 매개 변수를 사용해야 합니다. 필터는 IRP를 하위 수준 드라이버로 보내기 전에 IrpSp-Parameters.MountVolume.Vpb-RealDevice>> 값을 저장해야 합니다. 볼륨이 성공적으로 탑재된 후 필터는 스토리지 디바이스 개체에 대한 이 포인터를 사용하여 올바른 VPB 포인터를 가져올 수 있습니다.

  • IrpSp->Parameters.VerifyVolume.DeviceObject 는 확인할 볼륨의 디바이스 개체를 가리킵니다.

  • IrpSp->Parameters.VerifyVolume.Vpb 는 확인할 볼륨의 VPB를 가리킵니다.

추가 정보

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoBuildSynchronousFsdRequest

IoGetCurrentIrpStackLocation

IRP

ZwDeviceIoControlFile