IRP_MJ_READ(FS 및 필터 드라이버)

보낸 경우

I/O 관리자 또는 파일 시스템 드라이버는 IRP_MJ_READ 요청을 보냅니다. 예를 들어 사용자 모드 애플리케이션이 ReadFile과 같은 Win32 함수를 호출했거나 커널 모드 구성 요소가 ZwReadFile을 호출한 경우 이 요청을 보낼 수 있습니다.

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

파일 시스템 드라이버는 파일 개체를 추출하고 디코딩하여 매개 변수 및 부 함수 코드를 결정해야 합니다.

MDL(메모리 설명자 목록) 읽기 요청의 경우 파일 시스템은 부 함수 코드를 검사 요청된 작업을 결정해야 합니다. 다음은 캐시된 파일 I/O에만 사용할 수 있는 유효한 부 함수 코드입니다.

  • IRP_MN_COMPLETE
  • IRP_MN_COMPLETE_MDL
  • IRP_MN_COMPLETE_MDL_DPC
  • IRP_MN_COMPRESSED
  • IRP_MN_DPC
  • IRP_MN_MDL
  • IRP_MN_MDL_DPC
  • IRP_MN_NORMAL

이 IRP 처리에 대한 자세한 내용은 WDK(Windows 드라이버 키트)에 포함된 CDFS 및 FASTFAT 샘플을 참조하세요.

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

필터 드라이버는 필요한 모든 처리를 수행해야 하며 필터의 특성에 따라 다음 작업 중 하나를 수행해야 합니다.

  • IRP 완료 또는 실패 또는
  • IRP를 스택의 다음 하위 드라이버로 전달합니다.

매개 변수

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

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

  • Irp->DO_BUFFERED_IO 플래그가 DeviceObject-Flags>에 설정된 경우 AssociatedIrp.SystemBuffer는 중간 시스템 버퍼로 사용할 시스템 제공 버퍼를 가리킵니다. 그렇지 않으면 이 멤버가 NULL로 설정됩니다.

  • Irp->IoStatus는 최종 완료 상태 수신하는 IO_STATUS_BLOCK 구조와 요청된 작업에 대한 정보를 가리킵니다. 자세한 내용은 ZwReadFile에 대한 IoStatusBlock 매개 변수에 대한 설명을 참조하세요.

  • Irp->MdlAddress 는 읽을 데이터가 포함된 페이지를 설명하는 MDL(메모리 설명자 목록)의 주소입니다.

  • *Irp->UserBuffer는 파일에서 읽은 데이터를 수신하는 호출자 제공 출력 버퍼를 가리킵니다.

  • IrpSp->FileObjectDeviceObject와 연결된 파일 개체를 가리킵니다. FO_SYNCHRONOUS_IO 플래그가 IrpSp-FileObject-Flags>>에 설정된 경우 동기 I/O를 위해 파일 개체가 열렸습니다.

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

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

  • IrpSp->MinorFunction 은 요청되는 작업을 지정하고 다음 값 중 하나를 포함합니다.

  • IRP_MN_COMPLETE

  • IRP_MN_COMPLETE_MDL

  • IRP_MN_COMPLETE_MDL_DPC

  • IRP_MN_COMPRESSED

  • IRP_MN_DPC

  • IRP_MN_MDL

  • IRP_MN_MDL_DPC

  • IRP_MN_NORMAL

  • IrpSp->Parameters.Read.ByteOffset 은 읽을 데이터의 파일 내에서 시작 바이트 오프셋을 지정하는 LARGE_INTEGER 변수입니다.

  • IrpSp->Parameters.Read.Key는 대상 파일의 바이트 범위 잠금과 연결된 키 값입니다.

  • IrpSp->Parameters.Read.Length 는 읽을 데이터의 길이(바이트)입니다. 읽기 작업이 성공하면 Irp-IoStatus>가 가리키는 IO_STATUS_BLOCK 구조체의 정보 멤버에서 읽은 바이트 수가 반환됩니다.

설명

파일 시스템은 파일 끝에서 기본 파일 스토리지 디바이스의 섹터 크기의 배수까지 쓰기 및 읽기 작업을 반올림합니다. 필터가 사전 읽기 또는 사전 쓰기 작업을 처리하는 경우 버퍼를 할당하고 교환하는 필터는 할당된 버퍼의 크기를 연결된 디바이스의 섹터 크기의 배수로 반올림해야 합니다. 그렇지 않은 경우 기본 파일 시스템에서 전송되는 데이터의 길이가 버퍼의 할당된 길이를 초과합니다. 버퍼 교환에 대한 자세한 내용은 swapBuffers Minifilter 샘플을 참조하세요.

추가 정보

CcMdlRead

CcMdlReadComplete

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ(WDK 커널 참조)

IRP_MJ_WRITE

ZwReadFile