본문 바로가기

윈도우 드라이버13

PS/2 Mouse Filter 드라이버 WPF 책을 독파하고 난 후, DDK에 있는 Mouse Filter 드라이버 코드를 분석하기 시작했다.일단은 Mouse Filter 드라이버가 삽입되어야 할 위치를 알아야 하고, 어떤 IRP를 가로채야 하는지 등에 대해 알아야 하기 때문에 PS/2 마우스 드라이버의 스택 구조를 알 필요가 있었다. Mouclass Filter (FIDO Driver - Class upper Filter Driver) I8042prt Driver (FDO Driver) ACPI Bus Driver (PDO Driver) PS/2 마우스 드라이버의 스택 구조는 위의 그림과 같이 하위의 ACPI Bus Driver(PDO), 기능 드라이버 역할의 I8042prt Driver(FDO), 그리고 맨 상위에 Mouclass Filt.. 2013. 1. 4.
디바이스 오브젝트란? OS는 디바이스 오브젝트에 의해서 디바이스들을 나타낸다. 하나 또는 그 이상의 디바이스 오브젝트들은 각각의 디바이스와 관련되어 있다. 디바이스 오브젝트는 디바이스 상의 모든 동작의 타겟 역할을 한다. 커널 모드 드라이버들은 다음의 경우를 제외하고 각각의 디바이스를 위해 반드시 적어도 하나 이상의 디바이스 오브젝트를 생성해야 한다. - 클래스 혹은 포트 드라이버와 연관되어 있는 미니드라이버들은 그들 자신의 디바이스 오브젝트들을 생성하지 않는다. 클래스 혹은 포트 드라이버는 디바이스 오브젝트를 생성하고, 미니드라이버에게 동작을 디스패치 한다. - NDIS 미니포트 드라이버와 같이 드라이버 타입이 명시된 하부시스템의 일부로 동작하는 드라이버들은 하부시스템에 의해 그들 디바이스 오브젝트가 생성된다. 만약 드라이.. 2013. 1. 4.
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 .. 2013. 1. 4.
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. 1. 4.
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. 1. 4.
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. 1. 4.
IRQL에 따른 스레드 선점 주의사항 윈도우즈 커널이나 드라이버에 대한 설명을 나온 책을 보면 항상 IRQL 에 따른 스레드 선점에 대한 얘기가 나오는데 다음과 같은 내용은 오해를 불러일으킬 소지가 있다. "낮은 수준의 IRQL에서 실행하는 코드(스레드)는 높은 수준의 IRQL의 작업이 발생하게 되면 항상 선점된다." "상승 된 IRQL에 코드는 상승 된 IRQL보다 낮은 레벨에 코드가 실행되는 것을 블록시킨다." 그러나 위에 사항들은 예외적일 수 있다. 예를 들어, 스레드 A가 APC_LEVEL로 실행중이고, 스레드 B는 이전에 PASSIVE_LEVEL에서 실행중이었다라고 가정하면 스레드 A가 APC_LEVEL로 실행중이기 때문에 스레드 B보다 IRQL이 높으므로 스레드A가 PASSIVE_LEVEL로 IRQL이 내려가지 않는 이상은 스레드.. 2013. 1. 4.
Object Context란? 오브젝트 context는 드라이버가 오브젝트를 할당하고 배정할 수 있는 extra, nonpageable, memory 공간이다. 각각의 프레임워크 기반의 드라이버는 하나 또는 그 이상의 오브젝트 Context를 생성할 수 있다. 프레임워크 기반의 드라이버는 오브젝트 context 내에 오브젝트와 관련된 모든 데이터를 저장해야 한다. 예를 들어, USB 디바이스 드라이버는 자신의 프레임워크 디바이스 오브젝트를 위한 context를 생성한다. 드라이버는 디바이스의 USB_DEVICE_DESCRIPTOR, USB_CONFIGURATION_DESCRIPTOR 구조체 등과 같은 디바이스 정보들을 context 내에 저장한다.프레임워크는 하나의 드라이버에서 또 다른 드라이버로 프레임워크 오브젝트를 전달하지 않기 .. 2013. 1. 4.
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. 1. 4.