Добрый день.
Есть legacy driver (работает без железа ). Дравер запускется и выгружается менеджером системных сервисов — нет проблем, но стоит воткнуть в DriverEntry успешный вызов IoReportDetectedDevice, как при попытке остановить драйвер — приходит отказ ERROR_INVALID_SERVICE_CONTROL. Eсть ли какая-либо возможность выгружать/деинсталлировать такой класс драйверов без перезагрузки?
Спасибо
А>Eсть ли какая-либо возможность выгружать/деинсталлировать такой класс драйверов без перезагрузки?
Удалить девайс сначала, не?
JID: x64j@jabber.ru
Re[2]: Выгрузка драйвера
От:
Аноним
Дата:
17.03.10 16:23
Оценка:
Здравствуйте, x64, Вы писали:
А>>Eсть ли какая-либо возможность выгружать/деинсталлировать такой класс драйверов без перезагрузки?
x64>Удалить девайс сначала, не?
Спасибо.
И сначала и потом.
Удаляю девайс DeviceManager-ом.
Запускаю софтину, останавливающую сервис.
На SERVICE_CONTROL_STOP ответ 1052 (ERROR_INVALID_SERVICE_CONTROL).
При попытке DeleteService — 1072 ( ERROR_SERVICE_MARKED_FOR_DELETE ). И после перезагрузки сервиса (и девайса) таки не будет.
Нет, ты не понял. Никакой драйвер не может быть выгружен, пока не удалены все девайсы (DEVICE_OBJECT), созданные им. А девайсы, в свою очередь, не могут быть удалены, пока не закрыты все хендлы на них. И так далее. Короче говоря, тебе нужно корректно (ещё раз: корректно) удалить все девайсы вызовом IoDeleteDevice() и только потом вытаться выгрузить драйвер. Сразу предупреждаю, что выгрузить драйвер иногда может быть просто невозможно, по той простой причине, что созданные девайсы всё ещё могут использоваться каким-либо приложением и не в твоих силах повлиять на это.
JID: x64j@jabber.ru
Re[4]: Выгрузка драйвера
От:
Аноним
Дата:
18.03.10 07:19
Оценка:
Здравствуйте, x64, Вы писали:
x64>Нет, ты не понял. Никакой драйвер не может быть выгружен, пока не удалены все девайсы (DEVICE_OBJECT), созданные им. А девайсы, в свою очередь, не могут быть удалены, пока не закрыты все хендлы на них. И так далее. Короче говоря, тебе нужно корректно (ещё раз: корректно) удалить все девайсы вызовом IoDeleteDevice() и только потом вытаться выгрузить драйвер. Сразу предупреждаю, что выгрузить драйвер иногда может быть просто невозможно, по той простой причине, что созданные девайсы всё ещё могут использоваться каким-либо приложением и не в твоих силах повлиять на это.
1) Ни один девайс не был открыт — не было вызовов обработчиков IRP_MJ_CREATE. Я, по крайней мере в процессе отладки, знаю все приложения и службы, которые принципиально могут работать с девайсами, и давлю их.
2) Куда втыкать вызов IoDeleteDevice() ? Hи один из callback-ов не активен.
3) Еще раз — железа нет, а выгружать драйвер будет пытаться сторонний софт , имеющий на это право.
Спасибо.
Здравствуйте, x64, Вы писали:
А>>2)Hи один из callback-ов не активен.
x64>Режим загрузки какой выставлен?
SERVICE_DEMAND_START если ты это имеешь в виду.
ok, тогда ещё вопрос: какое значение у параметра /DRIVER линкера (если оно вообще выставлено)? И чему равно pDriverObject->AddDevice?
JID: x64j@jabber.ru
Re[8]: Выгрузка драйвера
От:
Аноним
Дата:
18.03.10 09:25
Оценка:
Здравствуйте, x64, Вы писали:
x64>ok, тогда ещё вопрос: какое значение у параметра /DRIVER линкера (если оно вообще выставлено)? И чему равно pDriverObject->AddDevice?
SOURCES=driver.c \
ioctls.C \
power.c \
wmi.C \
drv.rc
2)
По поводу AddDevice. Driver не имеет HW, но должен продавать себя как PnP device. Я устанавливаю драйвер с помощью ServMan. DriverEntry может определить, что запущена впервые , рипортет device и завершается без вызова функции, референцированной в pDriverObject->AddDevice. Далее после енумерации девайсов в ХР или ребута в Win7 , DriverEntry определяет , что запущена повторно и выполняет инициализации без рипорт device. Вектор MajorFunction, DriverUnload и AddDevice инициируются по любому одними и теми же значениями. При повторном запуске драйвера PnP manag производит вызов AddDevice и все работает как положено. DriverUnload не вызывается при попытке выгрузить драйвер как до так и после ребута. Открытие/закрытие файлов могу отследить и придавить приложения, открывшие файлы.
Спасобо.
Похоже, проблема в том, что AddDevice != NULL. Система не даст просто так выгрузить драйвер, который помечен как PnP (а наличие AddDevice как раз и говорит системе о том, что драйвер PnP-шный). Такие драйвера должны выгружаться строго PnP-менеджером, т.е. в общем случае повлиять ты на это не можешь. В твоём случае можно попробовать хак вроде временной установки AddDevice в NULL. Например, по какому-нибудь ioctl-запросу это можно сделать. Более правильный вариант заключается в том, чтобы удалить все виртуализуемые драйвером девайсы через PnP-менеджер (используя Setup API, например), в этом случае система сама выгрузит драйвер за ненадобностью. Пробуй, начать можешь с хака, это по крайне мере быстро, если устроит — так и оставишь.
JID: x64j@jabber.ru
Re[10]: Выгрузка драйвера
От:
Аноним
Дата:
18.03.10 10:09
Оценка:
Здравствуйте, x64, Вы писали:
x64>Похоже, проблема в том, что AddDevice != NULL.
Не, для первой загрузки выкинул инициализацию AddDevice. Одного вызова IoReportDetectedDevice достаточно , чтобы стать PnP и срубить возможность выгрузки.
Вопрос : а devcon удаляет девайсы через то самое Setup API, которое ты рекомендуешь?
Система не даст просто так выгрузить драйвер, который помечен как PnP (а наличие AddDevice как раз и говорит системе о том, что драйвер PnP-шный). Такие драйвера должны выгружаться строго PnP-менеджером, т.е. в общем случае повлиять ты на это не можешь. В твоём случае можно попробовать хак вроде временной установки AddDevice в NULL. Например, по какому-нибудь ioctl-запросу это можно сделать. Более правильный вариант заключается в том, чтобы удалить все виртуализуемые драйвером девайсы через PnP-менеджер (используя Setup API, например), в этом случае система сама выгрузит драйвер за ненадобностью. Пробуй, начать можешь с хака, это по крайне мере быстро, если устроит — так и оставишь.
А>devcon удаляет девайсы через то самое Setup API, которое ты рекомендуешь?
Да, исходники см. в wdk\src\setup\devcon.
JID: x64j@jabber.ru
Re[12]: Выгрузка драйвера
От:
Аноним
Дата:
18.03.10 10:40
Оценка:
Здравствуйте, x64, Вы писали:
А>>devcon удаляет девайсы через то самое Setup API, которое ты рекомендуешь?
x64>Да, исходники см. в wdk\src\setup\devcon.
Я не к тому чтобы переписывать, а к тому , чтобы поюзать готовое
К сожалению,
Вызов IoReportDetectedDevice Ок
devcon remove DETECTED\pcsc Ok
Выгрузка не идет ни автоматом, ни через ServiceManager.
Здравствуйте, Аноним,
А>Есть legacy driver (работает без железа ). Дравер запускется и выгружается менеджером системных сервисов — нет проблем, но стоит воткнуть в DriverEntry успешный вызов IoReportDetectedDevice, как при попытке остановить драйвер — приходит отказ ERROR_INVALID_SERVICE_CONTROL. Eсть ли какая-либо возможность выгружать/деинсталлировать такой класс драйверов без перезагрузки?
--
У Вас есть 3 варианта написания драйвера:
1. Legacy драйвер, software only
2. PNP-драйвер, software only
3. Комбинированный, который некоторое время своей жизни прикидывается legacy, а после однократного (!) вызова IoReportDetectedDevice и последуюших перезагрузок уже должен работать как PNP software only.
Обратите внимание, что вариант 3, по которому Вы хотите идти, подразумевает полную реализацию 2 плюс дополнительные телодвижения, связанные с обеспечением однократного вызова этой функции IoReportDetectedDevice или полной чистки системы от следов вашего драйвера после ее вызова. Оно Вам надо? Сделайте сразу драйвер по варианту 2.
Здравствуйте, x64,
x64>Похоже, проблема в том, что AddDevice != NULL. Система не даст просто так выгрузить драйвер, который помечен как PnP (а наличие AddDevice как раз и говорит системе о том, что драйвер PnP-шный). Такие драйвера должны выгружаться строго PnP-менеджером, т.е. в общем случае повлиять ты на это не можешь.
--
Well, можно попытаться это сделать, вызвав IoInvalidateDeviceState(), а затем, в IRP_MN_QUERY_PNP_DEVICE_STATE, cбросить флажок PNP_DEVICE_REMOVED.
C уважением,
Геннадий Майко.
Re[2]: Выгрузка драйвера
От:
Аноним
Дата:
18.03.10 11:44
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:
ГМ>Здравствуйте, Аноним,
А>>Есть legacy driver (работает без железа ). Дравер запускется и выгружается менеджером системных сервисов — нет проблем, но стоит воткнуть в DriverEntry успешный вызов IoReportDetectedDevice, как при попытке остановить драйвер — приходит отказ ERROR_INVALID_SERVICE_CONTROL. Eсть ли какая-либо возможность выгружать/деинсталлировать такой класс драйверов без перезагрузки? ГМ>-- ГМ>У Вас есть 3 варианта написания драйвера: ГМ>1. Legacy драйвер, software only ГМ>2. PNP-драйвер, software only ГМ>3. Комбинированный, который некоторое время своей жизни прикидывается legacy, а после однократного (!) вызова IoReportDetectedDevice и последуюших перезагрузок уже должен работать как PNP software only.
надо? Сделайте сразу драйвер по варианту 2.
Собственно вариант (2) мне и нужен. Вариант (3) это вынужденная мера. До сих пор ( возможно в моей консерватории надо что-то подправить ) без вызова IoReportDetectedDevice PnP manager не сообщал SmartCard службе, что засек новый ридер, и девайс возможно легко загружался/выгружался, но основных функций не выполнял. Как откатить от (3) к (2) — достаточно ли выкинуть вызов IoReportDetectedDevice или нужно добавлять еще что-то?
Здравствуйте, Аноним,
ГМ>>-- ГМ>>У Вас есть 3 варианта написания драйвера: ГМ>>1. Legacy драйвер, software only ГМ>>2. PNP-драйвер, software only ГМ>>3. Комбинированный, который некоторое время своей жизни прикидывается legacy, а после однократного (!) вызова IoReportDetectedDevice и последуюших перезагрузок уже должен работать как PNP software only.
А>Собственно вариант (2) мне и нужен. Вариант (3) это вынужденная мера. До сих пор ( возможно в моей консерватории надо что-то подправить ) без вызова IoReportDetectedDevice PnP manager не сообщал SmartCard службе, что засек новый ридер, и девайс возможно легко загружался/выгружался, но основных функций не выполнял. Как откатить от (3) к (2) — достаточно ли выкинуть вызов IoReportDetectedDevice или нужно добавлять еще что-то?
--
Выкинув вызов IoReportDetectedDevice Вы откатите драйвер к варианту 1.
Я бы просто переписал драйвер в варианте 2, используя WDF/KMDF. Ваш существующий legace драйвер использовал бы как reference. Определенной проблемой будет обеспечение корректной инсталяции PNP software only драйвера средствами PNP manager (класс устройства, *.inf file), но это решаемые проблемы.
C уважением,
Геннадий Майко.
Re[4]: Выгрузка драйвера
От:
Аноним
Дата:
18.03.10 11:58
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:
ГМ>Я бы просто переписал драйвер в варианте 2, используя WDF/KMDF.
Спасибо за cовет.
С целью ликвидации собственной безграмотности:
KMDF содержит нечто, что невозможно (очень сложно) вызвать напрямую? Касательно PnP.
Здравствуйте, Аноним,
А> KMDF содержит нечто, что невозможно (очень сложно) вызвать напрямую? Касательно PnP.
--
Нет.
Самое главное это то, что KMDF содержит корректную имплементацию обработки PNP/Power IRP, которую сделать не так-то просто. Одного этого, IMHO, достаточно, чтобы потратит времени на ее изучение и использование.
C уважением,
Геннадий Майко.
Re[6]: Выгрузка драйвера
От:
Аноним
Дата:
18.03.10 12:46
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:
ГМ>Самое главное это то, что KMDF содержит корректную имплементацию обработки PNP/Power IRP, которую сделать не так-то просто. Одного этого, IMHO, достаточно, чтобы потратит времени на ее изучение и использование.
Более чем согласен,особенно в отношении Power IRP.
Однако хотелось бы знать , как из драйвера (3) получить драйвер (2) ?
Или из legacy (1) получить (2). Похоже , что одного обработчика IRP_MJ_PNP недостаточно.
Нужно создавать руками node в Enum\Root в процессе инсталляции ?
Спасибо
Здравствуйте,
А>Более чем согласен,особенно в отношении Power IRP. А>Однако хотелось бы знать , как из драйвера (3) получить драйвер (2) ? А>Или из legacy (1) получить (2). Похоже , что одного обработчика IRP_MJ_PNP недостаточно. А>Нужно создавать руками node в Enum\Root в процессе инсталляции ?
--
Руками создавать не стоит. Достаточно написать *.inf файл и скормить его Add Hardware Manager. После этого система сама все сделает и запустит Ваш драйвер как обычный PNP драйвер, работа которого особо и не отличается от других PNP драйверов, обслуживающих какую-то железяку.
Вам нужно определиться, к какому классу устройств будет относиться драйвер; в крайнем случае нет проблем придумать и свой личный уникальный класс, да еще и иконку к нему прицепить свою. От выбора класса будет зависит то, как правильно построить строку DeviceId/HardwareId в этом *.inf файле.
C уважением,
Геннадий Майко.
Re[8]: Выгрузка драйвера
От:
Аноним
Дата:
18.03.10 13:25
Оценка:
Здравствуйте, Геннадий Майко, Вы писали: ГМ>Руками создавать не стоит. Достаточно написать *.inf файл и скормить его Add Hardware Manager. После этого система сама все сделает и запустит Ваш драйвер как обычный PNP драйвер, работа которого особо и не отличается от других PNP драйверов, обслуживающих какую-то железяку.
ГМ>Вам нужно определиться, к какому классу устройств будет относиться драйвер; в крайнем случае нет проблем придумать и свой личный уникальный класс, да еще и иконку к нему прицепить свою. От выбора класса будет зависит то, как правильно построить строку DeviceId/HardwareId в этом *.inf файле.
ГМ>C уважением, ГМ>Геннадий Майко.
*.inf файл у меня есть и класс устройств тоже, но это из эпохи XP SP2 x86, когда перегрузка была не критична.
Тупой перенос на Win7 x64 дал много, но не все.
Попробую подработать все в начале след. недели и отпишусь.
Спасибо за ответы.
Re[9]: Выгрузка драйвера
От:
Аноним
Дата:
26.03.10 09:34
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:
... ГМ>>C уважением, ГМ>>Геннадий Майко.
Наконец-то дошли руки. Выкинул из DriverEntry вызов IoReportDetectedDevice и Devcon начал ставить/удалять как PnP на раз.
Пока пробовал только на XP, но, надеюсь на Win7 сработает тоже.
Девайс появляется/удаляется в списке устройств и все подписавшиеся службы получают уведомление PnP manager-а.
Единственное, что смущает — не вызывается Unload. То ли я не все ресурсы освобождаю , то ли .
В любом случае большое впасибо за помощь.
Аноним