файлы
От: Egel Россия  
Дата: 21.03.03 09:50
Оценка:
привет всем! у меня есть такая проблема — некое приложение создает файл и пишет в него (скажем reget). я получаю нотификацию о создании с помощью ReadFolderChangesW. А как мне узнать, что приложение закончило писать в файл закрыло его? CrateFile и проверять на ERROR_SHARING_VIOLATION грустно заранее балгодарен.
Re: файлы
От: masta Россия  
Дата: 21.03.03 11:42
Оценка:
Попробуй открыть этот файл с правом доступа SYNCHRONIZE и жди на полученном описателе. Когда Wait... вернёт WAIT_ABANDONNED, это будет значить, что файл закрыли. Кстати, а что это за функция ReadFolderChangesW ??? В MSDN описана ф-ия ReadDirectoryChangesW. Имя файла для открытия можно будет получить от ReadDirectoryChangesW.
Re[2]: файлы
От: Egel Россия  
Дата: 21.03.03 12:48
Оценка:
да... ошибся. действительно ReadDirectoryChangesW.

я уже пытался открыть файл с правом SYNCHRONIZE, но Wait... возвращает WAIT_OBJECT_0 всегда
Re[3]: файлы
От: masta Россия  
Дата: 21.03.03 13:48
Оценка:
>я уже пытался открыть файл с правом SYNCHRONIZE, но Wait... возвращает WAIT_OBJECT_0 всегда ???:

Хм, ожидание на файловом дескрипторе применяется для того, чтобы узнать о завершении операции ввода-вывода. Это, кажется, в синем Рихтере написано. По идее, если приложение закрыло HANDLE файла, то он утрачивает актуальность. Отсюда можно предположить, что WaitForSingleObject в этот момент должен вернуть ошибку, а событие WAIT_OBJECT_0 приходит по завершении операции ввода-вывода. Кстати, приложение может и не закрывать файл до какого-то определённого момента, например до закрытия окна. Неплохо также будет поисследовать этот момент с помощью разного рода API spy, например APIS32, чтобы быть совершенно уверенным в том, что файловый дескриптор закрывается и о моменте этого самого закрытия.
Re[4]: файлы
От: Egel Россия  
Дата: 21.03.03 14:58
Оценка:
Здравствуйте, masta, Вы писали:

>>я уже пытался открыть файл с правом SYNCHRONIZE, но Wait... возвращает WAIT_OBJECT_0 всегда ???:


M>Хм, ожидание на файловом дескрипторе применяется для того, чтобы узнать о завершении операции ввода-вывода. Это, кажется, в синем Рихтере написано. По идее, если приложение закрыло HANDLE файла, то он утрачивает актуальность.


...но только в том случае если у тебя оригинал хендла, а в моем случае мы имеем дело с неким подобием дубликата... и я думаю apispy мало чем может помочь
Re[2]: файлы
От: Valerio Россия linkedin.com/in/boronin
Дата: 21.03.03 15:32
Оценка:
M>Попробуй открыть этот файл с правом доступа SYNCHRONIZE и жди на полученном описателе. Когда Wait... вернёт WAIT_ABANDONNED, это будет значить, что файл закрыли.

вообще то иногда приложения открывают файлы с эксклюзивным доступом и указанный способ заранее обречен на провал

простенький файловый фильтр на базе файлмона пишется довольно быстро для *гарантированного* достижения поставленной задачи, но не зная, зачем точно нужна такая ф-ть, не могу утверждать, что это не будет стрельбой из пушки по воробьям...
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[3]: файлы
От: Egel Россия  
Дата: 23.03.03 16:02
Оценка:
Здравствуйте, Valerio, Вы писали:
V>вообще то иногда приложения открывают файлы с эксклюзивным доступом и указанный способ заранее обречен на провал
доступ не эксклюзивный, это точно — открыть файл на чтение можно.

