관리 메뉴

kisoo

드라이버 서비스를 삭제할 때 주의할 점 본문

01.About Programming /12.Default knowledge

드라이버 서비스를 삭제할 때 주의할 점

JamesK78 2009. 5. 11. 12:59

윈도우에서 드라이버를 로드하려면 일단 CreateService 함수로 서비스를 생성해야 합니다. 드라이버를 잘 사용하고 난 뒤 드라이버를 언로드하고 드라이버의 서비스를 삭제할 때 DeleteService 함수를 사용합니다.

이때 응용프로그램과 통신을 위해 생성한 디바이스 오브젝트 등을 CreateFile 등의 함수로 열었을 때 꼭 핸들을 닫아줘야 합니다.

핸들을 닫지 않은채로 DeleteService 함수로 드라이버 서비스를 삭제하게 되면 완전히 삭제되지 않고 흔적이 남아있게 됩니다.

즉 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<드라이버 이름> 키 아래에 DeleteFlag라는 DWORD 값이 생기게 됩니다. 데이터는 1이 들어가있습니다.



서비스가 완전히 삭제되지 않고 삭제 대기중인 상태에서 다시 OpenService로 해당 서비스의 핸들을 얻고 DeleteService 함수를 호출하게 되면 ERROR_SERVICE_MARKED_FOR_DELETE(0x00000430, 1072, 지정된 서비스가 지워진 것으로 표시되었습니다.) 에러가 발생하게 됩니다.

DeleteFlag가 설정된 서비스는 일정 시간이 지나면 자동적으로 삭제됩니다. 하지만 디바이스의 핸들을 닫지 않은 상태에서 CreateService(OpenService)와 DeleteService를 연속적으로 호출하게 되면, DeleteFlag가 남아있는 채로 서비스를 삭제하려고 하는 상황이 생길 수 있으니 주의해야 합니다.


Comments