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

PS/2 Mouse Filter 드라이버

by 유주원 2013. 1. 4.

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 Filter Driver(FiDO)로 구성되어 있었다.

 

내가 Filter 드라이버를 넣을 수 있는 위치는


1. Mouclass Filter 윗 부분에 Class upper Filter로써 등록하는 방법

2. Mouclass Filter와 I8042prt Driver 사이의 Class upper Filter 혹은 Device upper Filter로써 등록하는
    방법

3. I8042prt Driver와 ACPI Bus Driver 사이의 Class lower Filter 혹은 Device lower Filter로써 등록하는
    방법

 

이 있었다.

 

DDK에 나와 있는 소스는 2번의 경우로 I8042prt Driver와 Mouclass Filter 사이에 위치하는 Filter 드라이버 소스이므로 나 역시 2번을 방향으로 하여 분석을 하였다.

 

간략적인 흐름을 보면 처음 MouClass Driver는 Mouse Driver가 Registry\Machine\Hardware\Devicemap\PointerPort에 등록이 되어 있다면, 부팅 시에 IOCTL_INTERNAL_MOUSE_CONNECT를 날려준다.

 

이 IOCTL을 날려줄 때 Class Driver는 데이터를 수신할 Callback 주소를 함께 보내는데 이때 중간에서 그 Callback 주소를 가로채서 따로 저장을 한 후, 내가 만든 필터 드라이버에서 수신할 Callback 주소를 I8042prt로 전송한다.

 

I8042prt에서는 데이터의 입력이 있을 경우, Callback 주소를 통하여 데이터를 전송하게 되는데 이 때 내가 만든 필터 드라이버로 입력이 들어오게 되고, 들어온 입력 데이터를 조작한 후, 원래의 Callback 주소로 전송하게 되면 중간 필터의 역할을 마치게 된다.