为何调用CreateFile()打开目录需指定FILE_FLAG_BACKUP_SEMANTICS标志?
为什么调用CreateFile打开目录需要FILE_FLAG_BACKUP_SEMANTICS标志?
核心原因是Windows内核对目录和普通文件的处理逻辑不同:目录在Windows对象模型里属于特殊的文件对象,但默认情况下
CreateFile是为打开普通文件设计的,不会将目录视为合法的打开目标。指定FILE_FLAG_BACKUP_SEMANTICS后,系统才会切换处理逻辑,把目标当作目录对象创建句柄,而非尝试解析成普通文件。文档里提到的“绕过文件安全检查”是这个标志的附加特性,不是打开目录的核心目的。早期Windows设计时,备份/还原工具需要遍历整个目录树,必须能打开任意目录(哪怕当前用户没有常规访问权限),所以把“允许打开目录”和“备份权限绕过”绑定到了同一个标志上。
实际验证一下就清楚:如果不指定这个标志,调用
CreateFile打开目录会直接返回INVALID_HANDLE_VALUE;哪怕你没有SE_BACKUP_NAME或SE_RESTORE_NAME权限,只要有目录的常规访问权限(比如READ_CONTROL),加上这个标志依然能成功打开目录——这足以说明绕过安全只是附加功能,核心是让系统识别并处理目录对象。打开目录句柄后,你可以用它做很多操作,比如调用
FindFirstFile遍历目录内容、修改目录属性,这些操作都依赖于通过该标志获取的目录句柄。
内容的提问来源于stack exchange,提问作者KillStealKS
相关产品推荐
相关产品推荐

