SlavaI
Главный специалист
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. Но это вариант несколько сложнее, там есть тонкости. Но он более распространен.
Попробуй оба варианта. Сравни.
|