Поймайте вызовы функций времени выполнения C с помощью Sysinternals.ProcMon

Есть ли способ поймать _stat() функции времени выполнения C в ProcMon


person Chesnokov Yuriy    schedule 11.08.2011    source источник


Ответы (2)


Не напрямую, потому что (как объяснил @Preet Sangha) он работает ниже уровня CRT. Однако он показывает стек вызовов, и _stat обращается к файлу. Поэтому, если ProcMon имеет доступ к вашим исполняемым символам и вы знаете, какой файл смотреть, вы можете увидеть _stat в стеке вызовов доступа к этому файлу.

Если этого недостаточно, опишите свой сценарий дальше.

Обратите внимание, что есть инструменты для подключения на уровне кода - см. Как я могу перехватить функции Windows в C / C ++?

person eran    schedule 11.08.2011
comment
спасибо, я использую _stat, чтобы проверить, присутствует ли каталог. Полагаю, я могу фильтровать доступ по имени каталога? - person Chesnokov Yuriy; 11.08.2011
comment
@ Чесноков, конечно. В окне фильтра Path = ›contains =› the_dir_name - person eran; 11.08.2011
comment
@Chesnokov, у меня работает. Есть ли в списке фильтра строка, которая выглядит так, как будто Путь содержит dir_name include? Обратите внимание, что dir_name может быть только последним подкаталогом, а не полным путем. Кроме того, попробуйте получить доступ к этому каталогу, используя, скажем, браузер (что я только что сделал). Если вы ничего не видите, фильтр установлен неправильно. Если вы видите доступ, возможно, код в конце концов не обращается к этому каталогу. В этом случае попробуйте отслеживать всю активность процесса FileSys, если она не слишком велика, и добавьте фильтры на основе результатов. - person eran; 11.08.2011
comment
спасибо за вашу любезную помощь, добавление только последнего имени каталога, которое должно содержаться в пути, хорошо работает с проводником Windows. Я уверен, что код должен получить доступ к этой папке с _stat, поскольку переданный параметр папки жестко запрограммирован. Проблема в том, что это процесс IIS (w3wp.exe), и он вызывает родную dll с помощью взаимодействия. Собственная dll вызывает _stat, чтобы проверить, присутствует ли конкретный каталог. Я не могу найти этот каталог в столбце "Путь" - person Chesnokov Yuriy; 11.08.2011
comment
@ Чесноков, вы уверены, что путь доступен для IIS? Если он находится на несуществующем диске, или на неправильном пути UNC, или на подключенном сетевом диске, который не сопоставлен с пользователем, под которым работает IIS, то ProcMon не поймает доступ к каталогу. - person eran; 12.08.2011
comment
@eran, да, путь находится на диске c: \, и я могу поймать все события файловой системы IIS в ProcMon. Логика в собственной dll такова: проверьте, доступен ли конкретный каталог на c: \ и на диске, если нет, то используйте '.' текущий путь для сохранения журнала ошибок. Таким образом, я улавливаю событие создания файла журнала в ProcMon, где '.' путь IIS на диске c:] - person Chesnokov Yuriy; 12.08.2011
comment
@Chesnokov, я полагаю, _stat() возвращает -1. Какая последняя ошибка, когда это происходит? Кроме того, если вы хотите проверить доступность, вы можете использовать _access - if (_access(dir, 2) == 0) WriteLogTo(dir);. Внутри он использует другую функцию Win32. Может быть, это расширит картину. - person eran; 12.08.2011
comment
@eran, нет права доступа к файловой системе W для собственной библиотеки dll, вызываемой из IIS, поэтому вы не можете создать файл в любом желаемом месте. Есть возможность создать его в APPDATA, но чтобы получить эту папку, вам нужно вызвать SHGetSpecialFolderPath, что также больше невозможно в w7 - person Chesnokov Yuriy; 12.08.2011
comment
@eran, я предполагаю, что буду использовать функции winapi для проверки наличия каталога и записи этого события в ProcMon - person Chesnokov Yuriy; 12.08.2011
comment
@Chesnokov, если у тебя нет прав на запись, как там вести логи? В любом случае, оба вызывают функции WinApi - _stat вызывает FindFirstFile, а _access вызывает GetFileAttributes IIRC. Но судя по тому, что вы сейчас говорите о IIS, вполне возможно, что проверка будет отклонена до того, как она попадет в реальный каталог, поэтому вы не увидите доступ к каталогу. Я понятия не имею, как реализованы эти функции Win32. Возможно, вы можете дать пользователю IIS разрешения для этого каталога и посмотреть, работает ли это. - person eran; 12.08.2011
comment
@eran, я веду журналы только из веб-приложения. Собственная dll используется для некоторых вычислений, беря файл из какой-то папки. Я нашел CreateFile событие только для _stat и GetFileAttributes - person Chesnokov Yuriy; 12.08.2011

ProcMon перехватывает вызовы на уровне окон (я думаю, в частности, вызовы NTxxxx и ZWxxxx). Они намного ниже, чем библиотека времени C runt, поэтому я подозреваю, что нет.

person Preet Sangha    schedule 11.08.2011
comment
спасибо за ответ, существуют ли мониторы функций времени выполнения C? - person Chesnokov Yuriy; 11.08.2011