레퍼런스 카운트와 USB 플러그 앤 플레이

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

윈도우(XP 이상)에서 USB 키보드(USB Composite 장치)를 꽂으면 기본적으로 usbccgp.sys가 로드 됩니다. 마찬가지로 USB 메모리를 꽂으면 usbstor.sys가 로드 됩니다. 각 USB 장치를 빼면 해당 드라이버는 언로드 됩니다(단 같은 종류의 USB 장치가 여러개 꽂혀 있을 때 모든 장치가 빠져야 해당 드라이버가 언로드 됩니다).

여기서 중요한 것은 ObReferenceObjectByName과 같은 함수를 이용하여 \\Driver\usbccgp나 \\Driver\usbstor를 참조 했을 때 입니다. usbccgp.sys나 usbstor.sys와 같이 장치의 장착 여부에 따라 로드, 언로드 되는 드라이버는 ObReferenceObjectByName로 드라이버 오브젝트를 참조 한 뒤 반드시 ObDereferenceObject 함수로 레퍼런스 카운트를 감소시켜 주어야 합니다.

ObDereferenceObject 함수로 레퍼런스 카운트를 감소시켜 주지 않은 상태에서 USB 키보드나 USB 메모리를 제거하면 usbccgp.sys 또는 usbstor.sys 드라이버 자체는 언로드 되지만 드라이버 오브젝트는 계속 남아 있게 됩니다. 이 상태에서 USB 키보드나 USB 메모리를 다시 꽂게 되면 usbccgp.sys 또는 usbstor.sys 드라이버가 로드 되지만 해제 되지 않은 이전 드라이버 오브젝트 때문에 새로운 드라이버 오브젝트를 생성하는데 실패하게 됩니다.

드라이버 오브젝트 생성에 실패하면 usbccgp.sys 또는 usbstor.sys 드라이버는 정상 작동 하지 않기 때문에 USB 키보드 또는 USB 메모리가 인식되지 않게 되는 것입니다.

PNP 처리와는 무관하게 ObReferenceObjectByName 함수를 사용하고 ObDereferenceObject 함수로 레퍼런스 카운트를 감소시켜 주지 않는 것에 따라서 플러그 앤 플레이가 되지 않을 수 있으니 주의해야 합니다.

참고: USB Composite 장치 다중 USB 인터페이스(multiple USB interface)를 지원하는 USB 장치를 Composite 장치라고 합니다(보통 두개 이상의 Device Object를 생성합니다). 이 Composite 장치를 꽂으면 usbccgp.sys가 로드 됩니다. 하지만 Composite 장치가 아니라면 usbccgp.sys는 로드 되지 않습니다.


저작권 안내

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

Published

2008-05-06