讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么读取被标记为系统隐藏的文件_FILE_FLAG_BACKUP_SEMANTICS【进阶】

夏杰同学_7985

夏杰同学_7985

发布时间:2026-03-26 10:08:50

|

832人浏览过

|

来源于php中文网

原创

必须添加 FILE_FLAG_BACKUP_SEMANTICS 标志并启用 SE_BACKUP_NAME 特权才能用 CreateFile 打开系统隐藏文件,否则返回 ERROR_ACCESS_DENIED;还需确保缓冲区 512 字节对齐、正确处理句柄类型及共享模式。

c++怎么读取被标记为系统隐藏的文件_file_flag_backup_semantics【进阶】

用 CreateFile 打开系统隐藏文件必须加 FILE_FLAG_BACKUP_SEMANTICS

Windows 下,系统隐藏文件(比如卷影副本、USN 日志、某些备份元数据)默认被 CreateFile 拒绝访问,报错 ERROR_ACCESS_DENIED。这不是权限问题,而是内核对“非普通文件语义”的保护机制。绕过它的唯一合法方式,就是在调用 CreateFile 时显式传入 FILE_FLAG_BACKUP_SEMANTICS 标志——它告诉系统:“我要以备份/恢复上下文访问这个句柄”,从而绕过常规 ACL 和属性检查。

注意:这个标志本身不赋予任何权限,它只是切换访问语义;你仍需确保进程有 SE_BACKUP_NAME 或 SE_RESTORE_NAME 特权(通常管理员进程默认持有),否则依然失败。

  • FILE_FLAG_BACKUP_SEMANTICS 必须和 GENERIC_READ(或 GENERIC_WRITE)一起用,单独加没意义
  • 不能和 FILE_ATTRIBUTE_NORMAL 冲突——打开前别自己清除文件的 FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN
  • 该标志会让 CreateFile 允许打开目录(即使没指定 FILE_FLAG_OPEN_REPARSE_POINT),所以后续操作前务必用 GetFileType 或 GetFileInformationByHandle 确认类型

OpenProcessToken + AdjustTokenPrivileges 是启用备份特权的必要步骤

哪怕你是管理员,SE_BACKUP_NAME 特权默认是“禁用”状态,不显式启用就等于没有。跳过这步,CreateFile 会静默失败(返回 INVALID_HANDLE_VALUE,GetLastError() 是 ERROR_PRIVILEGE_NOT_HELD)。

  • 先用 OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) 获取当前进程令牌
  • 再调用 LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &luid) 获取特权 LUID
  • 构造 TOKEN_PRIVILEGES 结构,把 Attributes 设为 SE_PRIVILEGE_ENABLED,再传给 AdjustTokenPrivileges
  • 别忽略 AdjustTokenPrivileges 的返回值——它可能成功但部分特权未生效(比如没权限启 SE_RESTORE_NAME),要用 GetLastError() 判断

读取内容本身和普通文件没区别,但要注意句柄类型和缓冲区对齐

拿到有效句柄后,ReadFile 行为完全一致。真正容易出错的是前置判断和内存准备:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

立即学习“C++免费学习笔记(深入)”;

  • 用 GetFileType(hFile) 区分是 FILE_TYPE_DISK 还是 FILE_TYPE_UNKNOWN(后者可能是命名管道或设备,不能直接 ReadFile)
  • 某些系统隐藏文件(如 System Volume Information 下的 {3808876b-c176-4e48-b3ae-41006a62f5c4})要求读取缓冲区地址按 512 字节对齐,否则 ReadFile 返回 ERROR_INVALID_PARAMETER;可用 _aligned_malloc(size, 512) 分配
  • 不要假设文件大小可查:GetFileSize 对很多系统文件返回 INVALID_FILE_SIZE,且 GetFileInformationByHandle 的 nFileSizeHigh/Low 可能全零——得靠实际读取循环 + GetLastError() == ERROR_HANDLE_EOF 判定结束

常见错误现象和对应检查点

遇到打不开、读不出、崩掉,优先按顺序核对这几项:

  • ERROR_ACCESS_DENIED → 检查是否漏了 FILE_FLAG_BACKUP_SEMANTICS,或 AdjustTokenPrivileges 调用失败/未启用 SE_BACKUP_NAME
  • ERROR_INVALID_PARAMETER(ReadFile)→ 检查缓冲区地址是否对齐(尤其读取 USN 日志或卷影副本时),以及 lpNumberOfBytesRead 是否非空指针
  • ERROR_SHARING_VIOLATION → 系统隐藏文件常被卷影复制服务独占打开,尝试加 FILE_SHARE_READ | FILE_SHARE_WRITE,但成功率取决于具体文件用途
  • 读出来全是零或乱码 → 很可能句柄其实是目录(GetFileType 返回 FILE_TYPE_DIRECTORY),却当成文件读了

系统隐藏文件的访问边界很模糊:有些能读,有些只能由特定驱动访问,有些路径本身就需要 \? 前缀绕过路径解析限制。别指望一个开关解决所有问题,每次换目标文件都得重新验证语义、特权、对齐、共享模式这四层。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

179

2025.11.16

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3339

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2918

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1528

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2659

2023.08.02

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn