ReOpenFile Windows API在C:\ windows \ system32中重新打开文件时失败,并显示“错误无效名称”

问题描述

我想知道在CreateFile成功打开文件后,是否有人可以用“ error-invalid-name”解释ReOpenFile失败的原因。

以下是详细信息:

我使用CreateFile打开文件C:\ Windows \ system32 \ unit_test.txt,它可以正常打开。当我稍后尝试使用ReOpenFile更改权限时,此操作失败,错误代码123(十进制),调试器显示为“ ERROR_INVALID_NAME:文件名目录名或卷标语法不正确”。

如果将“ unit_test.txt”放在更常规的目录中,则ReOpenFile可以正常工作。 ReOpenFile不带文件名参数,而是从CreateFile返回的句柄。 我编写的代码既没有请求其他特权也没有特权冲突(这会导致不同的错误),所以我很好奇为什么在这种情况下CreateFile成功而ReOpenFile失败。

诚然,将文件放置在Windows \ System32中是偶然的,但是如果我可以不小心将其放置,则我们软件的用户可能会偶然发现相同的问题。

此后,我使用相同的函数调用创建了此示例,但是我不能让它失败。它实质上显示了产生错误的原因:

int main ()
{
HANDLE h1 = ::CreateFile (_T("c:\\windows\\system32\\test.txt"),GENERIC_READ | GENERIC_WRITE | DELETE,FILE_SHARE_READ,nullptr,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,NULL);

if (h1 != INVALID_HANDLE_VALUE)
{
    HANDLE h2 = ::ReOpenFile (h1,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,FILE_FLAG_SEQUENTIAL_SCAN);

    ::CloseHandle (h1);

    if (h2 != INVALID_HANDLE_VALUE)
        ::CloseHandle (h2);
}
}

解决方法

我将“最小示例”重新编译为32位而不是64位后,就开始出现ReOpenFile失败的问题。

这引出我来一篇解释情况的文章:Accessing files from System32 directory using 32 bit application on 64 bit machine

文章引用: ” 如您所见,在运行64位版本的Windows Server 2003或Windows XP的计算机上,一个32位应用程序无法访问以下文件夹:%WinDir%\ System32

发生此现象的原因在于Windows 64位(WOW64)上的Windows提供了文件系统重定向。 在Windows Server 2003或Windows XP的64位版本中,%WinDir%\ System32文件夹保留用于64位应用程序。当32位应用程序尝试访问System32文件夹时,访问将重定向到以下文件夹:

%WinDir%\SysWOW64

默认情况下,启用文件系统重定向。

作为一种临时解决方案,32位应用程序可以通过用%windir%\ Sysnative替换%windir%\ System32来访问本机系统目录。 WOW64将Sysnative识别为特殊别名,用于表示文件系统不应重定向访问。 “

不幸的是,在我不完全了解的某些情况下,32位应用程序无法完全访问该目录的事实并不能阻止Microsoft Windows将其设置为该应用程序的工作目录(可能与更多内容中的沙箱有关)。 Windows的最新版本。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...