如何创建可以访问文件路径与磁盘相同的虚拟文件系统

Posted

技术标签:

【中文标题】如何创建可以访问文件路径与磁盘相同的虚拟文件系统【英文标题】:How to create virtual file system that file path can be accessed same as disk 【发布时间】:2012-06-07 13:56:52 【问题描述】:

我需要在内存或磁盘上创建 FileSystem 类型的东西,可以像磁盘上的文件一样访问它,哪个路径可以在 fopen() 等函数中使用。

详情: 我正在使用 AddFontResourceEx 函数在应用程序中加载字体。由于此功能需要文件路径,因此文件需要存在于磁盘上。但我要求用户不能访问/查看字体文件。

我尝试了 AddFontMemResourceEx 函数,但加载的字体不可枚举,因此用户无法在应用程序中看到字体。我还尝试了一些创建 VFS 的库,但它们像数据库一样工作,即您可以创建文件/目录并访问它们。但不能在 AddFontResourceEx 或任何其他函数中使用它们的文件路径。

是否有某种方法可以在内存或磁盘上创建一个可以通过我的应用程序访问的虚拟文件系统,并且我可以在创建的这个虚拟文件系统上写入/读取文件,并且 AddFontResourceEx 函数可以使用它的文件路径.

【问题讨论】:

开始关注en.wikipedia.org/wiki/Filesystem_in_Userspace 为什么不在临时文件中使用字体? 【参考方案1】:

它真的不能工作。是的,您可以添加“虚拟”文件系统。但它要么对用户 X 可见,要么不可见。 Windows 上的访问控制基于每个用户,而不是每个程序。因此,如果用户 X 可以在应用程序 A 中看到字体,那么他也可以在应用程序 B 中看到它——即使 B 是 Explorer.EXE。

【讨论】:

【参考方案2】:

如果用户是管理员,如果他们有足够的决心,您就无法真正阻止他们查看字体文件。例如,他们可以对您的程序进行逆向工程,以弄清楚您是如何生成文件的,并手动重复该过程以制作自己的副本。或者(即使您可以以某种方式将文件权限绑定到您的进程)他们可以将自己的代码插入到您的进程中以检索文件,或直接从内存中检索字体信息。

如果它足以让他们难以看到字体文件,你可以试试这个:

    在临时文件夹中创建一个目录,对当前用户有只写权限,对其他人没有权限。

    创建一个具有长、复杂、加密随机名称的子目录,并且对当前用户具有完全权限。 (每次名称应该不同。)

    将字体文件写入子目录并加载。

    删除字体文件并删除两个目录。

整个过程只需要几分之一秒,这会使用户难以覆盖权限并检索文件。如果他们使用调试器单步执行程序,那么我猜你运气不好,但正如我已经指出的那样,没有什么能阻止每个人。

据推测,另一种选择是只使用 AddFontMemResourceEx 并忍受字体不可枚举的事实。您只需要更改代码,以便在枚举字体的任何位置手动将您的字体添加到列表中。

【讨论】:

我试过你提到的,但问题是如果加载的字体是活动的,那么应用程序不允许删除字体。感谢您的回复。【参考方案3】:

如果你没有得到正确的答案,也许你没有问对问题

您的帖子标题提到了“虚拟文件系统”,但是。稍后,您提到“访问字体”。

“虚拟文件系统”是一个含糊不清的术语,有多种用法。

一种常见情况,意味着将设备或网络添加到操作系统

在您的情况下,似乎是从应用程序访问。

有几种方法(“库”)可以模拟或使用文件系统。

其中一些独立于真实文件系统工作。您与他们一起工作,将数据保存在那些“虚拟”文件夹和文件中,并从真实和虚拟的文件夹和文件中复制数据。

其中一些作为扩展层在真实文件系统和编程文件系统之间工作。

示例:我使用了一个应用程序,该应用程序需要临时快速的 I.O。使用权。找到了一个库,当你想在真实文件系统中创建文件夹或保存文件时,它就完成了。

此外,我可以添加“虚拟驱动器”,它存储在内存中,但可以通过文件系统操作访问。应用程序完成后,“硬盘驱动器”及其数据将从内存中删除。

看来你的情况和我的例子差不多。

你想要一个“虚拟文件系统”库来做什么?

我在网上看到了几个库,用于 C++、开源、免费软件和商业。

这取决于你想做什么,找出哪个库更适合你的情况。

祝你好运

【讨论】:

如问题中所述,AddFontResourceEx 需要文件路径作为其参数之一。所以我只想保护字体文件不受用户的影响。要么使用一些复杂的东西,比如 VFS,要么加密。如果您对此有任何想法,请分享。感谢回复

以上是关于如何创建可以访问文件路径与磁盘相同的虚拟文件系统的主要内容,如果未能解决你的问题,请参考以下文章

反向代理技术

如何把本机的东西磁盘映射到虚拟机中

如何打开hyper-v虚拟机磁盘

如何将Windows中文件拷贝到装在虚拟机上的Linux系统中?

挂载怎么理解

虚拟机配置与系统安装