win32文件系统

文件系统基础

  1. 定义
    文件系统:操作系统管理磁盘文件的数据结构与组织方法,决定文件在磁盘存储格式
    常见:NTFS、FAT32
特性 NTFS FAT32
单分区上限 2TB 32GB
单个文件上限 支持 > 4GB 最大 4GB
EFS 文件加密 ✅支持 ❌不支持
磁盘配额 ✅支持 ❌不支持

● EFS 加密:仅 NTFS 可用;加密文件名字显示绿色,加密用户可访问,其他用户拒绝访问

● 磁盘配额:限制用户占用磁盘空间,超出配额拒绝分配空间,在磁盘属性「配额」标签配置

Windows 文件 API(CreateFile/ReadFile 等)对 NTFS、FAT32使用同一套 API,底层差异被系统屏蔽

卷(逻辑驱动器)相关 API

卷 = 逻辑盘(C 盘、D 盘),一块物理硬盘可划分多个逻辑卷

  1. GetLogicalDrives
    ● 功能:获取存在的驱动器,返回 DWORD 位掩码,每一位代表 A~Z 盘符
    ● 示例:返回 13 → 二进制1101→ A、C、D 盘存在
bash 复制代码
bit3 bit2 bit1 bit0
 1    1    0    1
 D    C    B    A
  1. GetLogicalDriveStrings
    ● 功能:获取全部盘符字符串,缓冲区输出格式:"A:\ \0 C:\ \0 D:\ \0\0"(多个以\0分隔,末尾双\0)
  2. GetDriveType
    ● 判断驱动器类型
    ● 返回值:0 未知,1 固定硬盘,2 可移动,3 网络盘,4 光驱,5RAM 盘
  3. GetVolumeInformation
    ● 获取卷信息:卷标、卷序列号、最大文件名长度、文件系统名称(NTFS/FAT32)
    ● ⚠️卷序列号格式化会改变,不是硬盘硬件序列号

目录操作 API

  1. CreateDirectory 创建文件夹
c 复制代码
BOOL CreateDirectory(
    LPCTSTR lpPathName,        // 目录路径
    LPSECURITY_ATTRIBUTES lpSecurityAttributes //安全属性,NULL=默认
);

示例:CreateDirectory(L"C:\A", NULL);

只能创建单层目录;路径分隔符 C 语言写\转义

  1. RemoveDirectory 删除目录
c 复制代码
BOOL RemoveDirectory(LPCTSTR lpPathName);

⚠️只能删除空文件夹,目录内有文件会失败

  1. MoveFile 重命名 / 移动目录 / 文件
c 复制代码
BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName);

● 同盘:仅改名;跨盘:复制原文件,再删除源文件

● 可以直接移动带文件的目录

  1. GetCurrentDirectory / SetCurrentDirectory

● GetCurrentDirectory:获取进程当前工作目录(不是 exe 所在目录!)

● SetCurrentDirectory:修改进程当前目录

相对路径的文件 / 目录操作,以当前工作目录作为基准

文件核心 API

  1. CreateFile(最重要,创建 / 打开文件、管道、设备)
c 复制代码
HANDLE CreateFile(
    LPCTSTR lpFileName,                // 文件路径
    DWORD dwDesiredAccess,             // 访问权限
    DWORD dwShareMode,                 // 共享模式
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,       // 创建行为
    DWORD dwFlagsAndAttributes,        // 文件属性
    HANDLE hTemplateFile
);

dwDesiredAccess 访问权限

● GENERIC_READ 只读

● GENERIC_WRITE 只写

● GENERIC_READ | GENERIC_WRITE 读写

dwShareMode 共享模式

● 0:独占打开,别的程序不能读写

● FILE_SHARE_READ:允许其他进程读

● FILE_SHARE_WRITE:允许其他进程写

● FILE_SHARE_DELETE:允许其他进程删除

dwCreationDisposition 创建方式

宏 作用
CREATE_NEW 新建,文件已存在则失败
CREATE_ALWAYS 总是新建,覆盖旧文件
OPEN_EXISTING 打开已有文件,不存在失败
OPEN_ALWAYS 打开,不存在就新建
TRUNCATE_EXISTING 打开并清空原有内容

dwFlagsAndAttributes 文件属性

● FILE_ATTRIBUTE_NORMAL 普通文件

● FILE_ATTRIBUTE_HIDDEN 隐藏

● FILE_ATTRIBUTE_READONLY 只读

返回 HANDLE;用完必须 CloseHandle关闭句柄,否则资源泄漏

  1. 配套文件 API

● ReadFile:读文件

● WriteFile:写文件

● GetFileSize:获取文件大小(返回低 32 位,大文件需要高 32 位参数)

● SetFilePointer:移动文件读写指针

● GetFileAttributes:获取文件属性(只读 / 隐藏 / 目录等)

● CopyFile:复制文件

● DeleteFile:删除文件

● FindFirstFile / FindNextFile:遍历目录下所有文件

注意事项

  1. 路径:C/C++ 字符串内,反斜杠需要转义 \;长路径可使用\?\前缀,支持 32000 字符
  2. 错误判断:API 返回失败时,调用GetLastError()查看错误码
  3. 资源:文件句柄、内核对象用完必须 CloseHandle
  4. 进程当前目录 ≠ 可执行文件所在目录,不要混淆

总结

  1. NTFS 独有:EFS 加密、磁盘配额;FAT32 单文件上限 4GB
  2. 卷 API:GetLogicalDrives(位掩码)、GetVolumeInformation(获取文件系统类型 NTFS/FAT32)
  3. 目录:CreateDirectory 建文件夹,RemoveDirectory只能删空目录;MoveFile 支持目录改名
  4. CreateFile 是核心:dwCreationDisposition 决定新建 / 覆盖 / 打开;共享模式控制多进程并发访问
  5. 文件句柄用完一定要 CloseHandle
相关推荐
漠月瑾-西安4 小时前
PHP曝出两个严重RCE漏洞:CVE-2026-109618、CVE-2026-109619技术分析与修复指南
网络安全·php·漏洞分析·漏洞修复·远程代码执行
EnCi Zheng7 小时前
后端怎么把AI接口稳定安全低成本接进业务:超时重试、密钥隔离与成本熔断清单
人工智能·后端·安全·架构·api
学逆向的8 小时前
C 指针常量与常量指针
c语言·开发语言·网络安全
千木SilvaMux9 小时前
10款国产模型写离职证明实测:为什么两极分化
llm·api
大泽九章16 小时前
XSS入门:存储型、反射型、DOM型,用Flask全复现
python·网络安全·flask
持敬chijing17 小时前
系统入侵与攻击工具-正反向 Shell 深度对比与多种反弹姿势
安全·网络安全·网络攻击模型
终端安全笔记2 天前
下一个大版本要动的三处:更新指令、传输要求、策略写法
网络安全·ios·1024程序员节·移动设备管理
用户298698530142 天前
Python 实现 Markdown 与 Word 文档互转
python·api·markdown
愤怒火龙果2 天前
AI 渗透测试智能体架构综述:从单兵到蜂群的演进图谱
人工智能·网络安全·架构
むはちひつなゃ初见2 天前
LLM API 上线 FAQ 与排障清单:从 401/429 到 fallback 验收
llm·api·故障排查