终极指南:如何快速开发Windows用户模式文件系统?WinFsp完整教程
【免费下载链接】winfsp 项目地址: https://gitcode.com/gh_mirrors/win/winfsp
想要在Windows上快速开发用户模式文件系统吗?WinFsp是一个强大的开源框架,让开发者能够轻松创建Windows文件系统。本教程将带你从零开始,使用WinFsp框架构建一个完整的用户模式文件系统,无需深入了解内核驱动开发!
WinFsp是一个Windows文件系统代理,它提供了一个用户模式API来开发文件系统。通过WinFsp,你可以使用熟悉的编程语言和工具来创建功能完整的文件系统,而无需编写复杂的内核驱动程序。这个框架特别适合需要快速原型开发或特定用途文件系统的场景。
🚀 准备工作与环境搭建
在开始开发之前,你需要准备好以下环境:
- WinFsp安装:下载并安装WinFsp,记得选择"Developer"选项以确保包含所有必要的头文件和库文件
- Visual Studio:推荐使用Visual Studio 2015或更高版本
- 基础C/C++知识:虽然WinFsp支持多种语言,但本教程使用C语言
📁 创建项目骨架
首先创建一个新的Visual Studio项目,选择"Win32控制台应用程序"。确保选择空项目,因为我们稍后会手动添加所有文件。
现在创建并添加一个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);
}
这个简单的模板允许用户模式文件系统作为控制台应用程序、Windows服务运行,或者作为由WinFsp启动器控制的"子服务"。
🔧 配置开发环境
为了让项目能够正常编译,需要配置Visual Studio的包含目录和库文件路径:
- C/C++ > 常规 > 附加包含目录:
$(MSBuildProgramFiles32)\WinFsp\inc - 链接器 > 输入 > 附加依赖项:
$(MSBuildProgramFiles32)\WinFsp\lib\winfsp-$(PlatformTarget).lib
🎯 文件系统入口/出口点
现在我们来关注文件系统的入口和出口点。对于passthrough文件系统,其入口和出口点分别是SvcStart和SvcStop。
入口点实现
SvcStart函数负责处理命令行参数、创建文件系统实例并启动调度器。这是文件系统运行的核心部分。
出口点实现
SvcStop函数负责停止文件系统调度器并清理资源。
📊 核心文件系统操作
现在开始实现实际的文件系统操作。这些操作定义在FSP_FILE_SYSTEM_INTERFACE结构中。
基础操作实现
GetSecurityByName:用于获取文件的基本元数据和安全描述符 Open:打开现有文件,从不创建或覆盖文件 Close:关闭文件句柄,释放资源
目录读取操作
ReadDirectory:允许文件系统支持Windows资源管理器浏览功能
卷信息查询
GetVolumeInfo:返回文件系统的总空间和可用空间信息
🔄 读写操作实现
文件读取操作
static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem,
PVOID FileContext, PVOID Buffer, UINT64 Offset, ULONG Length,
PULONG PBytesTransferred)
{
HANDLE Handle = HandleFromContext(FileContext);
OVERLAPPED Overlapped = { 0 };
Overlapped.Offset = (DWORD)Offset;
Overlapped.OffsetHigh = (DWORD)(Offset >> 32);
if (!ReadFile(Handle, Buffer, Length, PBytesTransferred, &Overlapped))
return FspNtStatusFromWin32(GetLastError());
return STATUS_SUCCESS;
}
文件写入操作
写入操作需要考虑更多复杂语义,包括ConstrainedIo模式。
🛠️ 文件元数据操作
基本信息设置
SetBasicInfo:更新文件的属性和时间信息
文件大小设置
SetFileSize:更改文件的大小信息
安全信息设置
**SetSecurity`:更新文件的安全信息(ACL)
🗑️ 文件删除与清理
Cleanup操作
Cleanup在文件即将关闭时被调用,是支持文件删除的关键操作。
CanDelete操作
检查是否允许删除文件或目录,特别是需要检查目录是否为空。
📝 文件创建与重命名
Create操作
用于创建文件和目录,只有在文件不存在时才创建。
Overwrite操作
用于"覆盖"或"替换"文件的特殊操作。
Rename操作
实现文件重命名功能。
🧪 测试文件系统
现在我们已经有了一个功能完整的文件系统!它支持以下Windows文件系统功能:
- 查询卷信息
- 打开、创建、关闭、删除、重命名文件和目录
- 查询和设置文件和目录信息
- 查询和设置安全信息(ACL)
- 读取和写入文件
- 内存映射I/O
- 目录更改通知
- 锁定和解锁文件
- 机会锁
💡 进阶功能与服务化
启用备份/恢复权限
为了让文件系统在SYSTEM账户安全上下文中正常工作,需要启用备份和恢复权限。
注册为系统服务
使用fsreg.bat工具将文件系统注册为由WinFsp启动器管理的服务。
🎉 总结与下一步
在不到1000行的C代码中,我们编写了一个完整的Windows文件系统。我们的文件系统实现了Windows上所有常用的文件功能,与操作系统完全集成。
时间开始创建你自己的文件系统吧!以下是一些快速获得成就感的想法:
- RegFs:创建注册表的文件系统视图
- WinObjFs:将NTOS对象命名空间呈现为文件系统
- ProcFs:为Windows创建类似procfs的功能
WinFsp为Windows文件系统开发带来了革命性的变化,让开发者能够专注于业务逻辑而不是底层驱动细节。现在你已经掌握了使用WinFsp开发用户模式文件系统的核心技能,开始你的文件系统开发之旅吧!🚀
【免费下载链接】winfsp 项目地址: https://gitcode.com/gh_mirrors/win/winfsp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考









