У меня такая проблема. Мой драйвер — это посредник, между одним интерфейсом и драйвером другого устройства. Во время работы с ними мне надо извлечь устройство нижележащего драйвера, когда мой драйвер работает, т е выполняет запросы. А так как нижележащий драйвер плаг энд плэй, то он выгружается после извлечения устройства.А мой драйвер продолжает обращаться к драйверу, которого нет. Как сделать так, чтобы избежать обращения в никуда и остановить мой драйвер после извлечения устройства... или не передавать запросы в нижележ драйвер..у меня обращение к нему организовано через эвент, а не через CompletionRoutine.Можно ли использовать IoMarkIrpPending и как выйти из этой ситуации?
заранее спасибо!
Так давай по порядку!
A_G>У меня такая проблема. Мой драйвер — это посредник, между одним интерфейсом и драйвером другого устройства. Во время работы с ними мне надо извлечь устройство нижележащего драйвера, когда мой драйвер работает, т е выполняет запросы.
Как я понимаю это фильтр-драйвер который включен в стек драйверов на самом верхнем уровне и ты сам формируешь IRP и передаешь его вниз по стеку.
A_G>А так как нижележащий драйвер плаг энд плэй, то он выгружается после извлечения устройства. А мой драйвер продолжает обращаться к драйверу, которого нет. Как сделать так, чтобы избежать обращения в никуда и остановить мой драйвер после извлечения устройства... или не передавать запросы в нижележ драйвер..у меня обращение к нему организовано через эвент, а не через CompletionRoutine.
Использование CompletionRoutine с одной стороны возможно помогло бы тебе получить нотификацию о отсутствии устройства, хотя это не метод. Ну тоесть я хочу сказать, что в CompletionRoutine тебе бы например пришло что IPR canceled.
Но лучше использовать PnP Notification смотри в DDK там же вроде все описано хорошо. Для поиска используй IoRegisterPlugPlayNotification функцию.
A_G>Можно ли использовать IoMarkIrpPending и как выйти из этой ситуации?
Для того что бы использовать IoMarkIrpPending нужно установить CompletionRoutine потому что ф-я IoMarkIrpPending всего лишь отмечает данный IPR как PENDING тоесть говорит о том что драйверу нужно потом будет провести обработку данных вызвав CompletionRoutine.
Здравствуйте, 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(и др — смотри документацию). Поймав сообщение об отключении устройства — обработайте его — отментие все свои запросы и не передавайте новых.
Кроме того, аналогичные действия нужно проделаит с сообщениями управления питанием
Здравствуйте, 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.
Здравствуйте, .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. Сорри!
A_G>У меня такая проблема. Мой драйвер — это посредник, между одним интерфейсом и >драйвером другого устройства. Во время работы с ними мне надо извлечь устройство >нижележащего драйвера, когда мой драйвер работает, т е выполняет запросы.
Ты прямо над ним по стеку? тогда это невозможно. REMOVE пройдет всему стеку, а не одному драйверу.
А если не прямо над ним — то есть такая штука, device interface removal notification.