0

偶然发现一个奇怪的问题:

  • 假设我们有一个 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);
4

0 回答 0