如何用C#拦截Win32 API调用?

时间:2014-05-19 00:58:50

标签: c# c++ winapi intercept easyhook

我想要托管虚拟驱动器并拦截I / O,或拦截对硬盘驱动器上某些文件夹的I / O调用,并对该调用执行任意操作,例如将文件写入第二个位置。例如,如果Notepad.exe将文件写入C:\ Data \ test.txt - 我希望能够访问该文件名以及该文件的数据。同样,当任何用户尝试读取C:\ Data \ test.txt或尝试获取C:\ Data的目录列表时,我想运行任意代码。

理想情况下,我希望有一个处理程序,用于何时创建,更新,删除或打开文件 - 以及当某人执行目录列表时(从命令行或从命令行管理程序)。

我可以使用FileSystemWatcher执行写入部分 - 但是我无法拦截磁盘"读取"。所以,我接下来研究了MS Detours和EasyHook。这不会真正起作用,因为我需要监视计算机上的每个进程并在所有进程上挂起OpenFile。我不想使用Shell扩展,因为这种行为也需要在命令行中存在。因此,要么编写文件系统MiniFilter驱动程序 - 要么用C ++编写我自己的可安装文件系统。

我可以在C ++中使用它的一部分 - 虽然驱动程序的东西有点过头,但最终大部分代码应该在C#中,理想情况下。

是否有一些直接的方法来拦截特定文件夹或虚拟驱动器的I / O?如果答案是使用EasyHook或MiniFilter,有没有人有任何样品?特别是EasyHook只有2000年代后期的样品,从那时起API就发生了变化。谢谢!

1 个答案:

答案 0 :(得分:1)

看起来像XY问题。你似乎想要的是重新分析点处理程序。

您的示例"将文件写入其他位置"只是一个链接,那些已经存在。由标准重新分析点处理程序实现。

您没有准确指定您想要做的其他事情,但自定义重新分析点处理程序可以完成类似的事情。简而言之,重新分析点是代替文件的一小部分数据,其中(1)指定应该调用哪个处理程序,以及(2)向该处理程序提供自定义数据。例如,文件的实际位置。由于它是自定义数据,您可以使用任何您喜欢的格式。