Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: IOCallDriver  (Прочитано 7573 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sunny
Гость
« : 04-11-2003 08:58 » 

Вот какая проблема: можно ли передать пришедший к моему девайсу IRP низшему драйверу, если мой девайс не является фильтрующим(т.е. не приаттачен к целевому)? пытаюсь делать так:
IoCopyCurrentIrpStackLocationToNext(I);
SetCompletitionRoutine(...);
status=IocallDriver(...);
и после выполнения IocallDriver получаю синий экран...Нет ли тут какой-нибудь тонкости? Поможите, пожалуйста!
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 04-11-2003 09:10 » 

Если твой драйвер не в стеке, то нечего говорить про низший драйвер, это понятие есть только для девайсов в стеке.
Вызвать естественно можно любой драйвер- быть для этого в стеке не обязательно. Только тут несколько вопросов.
Как ты получил этот IRP?
Если ты не в стеке(просто отдельный драйвер), то твой DEVICE_OBJECT, управляемый твоим драйвером, не учитывается в DEVICE_OBJECT.StackCount самого верхнего девайса в стеке. Тут мне не понятно что делать с IRP- в каком виде он к тебе приходит, может там уже сделан IoCopyCurrentIrpStackLocationToNext(I) и заполнены другие поля, в том числе и поставлена процедура завершения.
Объясни подробнее что ты делаешь?

Твой код соответсвует тому, что в DEVICE_OBJECT.StackCount учтен твой девайс или тому, что IRP пришло к тебе без копирования CurrentIrpStackLocation для нижележащего драйвера.
Записан
Sunny
Гость
« Ответ #2 : 04-11-2003 09:39 » 

Да, я именно НЕ в стеке, ко мне приходит  IRP_MJ_WRITE- (созданный в рез-те вызова WriteFile из приложения к моему драйверу )- и я хочу его просто перенаправить другому девайсу(serial0), который я получаю ранее через IoGetDeviceObjectPointer. Насколько я понимаю, в DEVICE_OBJECT.StackCount
мой девайс не учтён...
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 04-11-2003 10:17 » 

Прежде чем просто перенаправлять тебе надо решить несколько проблем.

1) Падает все из-за того, что у тебя в стеке IRP нет места для драйвера, который ты вызываешь. IoCallDriver вызывает IoSetNextIrpStackLocation, а ты перед этим еще и вызвал IoCopyCurrentIrpStackLocationToNext , а там ничего нет, некуда копировать, так как стек в IRP был создан по значению DEVICE_OBJECT.StackSize объекта устройство, управляемого твоим драйвером, а там 1(единица!), как результат- ты повредил системный пул, переписав(даже можно сказать - затер) его управляющие структуры, которые находятся в конце и в начале каждого выделенного блока памяти. По простому говоря- вылез за границы массива.

2) Выход может быть таким- ты в своем драйвере после создания объекта при помощи IoCreateDevice присваиваешь значение DEVICE_OBJECT.StackSize равное DEVICE_OBJECT.StackSize,того девайса на который ты пересылаешь IRP, плюс 1. То есть

IoCreateDevice(..., pDeviceObject );
pDeviceObject->StackSize = pDeviceObjectLower->StackSize+1;

Тогда можешь копировать стек в IRP при помощи IoCopyCurrentIrpStackLocationToNext(I) ставить процедуры завершения и т.д. в общем работать так, как будто твой девайс в стеке устройств.

3) Второй способ- ты можешь создавать свой IRP(IoAllocateIrp,  IoBuildAsynchronousFsdRequest, IoBuildSynchronousFsdRequest и т.д.) и посылать его тому девайсу, при этом перекопировав стек из пришедшего к тебе IRP. Но это вариант несколько сложнее, там есть тонкости. Но он более распространен.

Попробуй оба варианта. Сравни.
Записан
Sunny
Гость
« Ответ #4 : 04-11-2003 11:03 » 

Огромное спасибо за внимание ко мне в частности и этому проекту вообще! Способ с созданием своего IRP работает, но это вроде как не спортивно, как первый проверю -напишу!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines