2017-04-17 67 views
0

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

我设想的设置看起来像是,你可以配置它将某个文件夹表示为“特殊”,并且该额外功能仅适用于该文件夹的内容(因此它不需要在磁盘范围内)。它可以通过一个新的驱动器盘符或与源文件夹平行的路径访问;它被连接到的位置与我无关。

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

也许现在已经有了现成的解决方案?我做了广泛的谷歌搜索,但空手出来。但后来我不知道我已经知道所有关键字做一个好的搜索......

当我自己编码的东西,我认为可能需要一个微过滤器驱动程序拦截ReadFile调用,但它必须在那从内核空间现场运行usermode应用程序 - 我假设这不是幸福的婚姻。或者使用允许用户模式部件的现有文件系统驱动程序框架,但是我发现现有解决方案的价格对于我的口味来说太陡(数千美元)。 而且我还假设标准文件系统(minifilter)驱动程序可能需要为这些文件返回一致的文件大小,虽然通过ReadFile返回的实际数据大小在每次调用中当然不同。更不用说否定任何发生的缓冲。总而言之,我认为一个自己动手的解决方案需要付出很大的努力,特别是当你从未在你的生活中完成Windows驱动程序的开发时。虽然我觉得自己很有能力学习它,但投入的时间将会我认为是令人望而却步的。

另一种方法可能是将ReadFile调用与执行ReadFile的进程挂钩 - 通过IAT挂钩或通过代码注入。但是我希望这个解决方案能更好地开箱即用,即所有对这些特殊文件的ReadFile请求都会触发正确的行为,而不管源是什么。在我的情况下,我需要拦截我的C++编译器(G ++)行为,但是那个是由IDE即时调用的,所以我看不到任何简单的方法来检测它的启动,并在它执行ReadFiles之前快速挂接它。另外,我只想要某些文件在这方面是特殊的;截取某个进程的所有ReadFiles是矫枉过正的。

+0

@downvoter:想详细说明downvote?我知道,对于知情人士来说,这看起来有点像一个微不足道的,明显的,不相干的或愚蠢的问题,但我目前缺乏这种更深入的理解。这篇文章对我(或者其他人)来说更多的是从中学习,而不是导致真正的解决方案(如果它存在的话)。 –

回答

2

你想要类似FUSE(我曾多次使用它),但对于Windows。显然有Dokan,我从来没有使用它,但似乎是足够知名(至少,可以用来作为一个灵感来看看“如何完成”)。

+1

谢谢!在深入了解它之后,似乎使用了MinGW(我也使用它)。它也需要很多的开发麻烦,并允许用户模式代码运行。现在是时候弄清楚这对我的使用案例来说是否完全过度使用,但它看起来像一个有趣的项目! –

相关问题