C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[66123] Re:filter driver질문이 있어요~
빌더 [] 1326 읽음    2012-02-01 14:37
gambler 님이 쓰신 글 :
: 간단한 필터드라이버를 만들었는데 처음 USB 기기를 연결했을때는 DriverEntry가 호출되고
:
: 바로 AddDevice를 호출해서 장치를 attach 시키는데 한번 attach한 USB를 뺏다가 다시 연결하면
:
: 그다음에는 DriverEntry가 호출이 않되네요. 혹시 DriverEntry 말고 등록된 장치가 연결됬을때 필터드라이버에서
:
: 알수 있는 방법이 있나요?



필터 드라이버에서 디바이스 오브젝트는 DriverEntry 루틴에서 생성할 수도 있고(Legacy 타입일 경우)
WDM 타입의 구조인 경우엔 Plug & Play Manager에 의해서 AddDevice 통해서 생성하게 됩니다.
Unload도 마찬가지로 장치가 제거될 때  PnP Mgr 에 의해서 일어나게 되고요. 그러나 필터 드라이버를
Legacy 타입 구조로 만들었다면 수동으로 Unload 작업을 해줘야 합니다.

필터 드라이버를 구성하는 방식은 몇가지가 가능한데...

INF 파일에 필터 관련 섹션을 추가해서 처리하는 방법, 드라이버 셋업 API를 이용해서 프로그래밍 적으로
Low Filter 또는 Upper Filter 레지스트리를 생성해서 처리하는 방법, 하드웨어 제조 업체에서 필터 드라이버
를 제공한다면 해당 Functional 디바이스의 INF 파일에 필터 관련 섹션을 추가해서 펑셔널 드라이버가 로드될
때 필터 드라이버도 같이 드라이버 스택에 올라오게 처리하는 방법, 필터 드라이버 자체에서 프로그래밍 적으로
Attach 하고자 하는 드라이버의 DriverObject 를 알아내서 디바이스 스택을 구성하는 방법 등등..

질문 내용만으로는 구체적인 언급이 없어서 판단하기가 힘드네요. WDM 구조라고 가정하면 필터 드라이버가
Unload 되지 않는 데는 몇가지 이유를 찾아 볼 수 있겠죠. IRP_MN_REMOVE_DEVE PnP 디스페치 루틴에서
Remove Lock 을 제대로 핸드링 하지 않고 있는 경우,  필터 드라이버에서 응용 프로그램을 위한 어떤 커널
오브젝트를 생성해서 사용하고 있거나 또는 다른 드라이버 계층의 디바이스 오브젝트를 참조하고 있는데...
커널 오브젝트에 대한 Reference 가 릴리즈 되지 않고 드라이버에 의해서 계속 소유되고 있는 경우,
그리고.. Functional Driver에 대한 필터 드라이버가 아니고, Class Driver에 대한 필터 드라이버일 경우에..
같은 Class Driver 스택계층을 사용하는 다른 디바이스 드라이버 인스턴스가 Dereference 되지 않고 있는
경우 등등...

해당 드라이버가 스택에 올라오고 있는지 아닌지는 IRP_MN_START_DEVICE 디스패치 루틴에서 DebugPrint 로
찍어 보면 알수 있을 겁니다.

+ -

관련 글 리스트
66120 filter driver질문이 있어요~ gambler 931 2012/02/01
66123     Re:filter driver질문이 있어요~ 빌더 1326 2012/02/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.