WDM 필터드라이버를 로드할 때 SetupDiCallClassInstaller 함수를 많이 사용합니다.

이 함수는 장치 트리를 재구성 할 때 사용하는데, 필터 드라이버는 특정 디바이스에 필터값을 설정하고 장치 트리를 재구성하면서 드라이버를 로드하는 것입니다.

여기서 SetupDiCallClassInstaller 함수가 동작하지 않을 때가 있습니다. 함수가 리턴하는 값이 TRUE 이면서 별다른 이상이 없는데도, 드라이버는 로드가 되지 않는 현상이 발생합니다.

문제는 WM_DEVICECHANGE 메시지입니다.

SetupDiCallClassInstaller 함수를 호출하면 WM_DEVICECHANGE (wParam : DBT_DEVNODES_CHANGED 0x0007) 메시지가 발생하는데 특정 프로그램이 중간에서 이 메시지를 없애버리면 드라이버가 로드 되지 않습니다.

예를 들자면 CBT 훅과 같이 전역 훅을 설치해두고 WM_DEVICECHANGE 메시지를 받은 뒤 정상적으로 전달해주지 않고 없애버리는 프로그램들입니다.

SetupDiCallClassInstaller 함수로 필터 드라이버가 로드 되지 않을 때에는 Spy++로 WM_DEVICECHANGE 메시지가 전달되는지 확인해보는 것이 좋습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

01 April 2009