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