Драйвер фильтр файловой системы и теневое копирование

Тема в разделе "WASM.NT.KERNEL", создана пользователем Marik, 8 июн 2007.

  1. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Доброго времени суток!!!
    Есть драйвер-фильтр файловой системы, который перехватывает MajorFunction драйвера fastfat и есть очень большое желание прикрутить к нему еще и теневое копирование(т.е. дублирование всех файлов копируемых на устройство). В общих чертах я полагаю что надо выделить память, скопировать туда буфер. Но это лишь мое отдаленно представление. Где именно храниться буфер с файлом, его размер. Даже если я его скопировал в память, что с ним дальше делать то (особенно если это была лишь часть большого файла)???
    Вообщем буду благодарен за любую помощь в осещении этой темы
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Простейший вариант (да и самый разумный вероятно) создать динамический массив структур с описанием. Что-то типа:
    Код (Text):
    1. struct file {
    2.     unsigned int size;
    3.     PVOID buffer;
    4.     UNICODE_STRING filename;
    5. };
    6.  
    7. struct list_of_files {
    8.    unsigned int count;
    9.    struct file *files;
    10. } *g_files;
    Чтобы учесть тот факт, что файл может писаться частями, не обязательно по порядку, можно видоизменить struct file на что-то типа этого:
    Код (Text):
    1. struct file_chunk {
    2.     unsigned int size;
    3.     uint64 start_of_chunk;
    4. };
    5.  
    6. struct file {
    7.    unsigned int count;
    8.    struct file_chunk *chunks;
    9. };
    Далее можно создать отдельный worker thread, который будет заниматься только тем, что выбирать очередной файл из списка и писать его на диск. Естественно, не стоит забывать про синхронизацию доступа к структурам. Вроде все, что можно было сказать интересного :)
     
  3. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    gilg
    С помощью FileMone увидел, что при копировании файла вызывается IRP_MJ_CREATE имя могу извлечь из FILE_OBJECT-> FileName, а вот где буфер с самим файлом? IRP->AssociatedIrp->SystemBuffer пустой. Как различить файл уместился целиком в буфер или это только часть какого нить большого файла???
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    IRP_MJ_CREATE просто создает FileObject для файла, попутно проверяя правильность пути, права доступа и так далее. Реальный ввод/вывод производится в запросах IRP_MJ_READ и IRP_MJ_WRITE. Если в этих запросах в FileObject установлен флаг DO_DIRECT_IO, то используется прямой ввод/вывод и буфер находится в Irp->MdlAddress; если DO_BUFFERED_IO, то буферизованный и буфер как раз в IRP->AssociatedIrp->SystemBuffer.
    Кроме этого, не стоит забывать про FastIo.

    В голову не приходит ничего, кроме как выполнить свой запрос к файловой системе и узнать размер файла, а потом сравнить с параметрами передаваемыми в IRP_MJ_READ/WRITE. Может быть кто-нибудь подскажет более оптимальный вариант
     
  5. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Снова вернулся к этому вопросу. Воспользовался советами gilg и сделал динамический массив.
    Проблемы с которыми столкнулся:
    1. По моей задумке файлы будут копироваться в какую нить скрытую директорию. Так как файлы с одинаковым именем могут скопировать не один раз, то решил генерировать случайное имя и создавать дополнительно еще такой же файл со сгенерированым именем, но с расширением например .info в котором писать всю информацию об исходном файле. Проблема в том как лучше это организовать :)). На данный момент у меня динамический массив содержит: имя файла, буфер, размер буфера, смещение. а вот как разделить по файлам увы пока не придумал. К имени файла привязываться не получится, так как файл могут скопировать несколько раз и все его копии нужно будет сохранить, а на только последнюю

    Разве в IRP_MJ_WRITE можно узнать размер исходного файла?! (имеется ввиду откуда идет копирование)

    2. При "испытании" файл полученый при теневом копировании оказался почему то больше исходного :dntknw:(. Проверял на calc.exe который весит 115 200 бт, а у меня получился почему то 118 784 (причем полностью рабочий exe файл). Из-за чего это?!
     
  6. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Неужели никто не сталкивался?! :dntknw:(
     
  7. Denwer

    Denwer New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2006
    Сообщения:
    104
    Вообще советую посомтреть в сторону минифильтра файловой системы, MS немалую работу уже сделала за програмиста, и написала некий фрейворк для написания фильтров файловых системы, драйвер FltMgr. Написать драйвер фильтр намного проще , нежели писать по классичекой схеме.
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Потому что 118 784 кратно размеру кластера. А рабочий он потому, что виндовому PE загрузчику, мягко говоря, плевать на "лишние" данные в файле.
     
  9. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    если не ошибаюсь то функциональность minifilter поддерживается начиная с WinXP SP2, а хотелось бы и 2к
    Есть варианты как получить файл без "лишних" данных?!
     
  10. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Хотелось бы так же прикрутить и CD....
    Здесь я перехватываю cdrom.sys и cdfs.sys. Но в отличии от fatsfat, ntfs запись информации идет не через IRP_MJ_WRITE а по SCSI интерфейсу... (IOCTL_SCSI_PASS_THROUGH_DIRECT), Почитал в инете про все это...
    Как я понял IOCTL_SCSI_PASS_THROUGH_DIRECT это уже секторный уровень, а так не хочется лезть в дебри(к тому же с неважнецким английским) (((
    По сути мне нужно имя файла и буфер с содержимым. (размер и смещение еще)
    Буфер с данными содержится в IRP.AssociatedIrp.SystemBuffer (структура SCSI_PASS_THROUGH_DIRECT), но там только адрес буфера и его размер (DataBuffer, DataTransferLength). А вот как это все разделить по файлам...?!

    IRP->FileObject->FileName - пусто (( Может есть какие то способы чтобы отделаться так сказать "малой кровью"???
     
  11. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Я долгое время мучал всяческие хуки MJ, теперь могу сказать точно - лучше пиши фильтр (у меня к примеру он работает начиная от 2000 кончая vista sp1 и longhorn 2008, да и кода меньше (если не считать объявления пустых fastio которые меня раздражают)) ибо все это жутко несовместимо со всякими глючными прогами а-ля fsecure bitdefender да и вообще всеми "навороченными" "защитами". К примеру fsecure каждые N секунд копирует все MJ указатели себе в глобальную таблицу, и вызывает их как оригинальные, т.е. я хукаю вызываю его, он через некоторое время начинает вызывать меня и вуа-ля double fault (я это обшел только хуками MJ сплайсингом, но так их палит rkU ! Хотя там у него ошибка но все равно палит). При моем способе сокрытия дровера его девайсы почему-то тоже не видны в (к примеру) device tree. Хуками это не являеться отсюда работает очень хорошо, совместимо со всем, и не палиться rKU и проч. что еще нужно ?
     
  12. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    tylerdurden а разве в vista не совершенно другой тип драйверов, или ты именно про метод?
     
  13. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    tylerdurden
    Всетаки я хотел бы больше получить совет по поводу того как получить данные о копируемой информации, а то каким методом (перехват MJ или фильтр), это второй вопрос..... для другой темы думаю :)
     
  14. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    2FED
    Непонимаю о чем ты, собственно, чем он совершенно другой ? У меня один кода работает и там и там, MJ хуки тоже работали но были не совсем совместимы с каличными недозащитами...

    P.S. Буффер храниться там же где и обычно в UserBuffer
     
  15. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    tylerdurden извеняюсь за оффтоп, просто в виста другая модель драйверов WDF и вот возник вопрос работают ли WDM драйверы под вистой? другими словами, будет ли в виста работать то что мы тут пишед под xp,2000?
     
  16. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Будет