Programming(178)
-
Request 처리하기
만약 드라이버가 I/O queue에 대한 순차적 dispatching 혹은 병렬 dispatching을 명시했다면 프레임워크는 queue에 있는 request가 드라이버로 전달될 준비가 되었을 때마다 드라이버가 제공하는 callback 함수를 호출한다.드라이버는 하나 또는 그 이상의 request를 수신하는 callback 함수를 제공할 수 있다. - EvtIoRead 프레임워크는 queue에 있는 read request가 이용가능할 때 I/O queue의 EvtIoRead callback 함수를 호출한다. - EvtIoWrite 프레임워크는 queue에 있는 write request가 이용가능할 때 I/O queue의 EvtIoWrite callback 함수를 호출한다. - EvtIoDeviceCont..
2013.01.04 -
Io Queue 생성하기
대부분의 드라이버들은 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 버퍼를 지원 하는지 안하..
2013.01.04 -
Io Callback Function
EvtIoInternalDeviceControl - 내부 디바이스 I/O control code에 포함되어 있는 I/O request를 처리하는 함수. - 이 함수를 사용할 때는 반드시 EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL 타입을 사용함으로써 함수를 선언해야 한다. - 드라이버는 WdfIoQueueCreate 가 호출될 때 EvtIoDeviceControl callback 함수를 등록한다. 만약 드라이버가 EvtIoDeviceControl callback 함수를 등록하였다면, callback 함수는 모든 I/O control request(IRP_MJ_DEVICE_CONTROL)를 수신할 것이다. - EvtIoDeviceControl callback 함수는 각각의 수신된 I/O ..
2013.01.04 -
IRQL에 따른 스레드 선점 주의사항
윈도우즈 커널이나 드라이버에 대한 설명을 나온 책을 보면 항상 IRQL 에 따른 스레드 선점에 대한 얘기가 나오는데 다음과 같은 내용은 오해를 불러일으킬 소지가 있다. "낮은 수준의 IRQL에서 실행하는 코드(스레드)는 높은 수준의 IRQL의 작업이 발생하게 되면 항상 선점된다." "상승 된 IRQL에 코드는 상승 된 IRQL보다 낮은 레벨에 코드가 실행되는 것을 블록시킨다." 그러나 위에 사항들은 예외적일 수 있다. 예를 들어, 스레드 A가 APC_LEVEL로 실행중이고, 스레드 B는 이전에 PASSIVE_LEVEL에서 실행중이었다라고 가정하면 스레드 A가 APC_LEVEL로 실행중이기 때문에 스레드 B보다 IRQL이 높으므로 스레드A가 PASSIVE_LEVEL로 IRQL이 내려가지 않는 이상은 스레드..
2013.01.04 -
Object Context란?
오브젝트 context는 드라이버가 오브젝트를 할당하고 배정할 수 있는 extra, nonpageable, memory 공간이다. 각각의 프레임워크 기반의 드라이버는 하나 또는 그 이상의 오브젝트 Context를 생성할 수 있다. 프레임워크 기반의 드라이버는 오브젝트 context 내에 오브젝트와 관련된 모든 데이터를 저장해야 한다. 예를 들어, USB 디바이스 드라이버는 자신의 프레임워크 디바이스 오브젝트를 위한 context를 생성한다. 드라이버는 디바이스의 USB_DEVICE_DESCRIPTOR, USB_CONFIGURATION_DESCRIPTOR 구조체 등과 같은 디바이스 정보들을 context 내에 저장한다.프레임워크는 하나의 드라이버에서 또 다른 드라이버로 프레임워크 오브젝트를 전달하지 않기 ..
2013.01.04 -
Macro
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE - WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE 매크로는 드라이버의 Wdf Object attributes 구조체를 초기화 하고 구조체 속으로 드라이버의 context 정보를 기입한다. WDF_DECLARE_CONTEXT_TYPE_WITH_NAME - WDF_DECLARE_CONTEXT_TYPE_WITH_NAME 매크로는 드라이버의 오브젝트 context를 위한 특정 이름과 함께 접근자(accessor)를 생성한다. WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE - 드라이버의 WDF_IO_QUEUE_CONFIG 구조체를 초기화한다.- 드라이버는 디바이스의 디폴트 큐로써 power-ma..
2013.01.04