Выгрузка драйвера
От: Аноним  
Дата: 17.03.10 15:56
Оценка:
Добрый день.
Есть legacy driver (работает без железа ). Дравер запускется и выгружается менеджером системных сервисов — нет проблем, но стоит воткнуть в DriverEntry успешный вызов IoReportDetectedDevice, как при попытке остановить драйвер — приходит отказ ERROR_INVALID_SERVICE_CONTROL. Eсть ли какая-либо возможность выгружать/деинсталлировать такой класс драйверов без перезагрузки?
Спасибо
driverunload ioreportdetecteddevice
Re: Выгрузка драйвера
От: x64 Россия http://x64blog.name
Дата: 17.03.10 16:05
Оценка:
А>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 ). И после перезагрузки сервиса (и девайса) таки не будет.
Re[3]: Выгрузка драйвера
От: x64 Россия http://x64blog.name
Дата: 18.03.10 02:09
Оценка:
А>Удаляю девайс DeviceManager-ом.

Нет, ты не понял. Никакой драйвер не может быть выгружен, пока не удалены все девайсы (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) Еще раз — железа нет, а выгружать драйвер будет пытаться сторонний софт , имеющий на это право.
Спасибо.
Re[5]: Выгрузка драйвера
От: x64 Россия http://x64blog.name
Дата: 18.03.10 07:34
Оценка:
А>2)Hи один из callback-ов не активен.

Режим загрузки какой выставлен?
JID: x64j@jabber.ru
Re[6]: Выгрузка драйвера
От: Аноним  
Дата: 18.03.10 08:02
Оценка:
Здравствуйте, x64, Вы писали:

А>>2)Hи один из callback-ов не активен.


x64>Режим загрузки какой выставлен?

SERVICE_DEMAND_START если ты это имеешь в виду.
Re[7]: Выгрузка драйвера
От: x64 Россия http://x64blog.name
Дата: 18.03.10 08:37
Оценка:
ok, тогда ещё вопрос: какое значение у параметра /DRIVER линкера (если оно вообще выставлено)? И чему равно pDriverObject->AddDevice?
JID: x64j@jabber.ru
Re[8]: Выгрузка драйвера
От: Аноним  
Дата: 18.03.10 09:25
Оценка:
Здравствуйте, x64, Вы писали:

x64>ok, тогда ещё вопрос: какое значение у параметра /DRIVER линкера (если оно вообще выставлено)? И чему равно pDriverObject->AddDevice?


1)
source :

TARGETNAME=drv_pcsc
TARGETTYPE=DRIVER
USER_C_FLAGS = /DDRV=1
RCOPTIONS =-D__WIN7__
TARGETPATH=obj
INCLUDES=.\

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 не вызывается при попытке выгрузить драйвер как до так и после ребута. Открытие/закрытие файлов могу отследить и придавить приложения, открывшие файлы.
Спасобо.
Re[9]: Выгрузка драйвера
От: x64 Россия http://x64blog.name
Дата: 18.03.10 09:52
Оценка:
Похоже, проблема в том, что 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, например), в этом случае система сама выгрузит драйвер за ненадобностью. Пробуй, начать можешь с хака, это по крайне мере быстро, если устроит — так и оставишь.
Re[11]: Выгрузка драйвера
От: x64 Россия http://x64blog.name
Дата: 18.03.10 10:22
Оценка:
А>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.
Re: Выгрузка драйвера
От: Геннадий Майко США  
Дата: 18.03.10 11:22
Оценка:
Здравствуйте, Аноним,

А>Есть 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.

C уважением,
Геннадий Майко.
Re[10]: Выгрузка драйвера
От: Геннадий Майко США  
Дата: 18.03.10 11:27
Оценка: +1
Здравствуйте, 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 или нужно добавлять еще что-то?
Re[3]: Выгрузка драйвера
От: Геннадий Майко США  
Дата: 18.03.10 11:50
Оценка:
Здравствуйте, Аноним,

ГМ>>--

ГМ>>У Вас есть 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.
Re[5]: Выгрузка драйвера
От: Геннадий Майко США  
Дата: 18.03.10 12:30
Оценка:
Здравствуйте, Аноним,

А> 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 в процессе инсталляции ?
Спасибо
Re[7]: Выгрузка драйвера
От: Геннадий Майко США  
Дата: 18.03.10 13:16
Оценка:
Здравствуйте,

А>Более чем согласен,особенно в отношении 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. То ли я не все ресурсы освобождаю , то ли .
В любом случае большое впасибо за помощь.
Аноним
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.