C++ 重新打开Windows API文件失败,返回“0”;错误无效名称";在C:\windows\system32中重新打开文件时

C++ 重新打开Windows API文件失败,返回“0”;错误无效名称";在C:\windows\system32中重新打开文件时,c++,windows,createfile,system32,C++,Windows,Createfile,System32,我想知道,当CreateFile成功打开文件时,是否有人可以用“错误无效名称”解释重新打开文件失败的原因 详情如下: 我使用CreateFile打开了一个文件C:\Windows\system32\unit\u test.txt,它可以正常打开。当我稍后尝试使用rebootfile更改权限时,此操作失败,错误代码为123(十进制),调试器显示为“error\u INVALID\u NAME:文件名目录名或卷标语法不正确” 如果将“unit_test.txt”放在一个更常规的目录中,这个文件就可以

我想知道,当CreateFile成功打开文件时,是否有人可以用“错误无效名称”解释重新打开文件失败的原因

详情如下:

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

如果将“unit_test.txt”放在一个更常规的目录中,这个文件就可以正常工作。 rebootfile不接受filename参数,而是从CreateFile返回的句柄。 我编写的代码既没有请求额外的特权,也没有冲突的特权(这会导致不同的错误),因此我很好奇为什么CreateFile会在这种情况下成功,而RebootFile会失败

诚然,将文件放在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位时,它就开始出现重新启动文件失败的问题

这让我看到了一篇解释这种情况的文章:

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

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

%WinDir%\SysWOW64
默认情况下,将启用文件系统重定向

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


遗憾的是,32位应用程序无法完全访问该目录这一事实并没有阻止Microsoft Windows在我不完全了解的某些情况下将其设置为应用程序的工作目录(可能与较新版本的Windows中的沙箱有关).

作为问题的一部分,您提取一个并提供它如何?一些Windows文件夹应用了各种保护和间接保护。当API调用在其他文件夹上正常工作时,这可能会导致这些文件夹中的API调用失败。是否检查了
CreateFile()
是否正常且没有任何错误?是-CreateFile返回了有效句柄如果进程可以在“%SystemRoot%\System32”中创建文件,则可以相对于句柄重新打开该文件,除非数据访问共享模式或文件的删除状态阻止。这里发生了一些其他的事情,但是如果没有重现问题的代码,只有拥有神秘力量的人才能帮助你。