Как контролировать операции чтения / записи файла процесса? - PullRequest
3 голосов
/ 08 ноября 2011

Я думал, что это мог быть обычный вопрос, но было очень трудно найти ответ. Я пытался искать здесь и на других форумах без удачи.

Я пишу программу на C # (.net версии 4) для мониторинга процесса. Это уже вызывает событие, когда процесс начинается и когда он останавливается, но мне также нужно проверить, откуда этот процесс читает и записывает; специально для записи, поскольку я знаю, что этот процесс записывает большое количество данных при каждом запуске. Мы обрабатываем пакеты данных, и путь, по которому процесс записывает данные, содержит идентификатор партии, который является важной информацией для регистрации результатов процесса.

Я изучил метод System.Diagnostics.Process.BeginOutputReadLine, но поскольку в документации сказано, что StandardOutput должен быть перенаправлен, я не уверен, можно ли это сделать в процессе, который выполняется в данный момент, или если он влияет на операцию записи, изначально предназначенную для процесса.

Это консольное приложение на C #. Если у кого-то есть идеи о том, как это сделать, это будет высоко ценится.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

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

Самый простой способ сделать это - избежать обратного инжиниринга этой информации и установить некоторый контроль над тем, куда записывает процессего данные (например, передать ему параметр командной строки, чтобы указать выходной путь, и вы можете самостоятельно контролировать этот выходной путь).

Если по какой-то причине это невозможно, вы можете рассмотреть эти подходы, все из которыхдостаточно продвинуты и имеют различные недостатки:

  • Используйте Обходы , чтобы запустить процесс и перенаправить вызовы к CreateFile для функции, которую вы определяете (например, вы могли бывызовите какую-то другую функцию, чтобы отследить имя файла, который он использовал, а затем вызвать реальный CreateFile).Обратите внимание, что лицензия на использование Detours стоит денег и требует от вас создания неуправляемой библиотеки DLL для определения функции замены.
  • Считывание данных от Microsoft-Windows-Kernel-File поставщика трассировки событий.Этот провайдер отслеживает все файловые операции для всего в системе.Использование этих данных требует дополнительных знаний ETW и большого количества вызовов P / Invoke, если вы пытаетесь использовать их из C #.
  • Перечислять открытые дескрипторы процесса после его запуска. предыдущий вопрос stackoverflow.com имеет несколько возможных решений.Обратите внимание, что это не является надежной защитой, поскольку дает вам только моментальный снимок действия в определенный момент времени (например, процесс может слишком быстро открывать и закрывать дескрипторы, чтобы вы могли наблюдать его между вызовами, чтобы перечислять их), и большинство из этих ответов требуют вызовав недокументированные функции.
0 голосов
/ 08 ноября 2011

Я недавно сталкивался с этой реализацией: DetectOpenFiles , но я не использовал и / или не тестировал ее. Не стесняйтесь попробовать это. Кажется, он предоставляет информацию о дескрипторе открытого файла для данного идентификатора процесса. Будем рады прочитать ваш опыт с ним! ; -)

...