Кто может пометить сервис для удаления и по какой причине? Ситуация такая: программа запускается и пытается открыть драйвер через CreateFile. Если драйвер запущен, то получает хэндл и хранит его для общения с ним в процессе работы. При завершении программа закрывает этот хэндл. Если драйвер не был запущен, то вызываются последовательно 1.OpenSCManager 2.CreateService 3.OpenService если CreateService==ERROR_SERVICE_EXISTS 3.StartService 4.CreateFile все хэндлы сохраняются и при завершении программы все это хозяйство закрывается. Если программа работает достаточно длительное время, то при завершении она не может остановить драйвер, как я понял, по причине ERROR_SERVICE_MARKED_FOR_DELETE. И драйвер остается запущенным (продолжает периодически выводить инфу по DbgPrint). И при последующем запуске программа опять же не может получить к нему доступ - ERROR_SERVICE_MARKED_FOR_DELETE. Хотя он все ещё работает. И спасает только перезагрузка. Вот такая ситуация. Как победить?
Странно, что она не может остановить драйвер (если драйвер это поддерживат (Unload function) .. У меня такого никогда не возникало. А ты проверял , заходит ли в процедуру выгрузки при получении соответствующего IRP ?
Да.. гадать так можно долго наверно. Хотя еще уточнение.. А не виснет ли драйвер.. Может ему памяти в какой-то момент нехватает (аллок не вызвался и все накрылось ..) или чтото в этом духе.. И еще - Сайс как нить реагирует ? (попробуй так же долго протестить с сайсом этот драйвер с прогой)
Может быть я ошибаюсь и к данной ситуации это не применимо, но у меня была такая ситуация (драйвер не останавливался). Проблема оказалась в том, что в процедуре AddDevice я создавал ассоциативный список (ExInitializePagedLookasideList), а в процедуре выгрузки драйвера я НЕ уничтожал его (ExDeletePagedLookasideList). Это и не давало возможности выгрузить драйвер. Более того, при попытке переустановки драйвера (остановить, заменить файл драйвера, запустить новый), я "наблюдал" весьма симпатичный BSoD
TermoSINteZ На все ExAllocatePage стоит проверка успешности, драйвер не виснет DelExe Антивирусами не пользуюсь, разве что файрвол что-то... ksu_ant Все, что создается - все потом закрывается/уничтожается. На этот предмет я просмотрел всё. В общем, видимо надо ещё понаблюдать, накопить данных.
ERROR_SERVICE_MARKED_FOR_DELETE у меня возникало только после того, как я для драйвера вызывал DeleteService. И то, только в том случае если драйвер не был остановлен. И тогда спасала действительно только перезагрузка. Посмотри, может кто-то у тебя его удаляет?
При удалении драйвера DeleteService он не удаляется сразу а помечается маркером ERROR_SERVICE_MARKED_FOR_DELETE как тока все хендлы связанные с драйвером будут закрыты он выгружаеца. У тя как я понял хендлы закрываются при завершении проги...