다음을 통해 공유


IRP_MJ_READ

디바이스에서 시스템으로 데이터를 전송하는 모든 디바이스 드라이버는 이러한 디바이스 드라이버 위에 계층화된 상위 수준 드라이버와 마찬가지로 DispatchRead 또는 DispatchReadWrite 루틴에서 읽기 요청을 처리해야 합니다.

보낸 경우

만들기 요청이 성공적으로 완료된 후 언제든지

대상 디바이스 개체를 나타내는 파일 개체에 대한 핸들이 있는 사용자 모드 애플리케이션 또는 Win32 구성 요소가 디바이스에서 데이터 전송을 요청했습니다. 상위 수준 드라이버가 읽기 IRP를 만들고 설정한 것일 수 있습니다.

입력 매개 변수

IRP에서 드라이버의 I/O 스택 위치는 Parameters.Read.Length에서 전송할 바이트 수를 나타냅니다.

일부 드라이버는 Parameters.Read.Key 의 값을 사용하여 들어오는 읽기 요청을 디바이스 큐 또는 드라이버 관리형 IRP 내부 큐의 드라이버 결정 순서로 정렬합니다.

특정 유형의 드라이버도 Parameters.Read.ByteOffset의 값을 사용합니다. 이 값은 전송 작업의 시작 오프셋을 나타냅니다. 예를 들어 IFS(설치 가능한 파일 시스템) 설명서의 IRP_MJ_READ 항목을 참조하세요.

출력 매개 변수

기본 디바이스 드라이버가 대상 디바이스 개체의 Flags 를 DO_BUFFERED_IO 설정했는지 또는 DO_DIRECT_IO 설정했는지에 따라 데이터는 다음 중 하나로 전송됩니다.

  • 드라이버가 버퍼링된 I/O를 사용하는 경우 Irp-AssociatedIrp.SystemBuffer>의 버퍼입니다.

  • 기본 디바이스 드라이버가 직접 I/O(DMA 또는 PIO)를 사용하는 경우 Irp-MdlAddress>의 MDL에서 설명하는 버퍼입니다.

작업

읽기 요청을 받으면 상위 수준 드라이버는 다음 하위 드라이버에 대해 IRP에서 I/O 스택 위치를 설정하거나 하나 이상의 낮은 드라이버에 대해 추가 IRP를 만들고 설정합니다. IoCompletionRoutine을 호출하여 입력 IRP에 대해 선택 사항이지만 드라이버에서 만든 IRP에 필요한 IoCompletion 루틴을 설정할 수 있습니다. 그런 다음, 드라이버는 IoCallDriver를 사용하여 다음 하위 드라이버에 요청을 전달합니다.

읽기 요청을 받으면 디바이스 드라이버가 디바이스에서 시스템 메모리로 데이터를 전송합니다. 디바이스 드라이버는 I/O 상태 블록의 정보 필드를 IRP를 완료할 때 전송되는 바이트 수로 설정합니다.

요구 사항

헤더

Wdm.h(Wdm.h, Ntddk.h 또는 Ntifs.h 포함)

추가 정보

DispatchRead

DispatchReadWrite

IoCallDriver

IoSetCompletionRoutine