c# - 如何使用 C# 拦截 Win32 API 调用?

标签 c# c++ winapi intercept easyhook

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

理想情况下,我希望有一个处理文件的时间:创建、更新、删除或打开 - 以及何时有人执行目录列表(从命令行或 Shell)。

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

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

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

最佳答案

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

你的“将文件写入另一个位置”的例子只是一个链接,那些已经存在了。由标准重分析点处理程序实现。

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

关于c# - 如何使用 C# 拦截 Win32 API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728385/

相关文章:

c# - Entity Framework : How to enable cascade delete on one way related entities

c# - Xamarin C# Android : Reading a Blob from SQLite

c++ - 使用 const 参数的函数重载

c++ - UAC,需要管理员和文件访问

c# - Nancy 文档中描述的表单例份验证是否容易受到 session 劫持?

c# - 持久函数 : How to pass a parameter to the Orchestrator?

c++ - 从其他不相关的类中使用 C++ Log 类

c++ - 为什么当我提交了两个commandbuffer 时,只有一个commandbuffer 被执行了?

windows - 如何显示 "create shortcut"对话框?

winapi - 没有代理/ stub DLL 的进程外 COM 服务器?