V>простенький файловый фильтр на базе файлмона пишется довольно быстро для *гарантированного* достижения поставленной задачи, но не зная, зачем точно нужна такая ф-ть, не могу утверждать, что это не будет стрельбой из пушки по воробьям...

а можно поточнее? задача такая — cuteftp качает файлы с фтп, и мне надо узнать на другой машине (каталог куда качают расшарен с полными правами), когда он закончил качать файло, попросту говоря закрыл его, чтобы передать в другое место.
Re[4]: файлы
От: Valerio Россия linkedin.com/in/boronin
Дата: 23.03.03 16:42
Оценка:
Здравствуйте, Egel, Вы писали:

E>Здравствуйте, Valerio, Вы писали:

V>>вообще то иногда приложения открывают файлы с эксклюзивным доступом и указанный способ заранее обречен на провал
E>доступ не эксклюзивный, это точно — открыть файл на чтение можно.
тем лучше для Вас, мое дело предупредить

для начала:
если поизвращаться, то можно установить свою ф-ю уведомления об изменениях в директории-файлах
через FindFirstChangeNotification+FILE_NOTIFY_CHANGE_SIZE и пробовать открывать файл эксклюзивно скажем если перестали приходить частые нотификации. Правда тут много оговорок

и я точно не помню, но кажется в случае сетевого доступа этот подход (FindFirstChangeNotification) все равно не всегда работает... да и UNC файлы, кажется, тоже отпадают

V>>простенький файловый фильтр на базе файлмона пишется довольно быстро для *гарантированного* достижения поставленной задачи, но не зная, зачем точно нужна такая ф-ть, не могу утверждать, что это не будет стрельбой из пушки по воробьям...

E>а можно поточнее? задача такая — cuteftp качает файлы с фтп, и мне надо узнать на другой машине (каталог куда качают расшарен с полными правами), когда он закончил качать файло, попросту говоря закрыл его, чтобы передать в другое место.

если же все делать *правильно*, то можно например так:
берем файлмон, выкидываем весь код кроме CREATE/CLEANUP/CLOSE
— IRP_MJ_CREATE обработчик позволяет понять что открыт файл и запихнуть его к себе в список открытых файлов (можно даже выяснить что за приложение открыло файл и следить только за CuteFtp)
— IRP_MJ_CLEANUP — означает, что все хендлы для file object закрыты.
— IRP_MJ_CLOSE — означает, что все ссылки на file object удалены (не забываем о Cache Manager && Memory Manager активности — иногда они могут держать ссылку часами)

Вам соотв. уже IRP_MJ_CLEANUP должно хватить, так что можно попробовать и CLOSE выкинуть.

соответственно все что нужно уже написано в файлмоне, Вам ничего дописывать не надо, просто вырезать указанную ф-ть и добавить взаимодействие со своим приложением и драйвером (команды что мониторить и сигнал в user mode об интересующем событии, например файл закрыт)

вроде для поставленной задачи все.

Успехов!

оффтоп: забавно что CuteFtp пишется за соседними столами
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[5]: файлы
От: Egel Россия  
Дата: 23.03.03 17:08
Оценка:
V>соответственно все что нужно уже написано в файлмоне, Вам ничего дописывать не надо, просто вырезать указанную ф-ть и добавить взаимодействие со своим приложением и драйвером (команды что мониторить и сигнал в user mode об интересующем событии, например файл закрыт)
V>вроде для поставленной задачи все.
а где взять сырцы? с родного сайта их снесли, порылся в форуме — все линки мертвые. дайте пжалста ссылку (или на мыло: iskatel@orc.ru) и тему, я думаю, можно считать закрытой.
Re[5]: файлы
От: Valerio Россия linkedin.com/in/boronin
Дата: 23.03.03 17:14
Оценка:
E>>а можно поточнее? задача такая — cuteftp качает файлы с фтп, и мне надо узнать на другой машине (каталог куда качают расшарен с полными правами), когда он закончил качать файло, попросту говоря закрыл его, чтобы передать в другое место.

