如何创build一个虚拟文件?

我想模拟一个文件,而不写在磁盘上。 我有一个文件在我的可执行文件的末尾,我想给它的path一个DLL。 当然,因为它没有一个真正的path,我不得不伪造它。

我第一次尝试在Windows下使用命名pipe道来做到这一点。 这将允许像\\。\pipe\ mymemoryfile的path,但我不能让它的工作,我不知道该DLL会支持这样的path。

其次,我发现CreateFileMapping和GetMappedFileName。 他们可以用来模拟另一个片段中的文件吗? 我不确定这是什么这个API。

我想要做的似乎与boxedapp类似。 有关他们如何做的任何想法? 我想这是像API截取(像绕道),但这将是很多工作。 还有另一种方法吗?

为什么? 我对这个特定的解决scheme很感兴趣,因为我想隐藏这些数据,而且只是为了分发一个文件,但也是为了让这种方式成为可能);我同意将数据复制到一个临时文件是可行的并成为一个更容易的解决scheme。

Solutions Collecting From Web of "如何创build一个虚拟文件?"

您可以将数据存储在NTFS流中。 这样你可以得到一个真正的路径指向你的数据,你可以给你的DLL的形式

x:\myfile.exe:mystreamname 

这个工作原理与普通文件非常相似,但只有在使用的文件系统是NTFS的情况下才有效。 这是当今Windows下的标准,但是如果你想支持较老的系统,或者希望能够通过usb-stick或类似的方式运行,这当然不是一种选择。 请注意,如果文件作为邮件附件发送或仅从NTFS分区复制到FAT32分区,则文件中存在的任何流都将丢失。

我会说,最兼容的方式是将您的数据写入一个实际的文件,但你当然可以在NTFS系统和FAT系统上做到这一点。 由于增加了复杂性,我建议不要这样做。 正确的方法是当然分开你的文件,但是因为你已经指出你不想要这个,你应该在这种情况下把它写到一个临时文件,并给dll指向那个文件的路径。 确保将临时文件写入用户的临时目录(可以在C / C ++中使用GetTempPath找到路径)。

你的其他选择是编写一个文件系统过滤器驱动程序,但这是我强烈建议的一条道路。 这种方式也不利于使用单个文件的目的…

另外,如果你只想要一个文件分发,怎么样使用一个zip文件或安装程序?

管道用于同时运行的进程之间的通信。 它们不存储数据以供以后访问,并且它们不具有与文件相同的语义(例如,不能查找或倒回管道)。

如果你是在类似文件的行为之后,最好的办法就是使用一个文件。 在Windows下,您可以将FILE_ATTRIBUTE_TEMPORARY传递给CreateFile作为系统的提示,以避免在有足够的内存时将数据刷新到磁盘。

如果您担心写入磁盘的性能受到影响,上述内容应足以避免在大多数情况下的性能影响。 (如果系统在内存上足够低以迫使文件数据出现在磁盘上,则无论如何也可能会重复交换 – 您已经遇到了性能问题。)

如果您想避免因为其他原因写入磁盘,您能解释为什么吗? 一般来说,阻止数据到达磁盘是非常困难的 – 例如,用户总是可以休眠机器。

由于您无法控制DLL,因此您必须假定该DLL需要一个实际的文件。 它可能在某种程度上做出这个假设,这就是为什么命名管道失败。

最简单的解决方法是在临时目录中创建临时文件,将数据从EXE写入临时文件,然后删除临时文件。

是否有一个原因,你是在你的EXE的末尾嵌入这个“伪文件”,而不是将其与我们的应用程序分发? 你显然已经分发这个第三方DLL与你的应用程序,所以多一个文件似乎不会伤害你?

另外一个问题,这个数据会不会改变? 这是你期待在EXE中写回这个“伪文件”的数据吗? 我认为这不会奏效。 标准用户可能没有写权限的EXE,这可能会驱动防病毒的坚果。

而没有CreateFileMapping和GetMappedFileName绝对不会工作,因为他们不给你一个可以传递给CreateFile的文件名。 如果你能以某种方式得到这个DLL接受一个句柄,那么这将工作。

而且我也不会用API拦截。 只需将DLL移动到一个acutal文件的路径即可。

使用BoxedApp,不要担心。

读取你的问题让我想:如果你可以假装内存区域是一个文件,并有一种“虚拟路径”,那么这将允许直接从内存加载DLL,这是LoadLibrary禁止设计通过要求路径名称。 这就是为什么人们为了达到目的而自己写PE加载器的原因。

我会说你不能用文件映射来达到你想要的效果:文件映射的目的是把文件的一部分当作物理内存来处理,而你想要的是相互的。

使用Detours意味着你将不得不复制拦截的DLL函数所做的所有事情,除非从真实文件中获取数据; 因此它不是通用的。 或者,甚至更复杂,让我们假装DLL使用fopen ; 那么你提供了你自己的fopen ,在路径中检测到一个特殊的模式,并且你模拟了C运行时内部的东西……嗯真的值得所有的痛苦吗? :d

如何使用某种RamDisk并将文件写入此磁盘? 我自己尝试了一些ramdisks,虽然从来没有找到一个好的,告诉我,如果你是成功的。

那么,如果你需要在exe文件中分配虚拟文件,你将需要创建一个足够大的矢量,流或char数组来存放你想要写入的所有虚拟数据。

这是我能想到的唯一的解决方案,而不需要对磁盘进行任何I / O(即使你不写入文件)。

如果你需要保留一个类似于路径语法的文件,只需编写一个模仿该行为的类,而不是写入文件写入你的内存缓冲区。 它是如此简单。 记住KISS。

干杯

请解释为什么你不能从你的EXE中提取数据并将其写入临时文件。 许多应用程序都这样做 – 这是这个问题的经典解决方案。

如果你真的必须提供一个“虚拟文件”,最干净的解决方案可能是一个文件系统过滤器驱动程序。 “干净”并不意味着“好” – 过滤器是一个完整的文件和支持的解决方案,所以它比API挂钩,注入等清洁。但是,文件系统过滤器并不容易。

OSR Online是查找Windows文件系统信息的最佳位置。 NTFSD邮件列表是文件系统开发者所在的地方。

打开名为“NUL:”的文件进行写入。 它是可写的,但是数据却被无声地丢弃了。 有点像/ dev / null的* nix名声。

你不能记忆地图。 内存映射意味着读/写访问,NUL是只写的。

我猜这个DLL不能采取流? 它几乎要简单的问,但如果你可以使用它。

您是否在使用命名管道时尝试使用\?\前缀? 许多API支持使用\?\直接传递路径的其余部分,而不需要任何解析/修改。

http://msdn.microsoft.com/en-us/library/aa365247(VS.85,lightweight).aspx

为什么不把它作为一个资源添加 – http://msdn.microsoft.com/en-us/library/7k989cfy(VS.80).aspx – 您将添加一个图标的相同方式。