
WinFsp 文件系统开发完整指南零内核编程也能在 Windows 上造出虚拟磁盘【免费下载链接】winfspWindows File System Proxy - FUSE for Windows项目地址: https://gitcode.com/gh_mirrors/wi/winfspWinFspWindows File System Proxy也就是常说的 FUSE for Windows是一个开源文件系统代理框架它把在 Windows 上自建文件系统这件事的门槛从内核驱动开发直接拉低到普通应用程序开发。你只要会写 C、C、C#、Python 里的任意一种就能把云存储、数据库、压缩包甚至一块纯内存变成资源管理器里的真实盘符。下面这份指南会从原理讲到实战再带你绕过新手最容易踩的坑。先讲一个痛点做文件系统真的非要啃内核吗很多人在 Windows 上动过自己搞个文件系统的念头想把网盘挂成本地盘、想把数据库映射成目录、想给老游戏做个虚拟光驱……结果一查资料就懵了——传统方案要求写内核模式驱动程序要处理 IRP、锁、内存管理、安全上下文稍不留神就是蓝屏重装。这个学习曲线陡得劝退了绝大多数人最后只能放弃或者买现成方案。WinFsp 的出现本质上就是把这条陡坡铲平了。它替你扛下了所有内核层面的脏活让你把精力全部放在这个文件系统该提供什么内容上。WinFsp 是什么一个驱动加一个 DLL 的巧妙分工用一句话概括WinFsp 由两半组成一半住在内核里一半住在用户态。内核那半是一个文件系统驱动FSD负责把自己注册成 Windows 认可的文件系统处理所有系统级交互比如挂载盘符、响应文件请求、保证安全。用户态那半是一个 DLL它给开发者暴露一套干净的 API。当某个程序在资源管理器里双击文件、复制粘贴、读写数据时Windows 会把请求打包成 I/O 包发给 FSDFSD 再转发给你写的用户态程序你的程序处理完把结果原路送回。你可以把它理解成翻译官 代办员系统不认识你的数据但 WinFsp 认识系统也认识你。对系统来说它是个正经文件系统对你来说它只是个普通库。原生 C/C API、FUSE 2.8 接口、FUSE 3.2 接口、.NET 封装四种姿势任你选而且 Windows 7 到 Windows 11、x86/x64/ARM64 全平台覆盖。第一次亲密接触三步挂载一个内存文件系统空谈原理没意思先花五分钟跑一个真的。WinFsp 自带的 MEMFS 示例是一个活在内存里的文件系统用它感受一下挂载的整个过程。第一步安装 WinFsp安装界面里记得勾选 Developer 选项这样会带上头文件、库文件和 MEMFS 示例程序。第二步打开命令行把 MEMFS 挂到 X 盘net use X: \\memfs64\test第三步往里面写点东西再读出来echo hello world X:\hello.txt dir X:\ type X:\hello.txt看见没X 盘是真的能存能取数据其实躺在内存里重启就没了。用完记得net use X: /delete卸载。这一套命令跑通你就已经完成了一个文件系统的完整生命周期挂载、读写、卸载。MEMFS 的源码就在项目的tst/memfs/目录里随时可以翻出来对照着看。手把手实战从空项目到可运行的 passthrough 文件系统跑通示例之后下一步是自己动手写一个。官方教程doc/WinFsp-Tutorial.asciidoc带着你从零写一个 passthrough——它把 Windows 发来的文件操作原样转发给底层 NTFS是个绝佳的入门练手项目。流程分四步走。第一步Visual Studio 里新建一个 Win32 控制台应用选空项目。第二步配置两个路径C/C 附加包含目录填$(MSBuildProgramFiles32)\WinFsp\inc链接器附加依赖项填$(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib。第三步写入口代码。骨架其实短得惊人一个SvcStart回调负责初始化文件系统一个SvcStop回调负责收尾最后调用FspServiceRun把它跑起来。就这么几件事。第四步编译运行。成功的话你会看到服务启动、盘符出现然后就能在资源管理器里像普通磁盘一样操作了。这里有个细节值得记住你的文件系统是给整个操作系统提供服务的系统组件所以它应该是个控制台程序别弹 GUI、别阻塞等待输入。这样它既能直接前台运行也能注册成 Windows 服务或者交给 WinFsp 自带的 Launcher 来托管三种形态随你切换。把文件系统玩成 IPCWinFsp 的隐藏身份很多人没意识到WinFsp 底层其实是一套进程间通信IPC机制只是它的接口恰好长得跟文件操作一模一样。来感受一下一次普通的写入背后发生了什么你的程序调用WriteFile请求被打包发给内核里的 FSDFSD 通过事务机制转发给用户态的文件系统进程那边处理完再把结果传回来。请求方和实现方根本不认识对方全靠文件系统这座桥沟通。更有意思的是这套 IPC 同步异步都支持。同步模式下请求方必须等着处理结果返回异步模式下请求方可以先撤处理完成后结果再送回来项目文档doc/WinFsp-as-an-IPC-Mechanism.asciidoc里有详细的对比时序图。这意味着你不仅能拿它做文件系统还能把它当成一种文件即接口的通信方式——服务端暴露的每个文件、每个目录都是可以被另一个进程安全访问的数据通道。设计多进程架构时这是个非常规但很好用的思路。实测性能和 NTFS 同场竞技结果出乎意料担心用户态文件系统性能拉胯WinFsp 用数据说话。项目自带的性能测试doc/WinFsp-Performance-Testing.asciidoc把 MEMFS、NTPTFS 和原生 NTFS 放在同一批操作里对比柱状图越短越快NTFS 作为基准取值为 1.0。结果很提气内存文件系统在 create、open、overwrite 等操作上全面快过 NTFS比如 create 只花了 NTFS 大约三分之一的时间读写的场景里非缓存模式的 page 级读写也明显领先。也就是说在某些场景下 WinFsp 文件系统不仅能追平 NTFS甚至能反超。当然具体表现取决于你文件系统的实现质量但至少用户态就注定慢这个刻板印象可以丢掉了。绕开这些坑新手最容易踩的五个雷区踩坑是成长的必经之路但有些坑明明可以绕过去。下面是实战中出镜率最高的五个。雷区一Windows 7 提示驱动未签名。多半是系统缺 SHA-2 代码签名支持把系统更新打全就好。雷区二WinFsp 盘里的程序没法以管理员身份运行。Windows 对承载可执行文件的文件系统有文件名必须是 NTFS的执念启动 MEMFS 时加上-F NTFS参数即可解决。雷区三断开网络驱动器失败。如果机器上装了 Dokany它的 Network Provider 会来抢地盘。去系统设置里调整 Network Provider 顺序让 WinFsp 排在 Dokany 前面。雷区四运行时报找不到 DLL。WinFsp 刻意不往系统目录里塞 DLL这是有意的设计。正确做法是把 WinFsp DLL 标记为延迟加载再用FspLoad在进程启动时动态装载教程里有详细说明。雷区五想挂载到某个已有目录结果失败。Windows 的 NTFS 不允许在非空目录上创建挂载点重解析点这是平台限制不是 bug。要么挂载成独立盘符要么先确保目标目录为空。生态巡礼哪些知名项目在用 WinFsp判断一个框架靠不靠谱看它的用户名单就够了。WinFsp 的生态相当热闹sshfs-win让你在 Windows 上直接挂载 SSH 远程目录rclone把几十种云存储变成盘符Cryptomator在云端文件上做透明加密JuiceFS用 Redis 加 S3 拼出分布式 POSIX 文件系统还有 NFS for Windows、s3fs 等一大批方案全都跑在 WinFsp 上。语言绑定同样丰富Go 有 cgofuse、Python 有 winfspy、Rust 有 winfsp-rs、Java 有 jnr-fuse。换句话说你熟悉哪种语言就有对应的轮子可以借力完整清单在项目文档doc/Known-File-Systems.asciidoc里。写给最后的你三条路径与行动建议看完这篇指南你可以按自己的目标选一条路出发。只想赶紧用上现成方案那就直接装一个基于 WinFsp 的应用比如 sshfs-win 或 rclone当天就能把远程存储挂成本地盘。想认真学会这门手艺建议按这个顺序来先读doc/WinFsp-Tutorial.asciidoc走一遍 passthrough再啃doc/WinFsp-API-winfsp.h.md摸清 API 全貌然后去tst/目录里翻 memfs、passthrough、ntptfs 这些现成样例边读边改。遇到疑难杂症doc/Frequently-Asked-Questions.asciidoc里藏着不少答案。想深入内核、为社区做贡献那就把源码拉下来git clone https://gitcode.com/gh_mirrors/wi/winfsp。核心代码集中在src/dll/用户态库和src/sys/内核驱动两个目录头文件在inc/winfsp/下构建步骤参考doc/WinFsp-Building.asciidoc。Windows 上自建文件系统这件事以前是少数内核高手的专利如今已经是普通开发者的日常工具。从五分钟跑通 MEMFS到写出自己的第一个 passthrough你离亲手造一个盘只差一次动手。挑个周末从那条net use命令开始吧。⚡【免费下载链接】winfspWindows File System Proxy - FUSE for Windows项目地址: https://gitcode.com/gh_mirrors/wi/winfsp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考