본문 바로가기
Programming/윈도우 드라이버

Io Queue 생성하기

by 유주원 2013. 1. 4.

대부분의 드라이버들은 EvtDriverDeviceAdd callback 함수에서 I/O queue를 생성한다.

I/O queue를 생성하기 위해서 드라이버는 Framework queue 오브젝트를 생성하는 WdfIoQueueCreate를 호출해야 한다.

드라이버에서는 WDF_IO_QUEUE_CONFIG 구조체를 함수에게 제공하며, 이 구조체 내에는 queue에 관한 구성 정보가 포함되어 있다. 예를 들면, queue의 dispatching 방법이든지, queue 내에 있는 request가 이용가능하게 되었을 때, 프레임워크가 호출할 수 있는 request의 포인터 등이다. 구조체는 또한 queue가 power-managed인지 아닌지, 드라이버가 request의 zero-length 버퍼를 지원 하는지 안하는지에 대한 정보를 표시하고 있다.

 

만약 드라이버가 WDF_IO_QUEUE_CONFIG 구조체의 DefaultQueue를 TRUE로 설정하면 queue는 디바이스의 디폴트 I/O queue가 된다. 만약 드라이버가 디폴트 I/O queue를 생성한다면, 다른 queue를 생성하기 전까지 모든 I/O request는 이 queue에 위치하게 된다. 드라이버는 WdfDeviceGetDefaultQueue 함수를 호출함으로써 default I/O queue의 핸들을 얻을 수 있다.

 

만약 하나 이상의 I/O queue를 원한다면, 드라이버는 WdfIoQueueCreate를 호출함으로써 queue를 생성할 수 있다.

만약 드라이버가 멀티 queue를 생성한다면, WdfDeviceConfigureRequestDispatching을 호출할 수 있다.

WdfDeviceConfigureRequestDespatching 함수는 다른 타입의 request를 특정 queue에 전달할 수 있는 함수이다. 예를 들어 모든 read request는 하나의 queue에 저장되고 모든 write request는 또 다른 queue에 저장될 수 있다.

 

만약 드라이버가 I/O queue를 생성하고 WdfDeviceConfigureRequestDispatching을 호출하여 특정 request를 받을 수 있는 queue를 명시했다면 드라이버는 디폴트 queue가 필요하지 않다.

 

만약 드라이버가 특정 타입의 request를 위한 queue가 생성되어 있지 않고 드라이버가 function 드라이버라면, 프레임워크는 STATUS_INVALID_DEVICE_REQUEST라는 완료 상태와 함께 request를 완료할 것이다. 만약 드라이버가 필터 드라이버이고 WdfFdoInitSetFilter를 호출하였다면, 프레임워크는 자동적으로 request를 다음 드라이버 스택에 있는 하위 드라이버에게 전달 할 것이다. 예를 들어 read request를 처리하지 않는 필터 드라이버는 read request를 수신한 queue를 가지고 있지 않아도 된다.