繁体   English   中英

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

[英]ReOpenFile Windows API fails with "error invalid name" when reopening a file in C:\windows\system32

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

以下是详细信息:

我使用 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 提供文件系统重定向。 在 64 位版本的 Windows Server 2003 或 Windows XP 中,%WinDir%\\System32 文件夹是为 64 位应用程序保留的。 当 32 位应用程序尝试访问 System32 文件夹时,访问将重定向到以下文件夹:

%WinDir%\SysWOW64

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM