'드라이버로드'에 해당되는 글 1건
2015. 1. 23. 00:11
[Windows]
참고로, 아래 블로그를 먼저 읽고 오면 좋다.
※ StartService 시 ERROR_FILE_NOT_FOUND(2) 가 발생하는 경우
http://thepassion.tistory.com/30
일단 이런 상황을 만나면 당황하기 마련이다.
디버깅을 해보니 ERROR_FILE_NOT_FOUND 케이스와 동일하게 DriverEntry 에서 IoCreateDevice() 호출시 ERROR_ALREADY_EXISTS 에러를 리턴하고 있었다.
하지만, Unload 루틴에서 IoDeleteDevice() 를 호출하는 부분에서는 문제가 없었다.
즉, 드라이버에 대해 정상적으로 StopService() 가 호출되었음에도 어떤 이유로 언로드되지 못하고 메모리 상에 남아 있어 다음 StartService() 호출시 ERROR_ALREADY_EXISTS 에러로 실패하는 케이스다.
1) 처음 MyDrv.sys 로드에는 성공한다.
2) 어떤 이유로 시스템이 비정상적인 상황이 된다.
3) MyDrv.sys 를 언로드한다.
4) 서비스 매니저(SCM)에는 MyDrv.sys 의 서비스 상태가 "Stopped"(sc query MyDrv)로 변경된다.
하지만, 실제 메모리 상에는 언로드 대기 상태로 남아있다.
※ MyDrv.sys 의 DeviceObject 를 확인해보면 상태 플래그에 DOE_UNLOAD_PENDING 이 확인된다.
5) 이후 MyDrv.sys 에 대한 로드는 IoCreateDevie() 에서 ERROR_ALREADY_EXISTS 에러로 실패한다.
2) 어떤 이유로 시스템이 비정상적인 상황이 된다.
3) MyDrv.sys 를 언로드한다.
4) 서비스 매니저(SCM)에는 MyDrv.sys 의 서비스 상태가 "Stopped"(sc query MyDrv)로 변경된다.
하지만, 실제 메모리 상에는 언로드 대기 상태로 남아있다.
※ MyDrv.sys 의 DeviceObject 를 확인해보면 상태 플래그에 DOE_UNLOAD_PENDING 이 확인된다.
5) 이후 MyDrv.sys 에 대한 로드는 IoCreateDevie() 에서 ERROR_ALREADY_EXISTS 에러로 실패한다.
결론부터 말하면 외부의 비정상적인 영향에 의한 것으로 MyDrv.sys 의 잘못은 아니었다.
이제 궁금한건 그 어떤 이유일 것이다.
다음 덤프 분석글은 해당 원인을 분석한 것이다.