еще, наверное это и так понятно, но все же уточняю:
в подходе с файлмоном мониторится только локальная машина, т.е.
1) если CuteFtp запущен с Вашей машины все ОК
2) если к Вам на машину закачивают, то все тоже ОК, разве что не удастся узнать какое приложение закачивает, т.к. все запросы будут приходить уже от SRV.sys

но если CuteFtp колбасит на сервере (если закачивают на сервер (не Ваша машина) и НЕ с Вашей машины), то с клиента ничего нового узнать не удастся, поэтому тут придется:
а) установить драйвер на сервере (нужны привелегии админа)
б) свой сервис запущенный на сервере, который будет общаться с драйвером там же и откликаться на вопросы клиентов
в) собственно клиент, который хочет узнать что там на сервере путем запроса к б)
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[6]: файлы
От: Valerio Россия linkedin.com/in/boronin
Дата: 23.03.03 17:16
Оценка:
E>а где взять сырцы? с родного сайта их снесли, порылся в форуме — все линки мертвые. дайте пжалста ссылку (или на мыло: iskatel@orc.ru) и тему, я думаю, можно считать закрытой.

да закрыты, поиск Гуглом Вас спасет конечно, но я уже выслал на всякий случай последнюю открытую версию. Успехов!
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[6]: файлы
От: Egel Россия  
Дата: 23.03.03 17:54
Оценка:
V>но если CuteFtp колбасит на сервере (если закачивают на сервер (не Ваша машина) и НЕ с Вашей машины), то с клиента ничего нового узнать не удастся, поэтому тут придется:
V>а) установить драйвер на сервере (нужны привелегии админа)
V>б) свой сервис запущенный на сервере, который будет общаться с драйвером там же и откликаться на вопросы клиентов
V>в) собственно клиент, который хочет узнать что там на сервере путем запроса к б)
да... рановато было радоваться... ситуация как раз такая, что файлы лежат на шаре (не моем компе) и писать клиент-сервер для такого не хотелось бы а нет ли чего попроще (напрмер с использованием каких-нить интерфейсов типа IShellFolder) и как так получается, что получить нотифи при создании файла можно (ReadDirectoryChangesW) а при его закрытии нельзя? неужели все настолько плохо?
Re[7]: файлы
От: Valerio Россия linkedin.com/in/boronin
Дата: 23.03.03 18:31
Оценка:
Здравствуйте, Egel, Вы писали:

нет, Egel, ну куда еще проще?

честно говоря, Вы хотите, чтобы где-то далеко кто-то сделал что-то и Вам об этом чтобы не забыл доложить по форме, да еще при этом чтобы не пришлось ничего делать

по-моему так бывает редко

однако если есть такие способы я бы с удовольствием о них узнал

V>>но если CuteFtp колбасит на сервере (если закачивают на сервер (не Ваша машина) и НЕ с Вашей машины), то с клиента ничего нового узнать не удастся, поэтому тут придется:

V>>а) установить драйвер на сервере (нужны привелегии админа)
V>>б) свой сервис запущенный на сервере, который будет общаться с драйвером там же и откликаться на вопросы клиентов
V>>в) собственно клиент, который хочет узнать что там на сервере путем запроса к б)
E>да... рановато было радоваться... ситуация как раз такая, что файлы лежат на шаре (не моем компе) и писать клиент-сервер для такого не хотелось бы а нет ли чего попроще (напрмер с использованием каких-нить интерфейсов типа IShellFolder) и как так получается, что получить нотифи при создании файла можно (ReadDirectoryChangesW) а при его закрытии нельзя? неужели все настолько плохо?

как так получается спросите у авторов
не посчитали нужным сразу сделать по дизайну, а потом уже не до этого стало?
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[7]: файлы
От: Valerio Россия linkedin.com/in/boronin
Дата: 23.03.03 19:13
Оценка:
E>да... рановато было радоваться... ситуация как раз такая, что файлы лежат на шаре (не моем компе) и писать клиент-сервер для такого не хотелось бы а нет ли чего попроще (напрмер с использованием каких-нить интерфейсов типа IShellFolder) и как так получается, что получить нотифи при создании файла можно (ReadDirectoryChangesW) а при его закрытии нельзя? неужели все настолько плохо?

