Programming(174)
-
[WDF] 디바이스 오브젝트란?
OS는 디바이스 오브젝트에 의해서 디바이스들을 나타낸다. 하나 또는 그 이상의 디바이스 오브젝트들은 각각의 디바이스와 관련되어 있다. 디바이스 오브젝트는 디바이스 상의 모든 동작의 타겟 역할을 한다. 커널 모드 드라이버들은 다음의 경우를 제외하고 각각의 디바이스를 위해 반드시 적어도 하나 이상의 디바이스 오브젝트를 생성해야 한다. - 클래스 혹은 포트 드라이버와 연관되어 있는 미니드라이버들은 그들 자신의 디바이스 오브젝트들을 생성하지 않는다. 클래스 혹은 포트 드라이버는 디바이스 오브젝트를 생성하고, 미니드라이버에게 동작을 디스패치 한다. - NDIS 미니포트 드라이버와 같이 드라이버 타입이 명시된 하부시스템의 일부로 동작하는 드라이버들은 하부시스템에 의해 그들 디바이스 오브젝..
2013.01.04 -
[WDF] Io Request 처리하기
드라이버가 I/O reqeust를 수신하였을 때, 다음과 같은 동작을 한다.1. request를 다른 queue로 Requeue 한다.2. request를 완료한다.3. request를 취소한다.4. I/O target 드라이버로 request를 전송한다.드라이버는 request를 무시하거나 삭제할 수 없다. Requeuing I/O Requests 드라이버는 I/O queue로부터 수신한 I/O requests를 requeue 할 수 있다. 또한 버스 드라이버는 자식 디바이스의 I/O queue로부터 부모 디바이스의 I/O queue로 I.O request를 requeue할 수 있다. I/O Request를 다른 I/O Queue에 Requeuing 하기- 드라이버의 request 핸들러가 I/O qu..
2013.01.04 -
[WDF] 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 함수를 호..
2013.01.04 -
[WDF] 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 -
[WDF] 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 함수는 각각의 수..
2013.01.04 -
[WDF] IRQL에 따른 스레드 선점 주의사항
윈도우즈 커널이나 드라이버에 대한 설명을 나온 책을 보면 항상 IRQL 에 따른 스레드 선점에 대한 얘기가 나오는데 다음과 같은 내용은 오해를 불러일으킬 소지가 있다."낮은 수준의 IRQL에서 실행하는 코드(스레드)는 높은 수준의 IRQL의 작업이 발생하게 되면 항상 선점된다.""상승 된 IRQL에 코드는 상승 된 IRQL보다 낮은 레벨에 코드가 실행되는 것을 블록시킨다."그러나 위에 사항들은 예외적일 수 있다.예를 들어, 스레드 A가 APC_LEVEL로 실행중이고, 스레드 B는 이전에 PASSIVE_LEVEL에서 실행중이었다라고 가정하면 스레드 A가 APC_LEVEL로 실행중이기 때문에 스레드 B보다 IRQL이 높으므로 스레드A가 PASSIVE_LEVEL로 IRQL이 내려가지 않는 이상은 스레드 B에 ..
2013.01.04