Приветствую, Вас, уважаемые! Вот тут зашел таки в тупик и уже давно в нём сижу… Очень прошу помочь хоть чем-то. По порядку. (Win NT,XP...) Стояла вроде-бы простая задача о перехвате обращений к файлу и подмене его данных/дешифрация. Например, имелись некоторые файлы, которые содержали какую-то важную инфу. Имеется прога, которая оперирует данными и этими файлами. Файлы содержат зашифрованные данные. Ессно, что эта прога никогда не увидит настоящих данных, если на пути (упрощено до дибилизма) чтение_с_диска---передача_данных_проге не будет стоять фильтра-дешифратора. Надеюсь ясно. Теперь о реализации. (Поправьте if где-то неправ). Можно следовать примеру Руссиновича, перехватывая FastIo и Dispatch – ф-ю драйвера. Тут вроде вы всё просто – где вызывается IRP_MJ_READ послать пакет дальше по стеку, а в конце, когда управление придет на команду следующую за IoCallDriver, расшифровать прочитанные данные. И аналогично для FastIoRead. Для IRP_MJ_WRITE – сначала выделить аналогичный буфер, скопировать туда данные для записи, зашифровать, и передать пакет дальше по стеку. Аналогично и с FastIoWrite. Тут вроде-бы всё понятно и прозрачно. Да и неплохо работает… А теперь пора про цисцерну дёгтя: Есть такой зверь в винде, как кэш менеджер – спасение с одной стороны, и страшный геморрой с другой. Так, например, при первом открытии файла, он как полагается читается при помощи вышеописанных ф-й (Ну типа ладно – отследили и расшифровали данные), но если стоят соответствующие флаги, эта хрешь кэшируется, и последующин запросы на чтение из этого файла (при его неизменности) идут сначала в кэш, а потом к нашим ф-ям(если нет в кэше). Ну и чё? Да не жалко – на первый взгляд. Но вот представьте, что программа-фильтр еще не запущена, а кто-то сделал обращение к этому файлу. Он взялся в кэш. Пользователь увидел вместо данных всякие там каля-маля зашифрованные. Тут его осинило, что надо программу фильтр включить. Ну включил он её, нажал:прочитать файл – а увидел опять белеберду. А всё от того, что при повторном чтении OS не вызвала перехваченных ф-й, а просто прочитала данные из кэша. Согласитесь, что решаемо: как-то надыбать, где записан кэш, и сказать менеджеру, чтобы он его сбросил и перезагрузил. Но ладно, можно и на это забить. Предположим, что файл не кэшировался до запуска программы-фильтра. Хорошо… Рассмотрим следующее: Откраваем для чтения файл первый раз (данные прочитаны, расшифрованы, засунуты в кэш, и показаны user-у) Что-то в файл дописаваем и сохраняем (данные зашифровались, и отправились дальше по стеку (или по FastIo)). Но в итоге – ничерта не вйдет. Дело в том, что работа кэш менеджера идет _и_ после того, как мы уже всё расшифруем/зашифруем. Тоесть, он запишет в кэш данные, которые мы зашифровали, и их же запишет при надобности на диск. Далее при попытке чтения, данные достаются из кэша, не проходя ч/з наши ф-ии. А следовательно – мы получим зашифрованные данные. Самое интересное, что ВСЕ проблемы исчезают, если запретить кэшировать файл. (прмер соответствующие флаги для FileObject). Но это не приемлемо. Уф, знаю, что понять то чё я тут накорябал – только со второго раза можно (минимум) Но, простите тогда, -старался как мог. Прошу откликнуться всех, кому не лень !!! Может кто сталкивался с этой проблемой, может, что посоветуете… Я действительно в тупике. Заранее благодарен --=PPS=--
Ответ уже нашел. Элементарен, аж стыдно, ведь сам недано предлагал: Io(A)SynchronousPageWrite / IoPageRead. Но есть еще и другие неясности...