запросы на выгруженный дррайвер
От: A_G_M  
Дата: 14.07.04 14:19
Оценка:
У меня такая проблема. Мой драйвер — это посредник, между одним интерфейсом и драйвером другого устройства. Во время работы с ними мне надо извлечь устройство нижележащего драйвера, когда мой драйвер работает, т е выполняет запросы. А так как нижележащий драйвер плаг энд плэй, то он выгружается после извлечения устройства.А мой драйвер продолжает обращаться к драйверу, которого нет. Как сделать так, чтобы избежать обращения в никуда и остановить мой драйвер после извлечения устройства... или не передавать запросы в нижележ драйвер..у меня обращение к нему организовано через эвент, а не через CompletionRoutine.Можно ли использовать IoMarkIrpPending и как выйти из этой ситуации?
заранее спасибо!

14.07.04 20:42: Перенесено из 'WIN API'
Re: запросы на выгруженный дррайвер
От: .Mistery Беларусь  
Дата: 14.07.04 14:59
Оценка:
Здравствуйте, A_G_M, Вы писали:

Так давай по порядку!

A_G>У меня такая проблема. Мой драйвер — это посредник, между одним интерфейсом и драйвером другого устройства. Во время работы с ними мне надо извлечь устройство нижележащего драйвера, когда мой драйвер работает, т е выполняет запросы.


Как я понимаю это фильтр-драйвер который включен в стек драйверов на самом верхнем уровне и ты сам формируешь IRP и передаешь его вниз по стеку.

A_G>А так как нижележащий драйвер плаг энд плэй, то он выгружается после извлечения устройства. А мой драйвер продолжает обращаться к драйверу, которого нет. Как сделать так, чтобы избежать обращения в никуда и остановить мой драйвер после извлечения устройства... или не передавать запросы в нижележ драйвер..у меня обращение к нему организовано через эвент, а не через CompletionRoutine.


Использование CompletionRoutine с одной стороны возможно помогло бы тебе получить нотификацию о отсутствии устройства, хотя это не метод. Ну тоесть я хочу сказать, что в CompletionRoutine тебе бы например пришло что IPR canceled.

Но лучше использовать PnP Notification смотри в DDK там же вроде все описано хорошо. Для поиска используй IoRegisterPlugPlayNotification функцию.

A_G>Можно ли использовать IoMarkIrpPending и как выйти из этой ситуации?


Для того что бы использовать IoMarkIrpPending нужно установить CompletionRoutine потому что ф-я IoMarkIrpPending всего лишь отмечает данный IPR как PENDING тоесть говорит о том что драйверу нужно потом будет провести обработку данных вызвав CompletionRoutine.

Удачи!
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re: запросы на выгруженный дррайвер
От: TarasCo  
Дата: 14.07.04 15:01
Оценка: 1 (1)
Здравствуйте, A_G_M, Вы писали:

A_G>У меня такая проблема. Мой драйвер — это посредник, между одним интерфейсом и драйвером другого устройства. Во время работы с ними мне надо извлечь устройство нижележащего драйвера, когда мой драйвер работает, т е выполняет запросы. А так как нижележащий драйвер плаг энд плэй, то он выгружается после извлечения устройства.А мой драйвер продолжает обращаться к драйверу, которого нет. Как сделать так, чтобы избежать обращения в никуда и остановить мой драйвер после извлечения устройства... или не передавать запросы в нижележ драйвер..у меня обращение к нему организовано через эвент, а не через CompletionRoutine.Можно ли использовать IoMarkIrpPending и как выйти из этой ситуации?

A_G>заранее спасибо!

Поскольку нижний драйвер PnP вы должны были поступить следующим образом:
1)Прикрепиться к его стеку с помощью IoAttachDevice
2)После этого вы обрабатываете все IRP, посылаемые драйверу. Обрабатывайте IRP_MJ_PNP — IRP_MN_REMOVE_DEVICE IRP_MN_SURPRISE_REMOVAL IRP_MN_STOP_DEVICE(и др — смотри документацию). Поймав сообщение об отключении устройства — обработайте его — отментие все свои запросы и не передавайте новых.
Кроме того, аналогичные действия нужно проделаит с сообщениями управления питанием
Да пребудет с тобою сила
Re[2]: запросы на выгруженный дррайвер
От: .Mistery Беларусь  
Дата: 14.07.04 15:07
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Поскольку нижний драйвер PnP вы должны были поступить следующим образом:

TC>1)Прикрепиться к его стеку с помощью IoAttachDevice
TC>2)После этого вы обрабатываете все IRP, посылаемые драйверу. Обрабатывайте IRP_MJ_PNP — IRP_MN_REMOVE_DEVICE IRP_MN_SURPRISE_REMOVAL IRP_MN_STOP_DEVICE(и др — смотри документацию). Поймав сообщение об отключении устройства — обработайте его — отментие все свои запросы и не передавайте новых.
TC>Кроме того, аналогичные действия нужно проделаит с сообщениями управления питанием

Так вот фишка в том что вряд-ли и это нижний драйвер стека, т.е. это не функциональный драйвер и соответственно PnP Manager не посылает этому драйверу свои IRP.
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re[3]: запросы на выгруженный дррайвер
От: .Mistery Беларусь  
Дата: 14.07.04 15:16
Оценка:
Здравствуйте, .Mistery, Вы писали:

M>Здравствуйте, TarasCo, Вы писали:


TC>>Поскольку нижний драйвер PnP вы должны были поступить следующим образом:

TC>>1)Прикрепиться к его стеку с помощью IoAttachDevice
TC>>2)После этого вы обрабатываете все IRP, посылаемые драйверу. Обрабатывайте IRP_MJ_PNP — IRP_MN_REMOVE_DEVICE IRP_MN_SURPRISE_REMOVAL IRP_MN_STOP_DEVICE(и др — смотри документацию). Поймав сообщение об отключении устройства — обработайте его — отментие все свои запросы и не передавайте новых.
TC>>Кроме того, аналогичные действия нужно проделаит с сообщениями управления питанием

M>Так вот фишка в том что вряд-ли и это нижний драйвер стека, т.е. это не функциональный драйвер и соответственно PnP Manager не посылает этому драйверу свои IRP.


Снимаю пост, был неправ, точно — если драйвер прикручен к стеку то он получает все PnP IPR. Сорри!
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re: запросы на выгруженный дррайвер
От: Maxim S. Shatskih Россия  
Дата: 14.07.04 23:39
Оценка:
A_G>У меня такая проблема. Мой драйвер — это посредник, между одним интерфейсом и
>драйвером другого устройства. Во время работы с ними мне надо извлечь устройство
>нижележащего драйвера, когда мой драйвер работает, т е выполняет запросы.

Ты прямо над ним по стеку? тогда это невозможно. REMOVE пройдет всему стеку, а не одному драйверу.

А если не прямо над ним — то есть такая штука, device interface removal notification.
Занимайтесь LoveCraftом, а не WarCraftом!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.