偶然发现一个奇怪的问题:
- 假设我们有一个 SMB 共享
\\<server>\<share>
,我们打开它进行写入 NtSetInformationFile(..., FileBasicInformation)
通常会成功- ...但是如果底层文件系统是 FAT——它会失败
STATUS_INVALID_PARAMETER
(即使FILE_BASIC_INFORMATION
结构被清零)
为什么会失败以及如何正确处理?
笔记:
- 共享在 Windows Server 2012 R2 x64 上
- 客户端是Win7 x64
* 更多信息 *
转换为 Win32 APISetFileInformationByHandle()
并没有帮助 - 它失败但GetLastError()
返回0
。此外,SetFileTime()
调用SetFileAttributes()
失败并显示ERROR_INVALID_PARAMETER
.
我想,我需要以某种方式弄清楚给定的路径是否指向 FAT 文件系统上的共享,并默默地跳过与元数据相关的调用......
* 代码重现 *
TCHAR path[] = _T(R"(\\<server>\<share>)");
DWORD dwAccess = GENERIC_WRITE|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA; // 0x40000110
HANDLE h = CreateFile(path, dwAccess, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
DWORD err = GetLastError();
IO_STATUS_BLOCK io = {};
FILE_BASIC_INFORMATION bi = {};
NTSTATUS s = NtSetInformationFile(h, &io, &bi, sizeof(bi), FileBasicInformation);
printf("Result: 0x%08X\n", s);