vvoid
Гость
|
|
« : 02-08-2005 12:49 » |
|
Здравствуйте, я всё о том же своём драйвере виртуального диска!
Общая структура работы драйвера может быть охарактеризована следующим образом: 1. При загрузке драйвера создаётся корневое (Root) устройство, функции которого принимать и обрабатывать мои IRP (на монтирование/отмонтирование дисков, возврат некоторой инфы о драйвере и устройствах и т.д). 2. Далее монтируется диск (назовём его Disk1). Соответственно эти устройства выстраиваются в односвязный список, т.е. (Disk1DeviceObjectPtr->NextDevice == RootDeviceObjectPtr) (RootDeviceObjectPtr->NextDevice == NULL). Если примоттировать ещё один диск (Disk2), то список будет иметь такой вид: (Disk2DeviceObjectPtr->NextDevice == Disk1DeviceObjectPtr) (Disk1DeviceObjectPtr->NextDevice == RootDeviceObjectPtr) (RootDeviceObjectPtr->NextDevice == NULL). Напрашивается вывод: Root - устройство более низкого уровня, по сравнению с Disk1 и Disk2, а Disk1, в свою очередь, находится на более низком уровне относительно Disk2.
Известно, что устройство может послать IRP (при помомщи IoBuildDeviceIoControlRequest, IoGetNextIrpStackLocation и последующеого IoCallDriver) драйверу (фактически его устройству, т.к. указывается DEVICE_OBJECT), который находится на более низком уровне.
А теперь суть вопроса. Могу ли я из своего Root девайса послать IRP, к примеру, устройсву Disk1?
PS* Мои пробы, которые, если коротко, сводились к последовательности IoBuildDeviceIoControlRequest, IoGetNextIrpStackLocation, IoCallDriver, заканчивались NULL-ём после вызова IoGetNextIrpStackLocation.
|