Как перехватить вызовы Win32 API с помощью C#?
Я хотел бы либо разместить виртуальный диск и перехватить ввод-вывод, либо перехватить вызовы ввода-вывода для определенных папок на жестком диске, и выполнить произвольные действия с этим вызовом, например записать файл во второе место. Например, если Notepad.exe записывает файл в C:\Data\test.txt - я хотел бы получить доступ к этому имени файла и данным этого файла. Кроме того, я хотел бы запустить произвольный код, когда любой пользователь пытается прочитать C: \ Data \ test.txt или пытается получить список каталогов для C:\Data.
В идеале я хочу иметь обработчик для случая, когда файл: создан, обновлен, удален или открыт - и когда кто-то делает листинг каталога (из командной строки или из командной консоли).
Я могу выполнить запись с помощью FileSystemWatcher, но не могу перехватить "чтение" диска. Итак, я затем посмотрел на MS Detours и EasyHook. Это не сработает, потому что мне нужно отслеживать каждый процесс на компьютере и подключаться к OpenFile на ВСЕХ из них. Я не хочу использовать Shell Extension, потому что это поведение должно существовать и из командной строки. Таким образом, это оставляет либо написание драйвера File System MiniFilter, либо написание моей собственной устанавливаемой файловой системы на C++.
У меня может быть какая-то часть этого в C++ - хотя драйверы немного над головой, но в конечном итоге большая часть кода должна быть на C#, в идеале.
Есть ли какой-нибудь простой способ перехватить ввод-вывод в определенную папку или виртуальный диск? Если ответ на EasyHook или MiniFilter, есть ли у кого-нибудь образцы? В частности, у EasyHook есть только образцы конца 2000-х, и с тех пор API изменился. Спасибо!
1 ответ
Похоже, проблема XY. То, что вы, похоже, хотите, это обработчики точек повторного анализа.
Ваш пример "записи файла в другое место" - это просто ссылка, и они уже существуют. Реализуется стандартным обработчиком точек повторной обработки.
Вы не указываете точно, что еще вы хотите сделать, но подобные вещи могут быть сделаны с помощью пользовательских обработчиков точек повторной обработки. Короче говоря, точка повторной обработки представляет собой небольшой бит данных вместо файла, который (1) указывает, какой обработчик должен быть вызван, и (2) предоставляет пользовательские данные этому обработчику. Например, фактическое местоположение файла. Так как это пользовательские данные, вы можете использовать любой формат, который вам нравится.