Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с обнаружением операции копирования и перемещения файлов  (Прочитано 14063 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
marat_
Шеф-повар
Опытный

ru
Offline Offline

« : 01-03-2008 11:19 » 

Всем привет. Есть такая задача: отследить копирование и перемещение файлов. Поставил заглушки на ntopenfile, ntcreatefile. Отслеживаю открытие и создание файлов с разными флагами, но связать операции не получается. Есть идеи?
Записан
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #1 : 03-03-2008 05:34 » new

задачу скорректировал. для файла хранится набор различных (не системных, а определяемых пользователем) атрибутов. при копировании или перемещении этого файла необходимо все его атрибуты применить к новому. появилась идея отслеживать по содержимому вновь создающихся файлов (допустим считать контрольную сумму), при совпадении с нашим зарегистрированным подкачать атрибуты. но при активной загрузке системы (многочисленных операциях копирования\перемещения) получается полный ahtung! ранее была идея атрибуты свои хранить вместе с системными (переменная типа ULONG, где хранятся флаги скрытый\архивный и т.д.), но там уже нет "свободного" места. слышал, что в ntfs есть расширение атрибутов, но инфы не нашёл. сижу, думаю.

P.S. если у кого-нибудь есть книга NT File System Internals Rageev Negar, дайте ссылку, пожалуйста, а то уже несколько скачал, а там скан плохой, кусков текста на страницах не хватает. буду очень признателен.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 03-03-2008 12:48 » 

а может быть типа ReadDirectoryChangesW
и соответственно для нее NativeApi: ZwNotifyChangeDirectoryFile ?

PS
расширенные атрибуты - может ZwSetEaFile/ZwQueryEaFile? FILE_FULL_EA_INFORMATION? и т.п.
« Последнее редактирование: 03-03-2008 13:36 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #3 : 03-03-2008 23:55 » 

с directorynotifychange как раз и пробовал + findfirstchangenotification. событий слишком много, пока пройдёт проверка, общение с user-приложением - система вешается. а по EA-атрибутам гляну
Записан
Chaa
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 04-03-2008 04:02 » 

В NTFS в файле может храниться несколько потоков данных. Т.е. можно для ваших аттрибутов организовать отдельный поток данных в файле. Тогда атрибуты всегда будут в файле, если он будет перемещаться внутри NTFS-тома или между NTFS-томами. Также WinRAR поддерживает архивирование всех потоков в файле.

Насколько я знаю, это используется, например, в Kaspersky Antivirus, чтобы не проверять много раз один и тот же файл, если он не изменялся.

Код:
CreateFile("myfile.dat:myattributes", ...);

Здесь myfile.dat это имя файла, а myattributes имя вашего потока данных в файле.
Записан
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #5 : 05-03-2008 05:40 » 

уже скорее всего не в тему, т.к. из-за разногласий с уже имеющимся ПО решено подняться на уровень пользователя и оттуда производить действия над файлами. есть ли аналоги у seteafile/queryeafile в юзермоде? я не нашёл. по потокам смотрю, но у меня не компилится, требует какую-то dll, но название выводит непонятно (с вопросами). ищу инфу дальше. а здесь тему уже, наверное, можно закрывать. всем спасибо.
Записан
Chaa
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 05-03-2008 10:21 » 

Кратко про потоки можно посмотреть в MSDN в статье How To Use NTFS Alternate Data Streams http://support.microsoft.com/kb/105763.

Там же можно скачать программу Streams, которая позволяет посмотерть потоки в файлах http://www.microsoft.com/technet/sysinternals/FileAndDisk/Streams.mspx.

Еще можно попробовать из командной строки:
Код:
echo "Test" > "file.txt"
echo "Test with stream" > "file.txt:stream"

more < "file.txt"
more < "file.txt:stream"
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 05-03-2008 15:09 » 

гы, прикольно)))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #8 : 06-03-2008 12:03 » 

с потоками разобрался. собственный баг в настройках проекта отловил. всё работает, но только вопрос появился: может ли createfile при открытии потока уже занятого файла дать отказ? я думал, что нет, а система мне несколько раз отказывала в доступе на поток. может там какие-то хитрые флаги надо задавать?
Записан
Chaa
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 07-03-2008 03:51 » 

Насколько я понимаю, права доступа и блокировки одни для всех потоков в файле. Поэтому система может отказать в доступе к потоку.
Чтобы два приложения могли работать с одним файлом, надо в них аккуратно указывать параметры dwDesiredAccess и dwShareMode в вызове CreateFile.

Например, если оба приложения откроют файл с такими параметрами, то они оба смогут писать и читать этот файл.
Код:
CreateFile("myfile.dat:myattributes", GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE, ...);

Рекомендую еще почитать статью IPropertySetStorage-NTFS File System Implementation http://msdn2.microsoft.com/en-us/library/aa363858.aspx. Там немного и про блокировки написано. Если COM нравится больше, чем Win32 API, то лучше пользоваться IPropertySetStorage. Посмотреть можно в Проводнике, правой кнопкой на файле Word-а или Excel-я, выбрать Свойства, закладка Особые.
Записан
marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #10 : 08-03-2008 01:35 » 

ага. понял. в ранних статьях по ntfs было разделение: права на файл отдельно, на потоки - отдельно... жаль... со своим приложением я разделяю права, а получить данные с потока, когда файл открыт другой программой иногда не получается. будем пробовать дальше...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines