最近在做扇区读写及隐写数据自动加载执行Python程序的提高作业时,碰到了一个我暂时无法解决的问题 —— 用Python进行扇区写入时,一直报WriteFile错误5(拒绝访问);

实验环境

作业:通过 Python 的win32file库调用CreateFile/WriteFile等 API,实现:

  1. 监控U盘插入事件
  2. 直接读写U盘原始扇区
  3. 实现隐写数据的自动加载执行

环境

  • 主机系统:MacBook Air M3 与 Windows11 物理机
  • 测试环境:Mac Parallel 模拟 Arm 版 Windows 11 虚拟机,Win VMware 模拟Win7虚拟机
  • 辅助工具:WinHex

问题:WriteFile 错误 5

一开始,我想着用win32file.CreateFile打开U盘盘符(如\\.\E:),然后调用win32file.WriteFile尝试写入扇区数据。结果直接报错:

1
2
3
4
5
6
7
8
操作出错:(5,'WriteFile',’拒绝访问。’)
Traceback (most recent call last):
File "C: \Users\len5010\Desktop\PyProject\main.py",line 102, in main
stes.write_date_to_cluster(free_cluster.student.id)
File "C: \Users\1en5010\Desktop\PyProject\main.py", line 75, in write_data_to_clus
win32file.WriteFile(self.handle, padded_data)
pywintypes.error:(5, 'WriteFile'’,’拒绝访问。’)
PC: \Users\len5010\Desktop\PyProject>

查了下错误码,5 对应的就是ACCESS_DENIED,我觉得这应该是权限问题;

错误排查:从用户权限到系统内核限制

1. 尝试提升权

  • 管理员模式运行:管理员+UAC关闭,启动脚本,没用;

2. MSDN 文档的关键提示

我开始STFW,直到我找到了这个14年前的帖子里面贴出了一份MSDN文档;
Windows Vista之后,系统对已挂载(mounted)的卷有严格写入限制:

  • 若卷已被文件系统挂载(如 FAT32/NTFS),直接写入扇区需满足:
    • 写入引导扇区或非文件系统空间
    • 先通过FSCTL_DISMOUNT_VOLUME卸载卷,使其脱离文件系统管理
    • 卷为RAW格式(无文件系统)

但是想到WinHex这类工具能正常读写扇区,我特意查了它的更新日志…
2007年WinHex针对Windows Vista做了改进:

WinHex 更新日志 2007-03:
“Under Windows Vista, writing sectors now internally unmounts the volume first …”
“在Windows Vista系统下,对于物理介质及分区的磁盘扇区写入,通过底层 API 实现了挂载状态管理。”

推测其核心逻辑是:

  1. 若卷已挂载且含文件系统,除引导扇区外禁止写
  2. 需先锁卷FSCTL_LOCK_VOLUME
  3. 调用FSCTL_DISMOUNT_VOLUME卸载卷

WinHex复现

  1. 用记事本打开·E:\a.txt
  2. 修改一下非引导扇区的数据 → WinHex →「Open Disk」→ 选择 E:
  3. 试图保存扇区 → 弹窗Unable to lock the drive (32)

总结

用户模式进程不能直接操作已挂载的文件系统空间,必须通过卸载卷或操作 RAW 设备绕过文件系统保护
Windows为保护文件系统,对挂载卷加了「独占锁 ➜ 卸载」的门槛
成功锁+卸的前提是卷无人使用,WinHex / Python / 任何工具都必须遵守这条规则