Windows:将 ReadFile 重定向到 运行 进程并将其通过管道传输到标准输出

Windows: redirect ReadFile to run process and pipe it's stdout

我想知道在 Windows 下创建一个设置有多难,其中某些文件上的常规 ReadFile 被文件系统重定向到实际 运行(例如 ShellExecute)这些文件,然后新进程的 stdout 被用作文件内容流出到对被调用者的 ReadFile 调用...

我设想的设置是,您可以将其配置为将某个文件夹表示为 'special',然后此额外功能仅在该文件夹的内容上可用(因此它不需要是磁盘范围的)。它可能可以在新的驱动器号或与源文件夹平行的路径下访问;它所连接的位置与我无关。

对于那些想知道这是否是经典 xy 问题的人:很可能是 ;) 只是这个想法引起了我的兴趣,我想知道有哪些可能性。在我的特殊情况下,我想将它用于我的 C++ 代码库中的#include 内容,其中包含的实际内容是当场构成的,在每个编译轮次中都不同。我当然也可以创建一个脚本来创建要包含的此类内容,将其称为预构建步骤并将其保留在那里,但为什么要选择简单的方法。

也许已经有现成的解决方案了?我进行了广泛的 Google 搜索,但一无所获。但是我不确定我是否已经知道所有涉及的关键字来进行良好的搜索...

当我自己编写代码时,我认为可能需要一个 minifilter 驱动程序来拦截 ReadFile 调用,但它必须在那个地方 运行 来自内核的用户模式应用程序 space - 不是幸福的婚姻我认为。或者使用允许用户模式部分的现有文件系统驱动程序框架,但我发现现有解决方案的价格对我来说太贵了(几千美元)。 而且我还假设可能需要标准文件系统(微过滤器)驱动程序 return 此类文件的文件大小一致,尽管通过 ReadFile return 编辑的实际数据大小当然会在每次调用时有所不同.更不用说否定发生的任何缓冲。 总而言之,我认为自己创建解决方案需要付出相当多的努力,尤其是当您一生中从未进行过 Windows 驱动程序开发时 :) 虽然我认为自己有能力学习它,但我认为投入的时间会让人望而却步。

另一种方法可能是通过 IAT 挂钩或通过代码注入挂钩来自执行 ReadFile 的进程的 ReadFile 调用。但我希望此解决方案能够完成更多工作 'out-of-the-box',即对这些特殊文件的所有 ReadFile 请求都会触发正确的行为,而不管来源如何。在我的例子中,我需要拦截我的 C++ 编译器 (G++) 行为,但那个是被 IDE 动态调用的,所以我认为没有简单的方法来检测它的启动并在它之前快速连接它它是 ReadFiles 吗?此外,我只希望某些文件在这方面是特殊的;拦截某个进程的所有 ReadFiles 是多余的。

你想要像 FUSE (which I used with profit many times), but for Windows. Apparently there's Dokan 这样的东西,我从来没有用过它,但似乎已经足够知名(而且,至少,可以作为看到 "how it's done" 的灵​​感)。