Итак, дров упал в бсод. Но перед этим успел наследить в реестре, т.е. его имя, и проч. параметры в секции CurrentControlSet/Services. После перезагрузки, для успешной новой загрузки того же дрова нужно бы почистить следы его пребывания в реестре. Итак, почистили. Но как сделать так, чтобы после чистки реестра - от его имени, проч. других параметров - можно было бы без перезагрузки загружать этот дров повторно. Что надо зафлушить или мож. другие манипуляции? Посоветуйте новичку. Т.е. имеем 2 перезагрузки - после БСОДа и после чистки реестра, чтобы можно было снова загружать тот же дров (здесь речь про динамическую загрузку- SCM). Как сократить это число до 1й перезагрузки?
OpenService\DeleteService удаляет и из базы SCM и из реестра, по идее после перезагрузки (если драйвер не запускался) база SCM должна быть пуста поэтому удаление из реестра должно решить проблему и CreateService должен отработать нормально, так что откуда берётся вторая перезагрузка у тебя мне не ясно =\
rain, Great Зачастую до DeleteService не доходит, а падает в БСОД, посему реестр не чистится менеджером. И после БСОДа реестр база не пуста. И приходится её чистить, но после чистки опять нужна перезагрузка(!?) иначе дров не грузится менеджером. А почему - не знаю. Будто база менеджера не увидела изменений в реестре после чистки. Приходится ребутить ещё раз( И ведь не могу понять почему... вот и спрашиваю мож чё за'Flush'ить надо) чтобы изменения вступили в силу без перезагрузки. CreateService возвращается с ERROR_SERVICE_EXISTS (00000431), хотя перед этим реестр был почищен. Зато после перезагрузки всё норм. Вот такие пироги. ХР СП2+
у меня нормально все грузится. если ты делетишь и создаешь потом в одной сессии SCM, тогда он мог не произвести фактическое удаление сервиса, а ты пытаешься его создать. мне помогает перезагрузка только проги-лоадера. в новой сессии SCM все ок
IceStudent ну да, я просто влом было писать переоткрытие хендла, мне проще перезапустить лоадер )0 ну а так конечно проще. я это и имел в виду в словах
Хм... выходит у меня одного такая проблема возникает..? шаги: 1. Лоадер открывает базу, создаёт сервис, стартует сервис. 2. Дров уходит в БСОД, при этом лоадер не удаляет ничего из реестра. 3. После БСОДА чистится реестр в regedit'е. 4. После чистки реестра попытка запуска лоадера ведёт к ERROR_SERVICE_EXISTS. 5. После новой перезагрузки лоадер отрабатывает на ура. Люди, человеки... у кого такое же встречается то?(( и как с этим бороться? как дать системе обновить базы сервисов динамически?
asmfan По 1 пункту - хендлы закрываются хоть? Или бсод при старте драйвера? Вообще, у меня было нечто схожее, но только я пробовал второй драйвер зарегистрировать с тем же DisplayName, что и у первого (запись которого была удалена регедитом). Возникла мысль, что DisplayName где-то кешируется, но дальше смотреть не стал.
эгм.. я во втором посте предлагал сделать OpenService \ DeleteService, что-то из этого вышло? upd: IceStudent Всё правильно если делать без перезагрузки так и должно быть, а вот почему у ТС после перезагрузки не чистится база SCM? я такого ещё не видел (это хоть теоретически невозможно?) asmfan может всё-таки дров автостартом запускается, но не бсодит, поэтому оставляет след в SCM, а когда ты удаляешь из реестра запись то в SCM ессесно остаётся запись и говорит что есть уже такой
Нужно сделать ровно обратные операци - открыть SCM, сделать DeleteService, закрыть SCM после этого можно снова открывать SCM и добавлять этот сервис. Реестр лучше руками не трогай
Просто специфика дрова такова, что он хранится в темповом для каждого запуска лоадера файле и информация о его имени нигде кроме контекста лоадера и самого реестра не сохраняется, а так... наверное вы все правы про чистку базы сервисов программно... Спасибо всем, принявшим участие. Вопрос считаю исчерпаным. Сделал вывод - база менеджера сервисов связана с реестром, но закэширована и изменения лучше вносить программно. Терь другой вопрос - что считается хорошим тоном, если при первом запуске лоадера имеем ERROR_SERVICE_EXISTS? Динамически создавать имя сервиса, помимо имени файла?