CCManager

Тема в разделе "WASM.WIN32", создана пользователем PavPS, 15 окт 2004.

  1. PavPS

    PavPS New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2004
    Сообщения:
    109
    Адрес:
    Russia
    Приветствую, Вас, уважаемые!

    Вот тут зашел таки в тупик и уже давно в нём сижу… Очень прошу помочь хоть чем-то.



    По порядку. (Win NT,XP...) Стояла вроде-бы простая задача о перехвате обращений к файлу и подмене его данных/дешифрация. Например, имелись некоторые файлы, которые содержали какую-то важную инфу. Имеется прога, которая оперирует данными и этими файлами. Файлы содержат зашифрованные данные. Ессно, что эта прога никогда не увидит настоящих данных, если на пути (упрощено до дибилизма) чтение_с_диска---передача_данных_проге не будет стоять фильтра-дешифратора. Надеюсь ясно.



    Теперь о реализации. (Поправьте if где-то неправ).

    Можно следовать примеру Руссиновича, перехватывая FastIo и Dispatch – ф-ю драйвера.

    Тут вроде вы всё просто – где вызывается IRP_MJ_READ послать пакет дальше по стеку, а в конце, когда управление придет на команду следующую за IoCallDriver, расшифровать прочитанные данные. И аналогично для FastIoRead. Для IRP_MJ_WRITE – сначала выделить аналогичный буфер, скопировать туда данные для записи, зашифровать, и передать пакет дальше по стеку. Аналогично и с FastIoWrite. Тут вроде-бы всё понятно и прозрачно. Да и неплохо работает…



    А теперь пора про цисцерну дёгтя: Есть такой зверь в винде, как кэш менеджер – спасение с одной стороны, и страшный геморрой с другой.

    Так, например, при первом открытии файла, он как полагается читается при помощи вышеописанных ф-й (Ну типа ладно – отследили и расшифровали данные), но если стоят соответствующие флаги, эта хрешь кэшируется, и последующин запросы на чтение из этого файла (при его неизменности) идут сначала в кэш, а потом к нашим ф-ям(если нет в кэше). Ну и чё? Да не жалко – на первый взгляд. Но вот представьте, что программа-фильтр еще не запущена, а кто-то сделал обращение к этому файлу. Он взялся в кэш. Пользователь увидел вместо данных всякие там каля-маля зашифрованные. Тут его осинило, что надо программу фильтр включить. Ну включил он её, нажал:прочитать файл – а увидел опять белеберду. А всё от того, что при повторном чтении OS не вызвала перехваченных ф-й, а просто прочитала данные из кэша. Согласитесь, что решаемо: как-то надыбать, где записан кэш, и сказать менеджеру, чтобы он его сбросил и перезагрузил.



    Но ладно, можно и на это забить. Предположим, что файл не кэшировался до запуска программы-фильтра. Хорошо… Рассмотрим следующее:

    Откраваем для чтения файл первый раз (данные прочитаны, расшифрованы, засунуты в кэш, и показаны user-у)

    Что-то в файл дописаваем и сохраняем (данные зашифровались, и отправились дальше по стеку (или по FastIo)). Но в итоге – ничерта не вйдет.

    Дело в том, что работа кэш менеджера идет _и_ после того, как мы уже всё расшифруем/зашифруем. Тоесть, он запишет в кэш данные, которые мы зашифровали, и их же запишет при надобности на диск. Далее при попытке чтения, данные достаются из кэша, не проходя ч/з наши ф-ии. А следовательно – мы получим зашифрованные данные.



    Самое интересное, что ВСЕ проблемы исчезают, если запретить кэшировать файл. (прмер соответствующие флаги для FileObject). Но это не приемлемо.



    Уф, знаю, что понять то чё я тут накорябал – только со второго раза можно :) (минимум) Но, простите тогда, -старался как мог.



    Прошу откликнуться всех, кому не лень !!! Может кто сталкивался с этой проблемой, может, что посоветуете… Я действительно в тупике.



    Заранее благодарен --=PPS=--
     
  2. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    Я бы стал смотреть в сторону NtFlushBuffersFile.
     
  3. PavPS

    PavPS New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2004
    Сообщения:
    109
    Адрес:
    Russia
    Ответ уже нашел. Элементарен, аж стыдно, ведь сам недано предлагал: Io(A)SynchronousPageWrite / IoPageRead. Но есть еще и другие неясности...