Всем доброго! FastIoDetachDevice, что является возбудителем для этой функции? Попытка отключить девайс, удаление объекта содержащего этот девайс или IRP_MJ_DEVICE_CHANGE? Заранее всем спасибо!!!
Цитата из DDK "Using Fast I/O": This last routine is a most curious one. The ntddk.h file does provide a hint as to the purpose of this call—namely, it is called when a device object is about to be deleted. We found this call is extremely useful when developing filter drivers for file systems, since the device objects of removable file systems are destroyed whenever the underlying media is changed. Sometimes this occurs immediately, but it can occur at almost any time after the media has been removed, depending upon what portions of the system are still caching information. In our experience, a filter driver for removable media file systems must be able to handle this call as the system will halt otherwise. "сатьи или еще какой-либо иной материал" ищи на osr.com и osronline.com
Four-F, читал я это все. Написал письмо Зезуле, он ответл так: "Don't search the device chain, remove the device given as parameter to FastIoDetachDevice. BTW, if you look at the original FileSpy code, you must see this there" Этот код я наверное уже буду в скорм времени помнить на изусть, только толку мало, ну не вижу я там явного unmounted device (((.
Я конечно же могу обойтись без этой опции, только вот постоянный перезапуск системы на этапе тестирования кода, меня уже нервирует.
К сожалению, я не спец в фс. Копать некогда. На твоём месте, я бы пошёл путем дизассемблирования драйвера Зезулы. Судя по размеру, нового кода там кило 6-7. Учитывая то, что у тебя есть сорцы прототипа, работы совсем немного. Касательно причины вызова FastIoDetachDevice. По исходникам есть три пути. Код (Text): IoDetachDevice -> IopCompleteUnloadOrDelete -> (fastIoDispatch->FastIoDetachDevice)( attachedDevice, DeviceObject ) IoDeleteDevice -> IopCompleteUnloadOrDelete -> (fastIoDispatch->FastIoDetachDevice)( attachedDevice, DeviceObject ) IopDecrementDeviceObjectRef -> IopCompleteUnloadOrDelete -> (fastIoDispatch->FastIoDetachDevice)( attachedDevice, DeviceObject ) Скорее всего, в твоём случае это IoDeleteDevice. Она много откуда зовётся. Если есть исходники винды, смотри. На osronline.com есть три очень толковых мыльных конфы по дровам, по фс-дровам и по дебагу. Попробуй воспользоваться поиском (выбери NTFSD): http://www.osronline.com/page.cfm?name=search ЗЫ: Дизасм по-любому решит все проблемы. Вливай в иду и вперёд...
Four-F, ты не поверишь, я тут значит голову ломаю, пишу жуткие письма, потому как мой английский ужасен, а тут... А тут выясняется, что у Зезулы этот драйвер вовсе не выгружаемый, он просто весит и ждет когда же к ниму вновь обратяться. Вообщем доверяй, но все же проверяй, иначе просто и в психушку попасть можно.
Four-F и еще, прочитанный мной материал на всевозможных форумах, навел меня на мысль. Алгоритм отключения устройства, из User Mode: 1) посылаю минор FSCTL_LOCK_VOLUME; 2) посылаю минор FSCTL_DISMOUNT_VOLUME; 3) посылаю минор FSCTL_UNLOCK_VOLUME. Вопрос первый: Что именно деласть в пунктах 1 и 3? Алгоритм пункт 2, из Kernal mode: в диспечере IRP на FSCTL_DISMOUNT_VOLUME выполняю следующие действия: 1) инициализирую ExInitializeWorkItem со своей функцией обработчиком №1 2) заполняю 3-й параметр инициализированной переменной из 1 пункта 3) создаю IoSetCompletionRoutine со своей функцией обработчиком №2 4) IoDetachDevice 5) IoCallDriver жду вызова функции №2, выполняю следующее: if (KeGetCurrentIrql() > PASSIVE_LEVEL) { // // We are not at passive level, but we need to be to do our work, // so queue off to the worker thread. ExQueueWorkItem( &(((PSPY_COMPLETION_CONTEXT_W2K)Context)->WorkItem), DelayedWorkQueue ); } else { PSPY_COMPLETION_CONTEXT_W2K completionContext = Context; // // We are already at passive level, so we will just call our // worker routine directly. // (completionContext->WorkItem.WorkerRoutine)(completionContext->WorkIte m.Parameter); } жду вызова функция №1 и вызываю в ней IoDeleteDevice. правльны ли мои рассуждения и вообще как технически правильно это делать? Как ты думешь, это не полнейшая бредятина? Four-F, извни что обращаюсь непосрественно к тебе, но так получается , что кроме тебя эта тема мало кому вообще интересна.
Four-F, kak ne preskorbno no moi rasujdeniya polneishaya bredyatina . Potomukak etot algoritm primenim tol'ko v tom sluchae, esli ya obladayu exlusivnim dostupom k logicheskomu disku, takovimi mogut bit' fleshmemory ili disk "A". Jal' chto malo tut uchastnikov kotorii razberayutsya v dannom voprose. I tak, o dinamicheskom otklyuchenii poka mojno zabit' , i tak mnogo vremeni bilo potracheno v pustuyu, nado dvigat'sya dal'she. Four-F, spasibo za soveti, ya nadeyus' u tebya eshe ostalos' terpenya dlya moih glupih voprosov.