У меня есть небольшое приложение командной строки, написанное на C, которое действует как оболочка/пусковая установка для других программ (например, xargs). Приложение написано для компиляции на FreeBSD/Linux (через fork()/exec()) и Windows (CreateProcess()). В дополнение к возможности перехватывать, внедрять или иным образом манипулировать аргументами командной строки для дочернего приложения, мне было интересно, есть ли простой способ перехватить активность файловой системы дочерней программы (или ее дочерних элементов и т. д.). Меня в основном интересуют только имена файлов, доступные для чтения или записи, но не содержимое указанных файлов, и я хотел бы, чтобы перехват был как можно более легким.
При поиске в Google некоторых релевантных ключевых слов, приведенных выше, кажется, что в Win32 есть много способов сделать это. От драйверов фильтров файловой системы до подделки заголовков таблицы импорта PE. Ни один из них не кажется тривиальным или чем-то, что я мог бы содержать в исполняемом файле моей программы-оболочки (например, для большинства из них потребуются дополнительные библиотеки DLL или файлы драйверов вместе с основным исполняемым файлом). Кроме того, я хотел бы, чтобы это работало на Windows XP через 7, если это возможно , без необходимости обхода UAC или других дельт платформы. Это мой дочерний процесс, поэтому я полагаю, что смогу безопасно отслеживать его активность :)
В Linux есть функция inotify(), но она отслеживает общий доступ к файловой системе без учета ТОЛЬКО моих дочерних процессов. То же самое относится и к kqueue() FreeBSD. Они также не работают в случаях SMP, когда несколько экземпляров оболочки могут запускать разные программы, и каждый из них должен различать действия своей дочерней файловой системы друг от друга.
Я, безусловно, был бы признателен за любые предложения, которые может предложить сообщество SO.