насколько плохо написано тут (навскидку):
Q281253 File Change Notifications Are Lost When Content Is on a UNC Share
Q282185 Indexing Service Loses File System Change Notification Request

а что и как может повлиять пишут тут:
[msdn]Common Causes for Losing File Change Notifications
Some common causes for losing or not establishing File Change Notifications are loss of network connectivity, lack of permissions or invalid user accounts, exceeding the maximum command limit or work contexts for the redirector or server, the file server not returning complete information, or the file server not returning any notification at all.

For additional information, click the article numbers below to view the articles in the Microsoft Knowledge Base: Q221790 IIS Runs Out of Work Items and Causes RPC Failures When Connecting to a Remote UNC Path
Q271148 MaxMpxCt and MaxCmds Limits in Windows 2000
[/msdn]

и т.п.

плюс есть подозрение что бывают ограничения скажем на отслеживание изменений не более чем в 63х директориях одновременно (Q216098 PRB: Visual C++ IDE Slows When Files Are in Many Directories )

мне кажется счастье будет если покопать в сторону WMI, там тоже обещаны механизмы отслеживания изменений в файловых системах:
WMI Scripting: The Missing Manual, Part 1
Managing Windows with WMI

боюсь правда что все это сделано на базе того же Win32 API а значит ReadDirectoryChangesW.

ну и на новых платформах улучшения должны появиться в этом плане:
see MSDN::Monitoring in .NET Distributed Application Design
и прочие вещи из поиска по MSDN

сам бы хотел услышать от спецов в этой области детали по этой теме
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[8]: файлы
От: Egel Россия  
Дата: 23.03.03 19:26
Оценка:
V>нет, Egel, ну куда еще проще?

V>честно говоря, Вы хотите, чтобы где-то далеко кто-то сделал что-то и Вам об этом чтобы не забыл доложить по форме, да еще при этом чтобы не пришлось ничего делать


V>по-моему так бывает редко


