다음을 통해 공유


Direct I/O를 사용하는 DispatchReadWrite

직접 I/O를 위해 디바이스 개체를 설정하는 하위 수준 디바이스 드라이버는 Irp-MdlAddress>의 MDL에서 설명하는 디바이스에서 시스템 물리적 메모리로 전송된 데이터를 반환하여 읽기 요청을 충족합니다. 시스템 물리적 메모리에서 디바이스로 데이터를 전송하여 쓰기 요청을 충족합니다.

하위 수준 드라이버는 읽기/쓰기 요청을 비동기적으로 처리해야 합니다. 따라서 드라이버 스택 아래로 IRP 전달에 설명된 대로 모든 하위 수준 드라이버의 DispatchReadWrite 루틴은 유효한 매개 변수가 있는 IRP_MJ_READ 전달하고 다른 드라이버 루틴에 유효한 매개 변수가 있는 IRP_MJ_WRITE IRP를 전달해야 합니다.

하위 수준 드라이버로 전송된 읽기/쓰기 IRP의 경우 Irp-MdlAddress>의 MDL에서 설명한 페이징된 실제 메모리는 이미 요청된 전송을 수행하기 위한 올바른 액세스 권한을 검색했으며 체인의 최고 수준 드라이버 또는 I/O 관리자에 의해 이미 잠겨 있습니다. 직접 I/O를 위해 디바이스 개체를 설정하는 중간 또는 최저 수준 드라이버는 이미 완료되었으므로 MmProbeAndLockPages 를 호출하면 안 됩니다. 최저 수준 드라이버는 MmGetSystemAddressForMdlSafe를 호출합니다. (Windows 98용 드라이버는 MmGetSystemAddressForMdl 을 대신 호출합니다. Windows Me, Windows 2000 이상 버전의 Windows용 드라이버는 MmGetSystemAddressForMdlSafe를 사용해야 합니다.)

중간 또는 최저 수준 디바이스 드라이버의 DispatchReadWrite 루틴은 유효한 매개 변수가 있는 IRP만 전달하도록 상위 수준 드라이버를 신뢰할 수 없는 경우 읽기/쓰기 IRP의 I/O 스택 위치에 있는 매개 변수의 유효성을 검사해야 합니다. DispatchReadWrite 루틴에서 매개 변수 오류를 발견하면 IRP 완료에 이미 설명된 대로 적절한 오류 STATUS_XXX 값으로 IRP 완료해야 합니다. 매개 변수가 유효한 경우 중간 드라이버의 DispatchReadWrite 루틴은 Higher-Level 드라이버의 DispatchReadWrite 지침에 따라 추가 처리를 위해 요청을 전달해야 합니다.

최저 수준 디바이스 드라이버의 DispatchReadWrite 루틴은 전송 요청으로 IoMarkIrpPending을 호출하고, 다른 드라이버 루틴에서 추가 처리를 위해 IRP를 전달하고, 드라이버 스택 아래로 IRP 전달에 설명된 대로 STATUS_PENDING 반환해야 합니다.

디바이스 드라이버의 DispatchReadWrite 루틴은 드라이버 결정 값으로 IoStartPacket을 호출하여 I/O 처리량을 단축하기 위해 IRP가 디바이스에 큐에 대기되는 순서를 제어할 수 있습니다. 드라이버의 또 다른 루틴은 나중에 IRP를 큐에서 제거하고 요청된 길이를 부분 전송 작업으로 분할해야 하는지 여부를 결정하고 디바이스에서 데이터를 전송하도록 프로그래밍합니다.

일반적으로 디바이스의 제한 사항에 맞게 대용량 전송 요청을 분할해야 하는 디바이스 드라이버는 지정된 전송 요청에 대한 디바이스를 설정하기 직전까지 이러한 작업을 연기해야 합니다. 이러한 디바이스 드라이버의 DispatchReadWrite 루틴은 디바이스별 전송 제약 조건에 대해 들어오는 IRP의 I/O 스택 위치를 검사 않으며, 드라이버가 StartIo(또는 다른 드라이버 루틴)가 전송 작업을 위해 디바이스를 프로그래밍하기 직전까지 이러한 검사를 연기할 수 있는 경우 부분 전송 범위를 계산하려고 시도해서는 안 됩니다.