Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建虚拟文件?_C++_Windows_Winapi_Named Pipes - Fatal编程技术网

C++ 如何创建虚拟文件?

C++ 如何创建虚拟文件?,c++,windows,winapi,named-pipes,C++,Windows,Winapi,Named Pipes,我想模拟一个文件而不把它写在磁盘上。我在可执行文件的末尾有一个文件,我想给出它到dll的路径。当然,因为它没有真正的路径,我不得不假装它 我首先尝试在Windows下使用命名管道来完成这项工作。这将允许像\\.\pipe\mymemoryfile这样的路径,但我无法使其工作,而且我不确定dll是否支持这样的路径 其次,我找到了CreateFileMapping和GetMappedFileName。它们可以用来模拟另一个文件片段中的文件吗?我不确定这个API是做什么的 我想做的似乎和boxedap

我想模拟一个文件而不把它写在磁盘上。我在可执行文件的末尾有一个文件,我想给出它到dll的路径。当然,因为它没有真正的路径,我不得不假装它

我首先尝试在Windows下使用命名管道来完成这项工作。这将允许像\\.\pipe\mymemoryfile这样的路径,但我无法使其工作,而且我不确定dll是否支持这样的路径

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

我想做的似乎和boxedapp相似。他们是怎么做的?我想这有点像API拦截(比如绕道),但这需要做很多工作。还有别的办法吗

为什么??我对这个特定的解决方案感兴趣,因为我想隐藏数据,为了只分发一个文件的好处,也为了让它以这种方式工作的古怪原因;)
我同意将数据复制到临时文件会很有效,而且是一个更简单的解决方案。

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

如果你追求类似文件的行为,你最好的选择就是使用文件。在Windows下,您可以将
FILE\u ATTRIBUTE\u TEMPORARY
传递给,作为系统的提示,以避免在内存充足时将数据刷新到磁盘

如果您担心写入磁盘会影响性能,那么在大多数情况下,以上内容足以避免性能影响。(如果系统内存不足,无法将文件数据强制输出到磁盘,那么它很可能也会进行大量交换——您已经遇到了性能问题。)


如果您试图避免由于其他原因写入磁盘,您能解释一下原因吗?一般来说,很难阻止数据访问磁盘——例如,用户总是可以休眠计算机。

由于您无法控制DLL,因此必须假设DLL需要实际文件。它可能在某个时候做出了这样的假设,这就是为什么命名管道在您身上失败的原因

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

你为什么要将这个“伪文件”嵌入到EXE文件的末尾,而不是仅仅将其与我们的应用程序一起分发?很明显,您已经将这个第三方DLL与您的应用程序一起分发,所以再添加一个文件似乎不会对您造成伤害

另一个问题,这些数据会发生变化吗?也就是说,您是否希望将此“伪文件”中的数据写回EXE?我认为那不管用。标准用户可能没有对EXE的写入权限,这可能会导致反病毒的疯狂

而且没有CreateFileMapping和GetMappedFileName肯定不会工作,因为它们不会给您一个可以传递给CreateFile的文件名。如果你能让这个DLL接受一个句柄,那就行了


我甚至都不会为API拦截而烦恼。只要给DLL一个指向实际文件的路径。

阅读你的问题让我想到:如果你可以假设某个内存区域是一个文件,并且有一种指向它的“虚拟路径”,那么这将允许直接从内存加载DLL,而这正是
加载库
通过要求路径名设计所禁止的。这就是为什么人们在想要实现这一目标时编写自己的PE加载器

我想说的是,使用文件映射无法实现您想要的:文件映射的目的是将文件的一部分视为物理内存,而您想要的是相反的


使用迂回意味着您必须复制截获的DLL函数所做的一切,除了从真实文件获取数据之外;因此它不是通用的。或者,更复杂的是,让我们假设DLL使用
fopen
;然后提供自己的
fopen
,检测路径中的特殊模式,并对C运行时内部进行MIMIC。。。嗯,这真的值得所有的痛苦吗D

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

好吧,如果你需要在exe中分配虚拟文件,你需要创建一个足够大的向量、流或字符数组来容纳你想要写入的所有虚拟数据

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

如果您需要保持类似文件的路径语法,只需编写一个模仿该行为的类,而不是写入文件并写入内存缓冲区。就这么简单。记住吻


干杯

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

如果您真的必须提供“虚拟文件”,最干净的解决方案可能是文件系统过滤器驱动程序。“干净”并不意味着“好”——过滤器是一个完整的文档化和受支持的解决方案,因此它比API挂钩、注入等更干净。然而,文件系统过滤器并不容易


是查找Windows文件系统信息的最佳位置。邮件列表是文件系统开发人员常去的地方。

您可以将数据存储在NTFS流中。这样,您就可以得到一个指向数据的真实路径,该路径可以以

x:\myfile.exe:mystreamname
它的工作原理与普通文件完全相同,但是它仅在使用的文件系统是NTFS时工作。这是当今Windows下的标准配置,但如果您想支持较旧的系统或希望能够从usb st运行此配置,则当然不是一个选项