Отслеживание процесса, который открыл определенный файл - PullRequest
3 голосов
/ 24 октября 2008

Из режима ядра в Windows я могу перехватывать и отслеживать практически все действия, выполняемые на конкретном диске. Когда файл открывается для любой цели, я получаю событие.

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

Я использую стандартные функции управления файлами в Windows Win32 API.

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

/ Robert

Ответы [ 4 ]

3 голосов
/ 24 октября 2008

Sysinternals Filemon (бесплатно) делает это, и еще лучше они описывают, как они это сделали:

Для драйвера Windows 9x сердце FileMon находится в виртуальном устройстве драйвер, Filevxd.vxd. Динамически загружен, и в его инициализации он устанавливает фильтр файловой системы через VxD сервис, IFSMGR_InstallFileSystemApiHook, чтобы вставить себя в цепочку вызовов все запросы файловой системы. На винде NT сердцем FileMon является файл системный драйвер, который создает и прикрепляет объекты устройства фильтра к целевые объекты устройства файловой системы так что FileMon увидит все IRP и FastIO запросы направлены на диски. Когда FileMon видит открытие, создать или закрыть вызов, он обновляет внутренний хеш-таблица, которая служит отображением между внутренними файловыми дескрипторами и файлом имена путей. Всякий раз, когда он видит звонки которые основаны на ручке, он ищет обрабатывать в хэш-таблице, чтобы получить полное имя для отображения. Если доступ на основе дескриптора ссылается на файл открыт до запуска FileMon, FileMon не сможет найти отображение в его хеш-таблица и просто представит значение дескриптора вместо.

-Adam

1 голос
/ 24 октября 2008

Sysinternals проделали такую ​​хорошую работу, объяснив это, что некоторый исходный код старой версии все еще доступен, например, здесь , и код хорошо документирован (imho). Это также может быть хорошим началом.

0 голосов
/ 24 октября 2008

Просто используйте Win32 N.API, чтобы получить pid из дескриптора файла. Это часто задаваемые вопросы на 15 лет ...

0 голосов
/ 24 октября 2008

Я бы использовал приложение "handle.exe" от Sysinternals.

Или вы действительно пытаетесь сделать это программно?

...