Доброго времени суток!!! Есть драйвер-фильтр файловой системы, который перехватывает MajorFunction драйвера fastfat и есть очень большое желание прикрутить к нему еще и теневое копирование(т.е. дублирование всех файлов копируемых на устройство). В общих чертах я полагаю что надо выделить память, скопировать туда буфер. Но это лишь мое отдаленно представление. Где именно храниться буфер с файлом, его размер. Даже если я его скопировал в память, что с ним дальше делать то (особенно если это была лишь часть большого файла)??? Вообщем буду благодарен за любую помощь в осещении этой темы
Простейший вариант (да и самый разумный вероятно) создать динамический массив структур с описанием. Что-то типа: Код (Text): struct file { unsigned int size; PVOID buffer; UNICODE_STRING filename; }; struct list_of_files { unsigned int count; struct file *files; } *g_files; Чтобы учесть тот факт, что файл может писаться частями, не обязательно по порядку, можно видоизменить struct file на что-то типа этого: Код (Text): struct file_chunk { unsigned int size; uint64 start_of_chunk; }; struct file { unsigned int count; struct file_chunk *chunks; }; Далее можно создать отдельный worker thread, который будет заниматься только тем, что выбирать очередной файл из списка и писать его на диск. Естественно, не стоит забывать про синхронизацию доступа к структурам. Вроде все, что можно было сказать интересного
gilg С помощью FileMone увидел, что при копировании файла вызывается IRP_MJ_CREATE имя могу извлечь из FILE_OBJECT-> FileName, а вот где буфер с самим файлом? IRP->AssociatedIrp->SystemBuffer пустой. Как различить файл уместился целиком в буфер или это только часть какого нить большого файла???
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. Может быть кто-нибудь подскажет более оптимальный вариант
Снова вернулся к этому вопросу. Воспользовался советами gilg и сделал динамический массив. Проблемы с которыми столкнулся: 1. По моей задумке файлы будут копироваться в какую нить скрытую директорию. Так как файлы с одинаковым именем могут скопировать не один раз, то решил генерировать случайное имя и создавать дополнительно еще такой же файл со сгенерированым именем, но с расширением например .info в котором писать всю информацию об исходном файле. Проблема в том как лучше это организовать ). На данный момент у меня динамический массив содержит: имя файла, буфер, размер буфера, смещение. а вот как разделить по файлам увы пока не придумал. К имени файла привязываться не получится, так как файл могут скопировать несколько раз и все его копии нужно будет сохранить, а на только последнюю Разве в IRP_MJ_WRITE можно узнать размер исходного файла?! (имеется ввиду откуда идет копирование) 2. При "испытании" файл полученый при теневом копировании оказался почему то больше исходного (. Проверял на calc.exe который весит 115 200 бт, а у меня получился почему то 118 784 (причем полностью рабочий exe файл). Из-за чего это?!
Вообще советую посомтреть в сторону минифильтра файловой системы, MS немалую работу уже сделала за програмиста, и написала некий фрейворк для написания фильтров файловых системы, драйвер FltMgr. Написать драйвер фильтр намного проще , нежели писать по классичекой схеме.
Потому что 118 784 кратно размеру кластера. А рабочий он потому, что виндовому PE загрузчику, мягко говоря, плевать на "лишние" данные в файле.
если не ошибаюсь то функциональность minifilter поддерживается начиная с WinXP SP2, а хотелось бы и 2к Есть варианты как получить файл без "лишних" данных?!
Хотелось бы так же прикрутить и 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 - пусто (( Может есть какие то способы чтобы отделаться так сказать "малой кровью"???
Я долгое время мучал всяческие хуки MJ, теперь могу сказать точно - лучше пиши фильтр (у меня к примеру он работает начиная от 2000 кончая vista sp1 и longhorn 2008, да и кода меньше (если не считать объявления пустых fastio которые меня раздражают)) ибо все это жутко несовместимо со всякими глючными прогами а-ля fsecure bitdefender да и вообще всеми "навороченными" "защитами". К примеру fsecure каждые N секунд копирует все MJ указатели себе в глобальную таблицу, и вызывает их как оригинальные, т.е. я хукаю вызываю его, он через некоторое время начинает вызывать меня и вуа-ля double fault (я это обшел только хуками MJ сплайсингом, но так их палит rkU ! Хотя там у него ошибка но все равно палит). При моем способе сокрытия дровера его девайсы почему-то тоже не видны в (к примеру) device tree. Хуками это не являеться отсюда работает очень хорошо, совместимо со всем, и не палиться rKU и проч. что еще нужно ?
tylerdurden Всетаки я хотел бы больше получить совет по поводу того как получить данные о копируемой информации, а то каким методом (перехват MJ или фильтр), это второй вопрос..... для другой темы думаю
2FED Непонимаю о чем ты, собственно, чем он совершенно другой ? У меня один кода работает и там и там, MJ хуки тоже работали но были не совсем совместимы с каличными недозащитами... P.S. Буффер храниться там же где и обычно в UserBuffer
tylerdurden извеняюсь за оффтоп, просто в виста другая модель драйверов WDF и вот возник вопрос работают ли WDM драйверы под вистой? другими словами, будет ли в виста работать то что мы тут пишед под xp,2000?