资讯动态

如何在 Windows 用户态快速创建自定义文件系统?WinFsp 完整上手指南

发布时间:2026/8/14 9:35:52 来源:尧图企业网站定制
如何在 Windows 用户态快速创建自定义文件系统WinFsp 完整上手指南【免费下载链接】winfspWindows File System Proxy - FUSE for Windows项目地址: https://gitcode.com/gh_mirrors/wi/winfspWinFspWindows File System Proxy是 Windows 平台上的 FUSE 实现它把写一个文件系统从令人望而生畏的内核驱动开发变成了一件普通程序员也能胜任的用户态应用开发。本文将从零开始带你完成安装、挂载内存盘、手写文件系统回调、读懂性能数据的完整流程全程基于项目真实代码与命令。1. 先回答一个问题为什么要在 Windows 上造文件系统在 Windows 上做一个自定义文件系统传统路径是这样的写一个内核模式驱动Kernel Mode Driver自己处理 IRP、对象管理器、分页 I/O……任何一个小失误都可能带来蓝屏调试还要挂上内核调试器。这正是无数团队对自定义文件系统敬而远之的原因。WinFsp 把这个门槛整个拆掉了。它的思路和 Linux 上的 FUSEFilesystem in Userspace一脉相承文件系统 一份操作契约 一个普通程序。你不需要碰内核只需在用户态实现打开、读取、写入、枚举等回调函数剩下的一切交给 WinFsp 代理。有了它很多疯狂的想法都变得可行把云盘变成本地盘符、把压缩包当目录浏览、给数据加一层透明加密、把远程服务器挂成本地驱动器……任何能被文件这种形态承载的数据都可以用 WinFsp 组织成一个 Windows 驱动器让所有应用通过标准 Windows 文件 API 直接访问。2. 两分钟快速上手先挂一个内存盘体验一下不要急着写代码先感受一下用户态文件系统用起来是什么体验。第一步安装。从仓库克隆或直接下载安装包git clone https://gitcode.com/gh_mirrors/wi/winfsp安装时务必勾选Developer选项它会把示例文件系统MEMFS、头文件和库文件一并装好。第二步挂载内存盘。MEMFS 是随项目自带的内存文件系统所有数据都存在 RAM 里。用一条命令就能把它挂成网络驱动器net use X: \\memfs64\test第三步像用普通磁盘一样使用它X: echo hello world hello.txt dir type hello.txt你会在X:盘上看到真实的文件创建、列目录、读取结果而这个磁盘完全运行在用户态进程里没有任何真实存储介质。挂载完成后还能通过 Windows 资源管理器直接浏览体验与本地磁盘无异一句话总结net use到dir之间你其实已经跑通了用户态文件系统的完整链路。3. 拆开看看一次文件打开请求的完整旅程上手之后我们该理解它内部到底发生了什么。WinFsp 由两个核心部分组成内核模式文件系统驱动FSD位于 src/sys/负责与 Windows 内核对话把自己注册成一个正经的文件系统驱动用户模式 DLL位于 src/dll/封装出一套开发者友好的 API并把内核请求转交给你的回调函数。当某个应用调用CreateFile打开文件时请求会这样流转应用发起文件 API 调用操作系统将其打包成一个 IRPI/O 请求包IRP 被路由到 WinFsp 的内核 FSDFSD 把请求通过高速 IPC 通道转发给用户态文件系统进程你的程序收到一个Open回调处理完毕后返回结果结果沿原路返回应用一次文件操作完成。整个往返在你的文件系统进程内部只表现为一次次普普通通的函数调用。这就像开了一家餐厅厨房FSD负责接单而你——用户态文件系统——是后厨里真正做菜的那位厨师只需按菜单接口定义出菜即可。WinFsp 还提供了一套名为Queued Events的底层同步原语负责把多个待处理的请求高效排队、批量分发给用户态进程这正是它性能出色的关键之一设计文档见 doc/Queued-Events.asciidoc状态转换图见 doc/Queued-Events/states.png。4. 亲手写第一个文件系统30 行骨架就能跑理解了机制我们来动手。WinFsp 自带的教程doc/WinFsp-Tutorial.asciidoc会带你构建一个名为passthrough的文件系统——它把所有请求原样转发给底层 NTFS。完整实现就在 tst/passthrough/passthrough.c这里先看它的最小骨架#include winfsp/winfsp.h #define PROGNAME passthrough static NTSTATUS SvcStart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) { // 在这里创建文件系统、注册回调、启动分发器 return STATUS_NOT_IMPLEMENTED; } static NTSTATUS SvcStop(FSP_SERVICE *Service) { // 在这里停止分发器、销毁文件系统 return STATUS_NOT_IMPLEMENTED; } int wmain(int argc, wchar_t **argv) { return FspServiceRun(L PROGNAME, SvcStart, SvcStop, 0); }这段代码揭示了 WinFsp 一个非常优雅的设计一个文件系统天生就是三种运行形态——可以作为控制台程序直接运行可以作为 Windows 服务注册也可以作为由 WinFsp.Launcher 托管的子服务运行这正是net use挂载背后用的机制。下一步是在 Visual Studio 中配置附加包含目录$(MSBuildProgramFiles32)\WinFsp\inc附加依赖项$(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib将 WinFsp DLL 设为延迟加载并在wmain开头调用FspLoad(0)避免 DLL 路径问题真正的文件系统逻辑则是填充一个FSP_FILE_SYSTEM_INTERFACE接口结构——注册GetVolumeInfo、Create、Open、Read、Write、ReadDirectory等回调。参考 tst/memfs/memfs.cpp 可以看到一个完整内存文件系统如何实现这些接口想要更丰富的示例tst/ 下还有ntptfs、passthrough-fuse、memfs-fuse、notifyfs等多个成品。5. 不止能跑WinFsp 的 5 个实用亮点5.1 一套框架四种 API原生 WinFsp APIinc/winfsp/功能最完整适合 Windows 专属项目FUSE API for Windowsinc/fuse/为 Linux 上的 FUSE 文件系统提供迁移路径FUSE API for Cygwinopt/cygfuse/服务 Cygwin 生态.NET APIsrc/dotnet/托管代码也能开发文件系统。5.2 Windows 特性全支持备用数据流ADS、任意安全描述符SDDL、重解析点、命名流、扩展属性、大小写敏感……这些 Windows 原生文件系统该有的能力MEMFS 示例里都用条件编译开关逐一展示了见 tst/memfs/memfs.cpp 顶部的MEMFS_NAMED_STREAMS、MEMFS_REPARSE_POINTS、MEMFS_EA等宏。5.3 Shell 与服务深度集成通过服务架构doc/WinFsp-Service-Architecture.asciidoc文件系统可以注册为真正的 Windows 服务并支持资源管理器的映射网络驱动器功能一键挂载用户几乎感受不到它和真实磁盘的区别。5.4 广泛平台覆盖支持 Windows 7 到 Windows 11覆盖 x86、x64、ARM64 三种架构且不依赖任何外部组件是真正意义上的自包含软件。5.5 完备的调试与测试体系调试可以这样开日志FspDebugLogSetHandle(GetStdHandle(STD_ERROR_HANDLE));测试方面tst/winfsp-tests/ 提供了覆盖创建、读写、目录、安全、重解析点、通知等几乎全部特性的自动化测试配合 doc/WinFsp-Testing.asciidoc 描述的测试策略保证了长期无已知内核崩溃的高稳定性。6. 性能到底行不行看官方实测数据用户态文件系统常被质疑慢。WinFsp 用数据回应了这一点。项目对三个文件系统做了对比测试NTFS磁盘基准、MEMFS内存文件系统、NTPTFS穿透到底层 NTFS 的透传文件系统结果非常有意思。两个关键结论MEMFS 在大多数文件操作上快于 NTFS——内存文件系统快于磁盘文件系统并不意外但它证明了 WinFsp 本身几乎没有额外开销缓存 I/O 场景下 MEMFS 和 NTPTFS 双双超越 NTFS——这点出乎意料尤其 NTPTFS 还跑在 NTFS 之上。性能优势从哪来主要靠三点高效的用户态/内核态 IPC多个请求可在一次上下文切换中批量处理、精心设计的 Queued Events 同步原语以及对异步 I/O 的完整支持。完整测试方法、测试数据和可复现脚本见 doc/WinFsp-Performance-Testing.asciidoc。7. 常见问题与避坑清单找不到 WinFsp DLL官方刻意不把 DLL 装进系统目录务必使用延迟加载 FspLoad(0)的方案。挂载点选哪种盘符X:、UNC 前缀\\memfs64\test还是空目录取决于使用场景要能被映射网络驱动器调用需配合 Launcher。32 位与 64 位注意链接对应的winfsp-x86.lib/winfsp-x64.lib见 opt/fsext/别让位数不匹配。性能测试要严谨官方测试在空闲机器上运行、每次测试前清空系统缓存、每个场景重复多轮取最小值——想得到可信对比数据这些细节一个都不能省。文件系统进程不能卡住它服务于系统级请求初始化后不应阻塞等待用户输入这也是为什么建议做成控制台程序或服务。8. 总结下一步该看什么WinFsp 把 Windows 文件系统开发从内核专家的专利变成了普通开发者的日常。它提供了与 Linux FUSE 对等的开发体验却保留了完整的 Windows 原生特性与极高的性能上限这也是 SSHFS-Win、rclone 等知名项目选择它的原因。如果你准备开始自己的第一个文件系统推荐这条学习路径通读 doc/WinFsp-Tutorial.asciidoc 完成 passthrough 教程精读 tst/memfs/memfs.cpp理解内存文件系统的完整实现阅读 doc/WinFsp-Design.asciidoc 与 doc/WinFsp-as-an-IPC-Mechanism.asciidoc搞懂设计与 IPC 细节跑一遍 doc/WinFsp-Performance-Testing.asciidoc 的测试脚本亲手验证性能。现在是时候用 WinFsp 把你那个把某某变成盘符的想法变成现实了。【免费下载链接】winfspWindows File System Proxy - FUSE for Windows项目地址: https://gitcode.com/gh_mirrors/wi/winfsp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价