You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用Windows API读取MFT表时ReadFile返回ERROR_ACCESS_DENIED的问题

为什么ReadFile会返回ERROR_ACCESS_DENIED?

这个问题的核心在于你调用CreateFileA时指定的访问权限完全不对——你用了FILE_READ_ATTRIBUTES,但这个权限只能让你读取文件的属性信息(比如创建时间、文件大小),根本没有权限去读取文件的实际内容啊!

具体问题分析:

  • 错误的访问权限FILE_READ_ATTRIBUTES是个非常有限的权限,只够查询文件属性,想要读取MFT的内容,你必须传递GENERIC_READ这个权限标志,这才是允许你读取文件数据的基础权限。
  • 额外注意:MFT的路径格式:确认你的MFT变量指向的是正确的设备路径,比如C盘的MFT应该是\\.\C:\$MFT,如果路径写错了也可能导致访问问题,但当前的报错明显是权限不足导致的。

修正后的代码示例:

; 替换掉FILE_READ_ATTRIBUTES为GENERIC_READ,同时建议加上FILE_SHARE_WRITE(因为系统可能会写入MFT)
invoke CreateFileA, addr MFT, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS or FILE_FLAG_NO_BUFFERING, 0
; 一定要检查CreateFile的返回值是否为INVALID_HANDLE_VALUE,避免后续调用出错
.if eax == INVALID_HANDLE_VALUE
    ; 这里可以处理创建文件句柄失败的情况,比如GetLastError获取错误码
.else
    invoke ReadFile, eax, ADDR buf1, 512, ADDR readed, 0
    ; 读取完成后记得关闭句柄
    invoke CloseHandle, eax
.endif
ret

额外提醒:

即使以管理员身份运行,FILE_FLAG_NO_BUFFERING还有个要求:你的缓冲区地址和读取的字节数必须是磁盘扇区大小的整数倍(通常512字节是符合的,但要确保buf1的内存是对齐到扇区边界的,比如用_aligned_malloc或者在汇编里手动对齐)。不过这个不是当前报错的原因,先解决权限问题就能解决ERROR_ACCESS_DENIED了。

内容的提问来源于stack exchange,提问作者Bruno G. S.

火山引擎 最新活动