не хотелось показаться таким лентяем но не могло же быть так, чтобы такую простую вещь нельзя было бы просто и элегантно решить... я пробовал много способов (включая борьбу со всякими интерфейсами), но похоже, самый простой будет:
do {
HANDLE h = CreateFile (name, GENERIC_WRITE, 0, ....);
while (h == INVALID_HANDLE_VALUE)
но это некрасиво и неэлегантно, не говоря о сетевом флуде хотя в данном случае можно конечно сделать так:
ReadDirectoryChangesW (..., FILE_NOTIFY_CHANGE_FILE_NAME...); // получить нотифи о создании
ReadDirectoryChangesW (..., FILE_NOTIFY_CHANGE_CREATION...); // то ли cuteftp после закрытия файла меняет время, то ли винда??????

но это будет решение только для этого случая.
Re[9]: файлы
От: Valerio Россия linkedin.com/in/boronin
Дата: 23.03.03 19:36
Оценка:
E>не хотелось показаться таким лентяем но не могло же быть так, чтобы такую простую вещь нельзя было бы просто и элегантно решить... я пробовал много способов (включая борьбу со всякими интерфейсами), но похоже, самый простой будет:
E>do {
E>HANDLE h = CreateFile (name, GENERIC_WRITE, 0, ....);
E>while (h == INVALID_HANDLE_VALUE)
E>но это некрасиво и неэлегантно, не говоря о сетевом флуде хотя в данном случае можно конечно сделать так:
E>ReadDirectoryChangesW (..., FILE_NOTIFY_CHANGE_FILE_NAME...); // получить нотифи о создании
E>ReadDirectoryChangesW (..., FILE_NOTIFY_CHANGE_CREATION...); // то ли cuteftp после закрытия файла меняет время, то ли винда??????

скажем на NTFS многие (руками в реестре, tweak утилиты) часто отключают обновление last access time атрибутов файлов

ну попробуйте сделать как я предлагал в самом начале — нотификации на изменение размера файла
ждете нотификаций какое-то время — если нет, пробуете открыть файл эксклюзивно, если откроется — он Ваш
если нет — открыт кем-то еще...

можно даже забить на нотификации вообще, поток повесить да и все, вряд ли это тяжело раз в минуту-пять попробовать открыть файл?
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[5]: файлы
От: Игорь Вартанов Ниоткуда  
Дата: 24.03.03 10:03
Оценка:
Здравствуйте, Valerio, Вы писали:

V>оффтоп: забавно что CuteFtp пишется за соседними столами


Передай за соседние столы, чтобы сделали подписку на нотификации о результатах выполнения задачи — тогда сервер (где бы он ни был запущен) сможет уведомить подписчика и не заставлять его нагружать систему (будь то встраивание полусумасшедших драйверов-мониторов, репетирующие запросы на открытие файла и т.п.). Если это уже сделано — значит народу не хватает документации.
---
С уважением,
Игорь
Re[8]: файлы
От: Egel Россия  
Дата: 25.03.03 16:38
Оценка:
Здравствуйте, Valerio.

в общем, закончилась эпопея. долго копаясь в MSDN и исходниках файлмона я понял, что каких-то документированых способов нет. пришлось делать так: создавать поток, который пытается открыть файл на эксклюзивный доступ, а в функции делать WaitSingleObject. хотя стандартный експлорер как-то мониторит изменения в каталогах, но копание в сторону IShellFolder и иже с ними ничего не дало (может не хватило знаний) так что вопрос пока остался открытым, буду пробовать копать дальше, хотя судя по поиску, никто не озадачивался такой проблемой почему-то. единственное что я нашел — это примеры shell exten'шенов, которые могут получать какую-то нотификацию. если Вы можете посоветовать еще какое-нибудь направление копания, буду очень благодарен
Re[6]: файлы
От: Valerio Россия linkedin.com/in/boronin
Дата: 25.03.03 19:36
Оценка:
ИВ>Передай за соседние столы, чтобы сделали подписку на нотификации о результатах выполнения задачи — тогда сервер (где бы он ни был запущен) сможет уведомить подписчика и не заставлять его нагружать систему (будь то встраивание полусумасшедших драйверов-мониторов, репетирующие запросы на открытие файла и т.п.). Если это уже сделано — значит народу не хватает документации.

передано. Нет еще такой фичи. Говорят зависит во многом от менеджмента с западной стороны. Попробуют их заинтересовать
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[9]: файлы
От: Valerio Россия linkedin.com/in/boronin
Дата: 25.03.03 19:53
Оценка:
E>в общем, закончилась эпопея. долго копаясь в MSDN и исходниках файлмона я понял, что каких-то документированых способов нет. пришлось делать так: создавать поток, который пытается открыть файл на эксклюзивный доступ, а в функции делать WaitSingleObject. хотя стандартный експлорер как-то мониторит изменения в каталогах, но копание в сторону IShellFolder и иже с ними ничего не дало (может не хватило знаний) так что вопрос пока остался открытым, буду пробовать копать дальше, хотя судя по поиску, никто не озадачивался такой проблемой почему-то. единственное что я нашел — это примеры shell exten'шенов, которые могут получать какую-то нотификацию. если Вы можете посоветовать еще какое-нибудь направление копания, буду очень благодарен

причем тут поведение эксплорера? конечно же он отслеживает появление-удаление файлов и т.п. — так и Вы можете с тем же успехом. нотификации же в explorer абсолютно те же что и у Вас будут через указанный выше по топику стандартный механизм Win32. Я буду силдьно удивлен если explorer что-то другое творит, ибо под рукой есть исходные тексты fastfat & cdfs и по-моему там таких нотификаций (по close) не предоставляется.

P.S. а благодарность в правом верхнем углу если что
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.