Вообщем есть драйвер, фильтрующий irp некоторого устройства. Так вот, в обработчике я хочу вычитать предыдущее значение прежде чем позволить нижнему драйверу записать новое. Для этого и нужно построение irp какое лучше выбрать? Имеет ли значение сколько я нахожусь в самом обработчике, если по любому оригинальный обработчик будет вызван только в конце цепочки?
Путано написано. Как я понял: сверху приходит IRP устройству, ты его отправляешь вниз, ждешь результат обработки. Пока не дождался результата, ставишь новые IRP в очередь. Потом также последовательно отправляешь Irp с результатами обратно. Оно?
Да я плохо объяснил. Я хочу мониторить дисковое устройство, при записи я хочу сохранить предыдушие значение секторов в файл, хранящийся на другом диске. Для этого я заменяю оригинальный обработчик на свой, который считывает згачения секторов(для этого и нужно построение irp), а потом передает управление оригинальному обработчику.
По-любому нужно в своем обработчике делать очередь и синхронно ждать возврата своего Irp снизу, потому что гарантировать нужный порядок их обработки (сначала чтение, потом запись) никто не может. Если работаешь на passive level (по ходу дела так и есть?) пострадать могут только приложения и драйверы, которые используют асинхронный вывод. Остальные даже не заметят.
Можно считать что с этим вопросом я разобрался: я создаю ворк итем и в нем делаю все что надо, и по сути большой разницы синхронный или асинхронный пакет нету. Тогда возникает следующий вопрос, что-нибудь гарантирует то, что смещение и длина в irp.Parameters.Write, кратны сектору или нет?