데이터 버퍼에 액세스하는 방법

드라이버 스택의 주요 책임 중 하나는 사용자 모드 애플리케이션과 시스템 디바이스 간에 데이터를 전송하는 것입니다. 운영 체제는 데이터 버퍼에 액세스하기 위한 다음 세 가지 방법을 제공합니다.

버퍼링된 I/O
운영 체제는 애플리케이션의 버퍼와 크기가 같은 비페이지 시스템 버퍼를 만듭니다. 쓰기 작업의 경우 I/O 관리자는 드라이버 스택을 호출하기 전에 사용자 데이터를 시스템 버퍼에 복사합니다. 읽기 작업의 경우 I/O 관리자는 드라이버 스택이 요청된 작업을 완료한 후 시스템 버퍼의 데이터를 애플리케이션의 버퍼에 복사합니다.

자세한 내용은 버퍼링된 I/O 사용을 참조하세요.

직접 I/O
운영 체제는 애플리케이션의 버퍼를 메모리에 잠습니다. 그런 다음 잠긴 메모리 페이지를 식별하는 MDL(메모리 설명자 목록)을 만들고 MDL을 드라이버 스택에 전달합니다. 드라이버는 MDL을 통해 잠긴 페이지에 액세스합니다.

자세한 내용은 직접 I/O 사용을 참조하세요.

버퍼링되지 않거나 직접 I/O
운영 체제는 애플리케이션 버퍼의 가상 시작 주소 및 크기를 드라이버 스택에 전달합니다. 버퍼는 애플리케이션의 스레드 컨텍스트에서 실행되는 드라이버에서만 액세스할 수 있습니다.

자세한 내용은 버퍼링되지 않거나 직접 I/O 사용을 참조하세요.

IRP_MJ_READIRP_MJ_WRITE 요청의 경우 드라이버는 각 DEVICE_OBJECT 구조에서 플래그를 사용하여 I/O 메서드를 지정합니다. 자세한 내용은 디바이스 개체 초기화를 참조하세요.

IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 요청의 경우 I/O 메서드는 각 IOCTL 값에 포함된 TransferType 값에 의해 결정됩니다. 자세한 내용은 I/O 제어 코드 정의를 참조하세요.

드라이버 스택의 모든 드라이버는 최상위 드라이버(하위 드라이버에서 사용하는 메서드에 관계없이 "둘 다" 메서드를 사용할 수 있음)를 제외하고 각 요청에 대해 동일한 버퍼 액세스 메서드를 사용해야 합니다.