gpt4 book ai didi

c - 对于没有任何文件系统的锁定 SD 卡,GetVolumeInformation() 不报告 FILE_READ_ONLY_VOLUME

转载 作者:可可西里 更新时间:2023-11-01 11:46:01 26 4
gpt4 key购买 nike

在使用 GetVolumeInformation() 报告的 FILE_READ_ONLY_VOLUME 文件系统标志检查 SD 卡是否被锁定时,我得到了一些奇怪的结果.

如果 SD 卡被锁定,并且 SD 卡包含一个带有文件系统的卷,则该标志被正确设置,但是如果没有文件系统,则该标志未设置,即使 Windows 正确报告驱动器为只读。

disk management screenshot

const wchar_t letter = "F";
DWORD filesystemFlags = 0;

TCHAR drivePath[kVolumePathShortLength];
sprintf_s(drivePath, "%c:\\", letter);

const HRESULT result = GetVolumeInformation(drivePath, NULL, 0, NULL, NULL, &filesystemFlags, NULL, 0);

if (SUCCEEDED(result)) {
if (filesystemFlags & FILE_READ_ONLY_VOLUME) {
printf("Drive is read-only\n");
} else {
printf("Drive is not read-only\n");
}
}

如果卷中有文件系统,代码可以正常工作,我认为磁盘管理可能有其他方法检查卷是否只读,无论文件系统如何,它都可以工作。

最佳答案

GetVolumeInformation 适用于卷,而不是磁盘。 GetVolumeInformation 还返回一个 BOOL,而不是 HRESULT,因此您不能相信示例代码的输出!

您可以尝试获取低级磁盘信息:

for (UINT d = 'A'; d <= 'Z'; ++d) // Real code should use GetLogicalDrives
{
WCHAR devbuf[20];
wsprintfW(devbuf, L"\\\\.\\%c:", d);
HANDLE hDev = CreateFileW(devbuf, 0, 7, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDev == INVALID_HANDLE_VALUE) continue;
DWORD cb, gle;
BOOL succ = DeviceIoControl(hDev, IOCTL_DISK_IS_WRITABLE, NULL, 0, NULL, 0, &cb, NULL);
gle = GetLastError();
printf("%c: is %s (error %u)\n", d, succ ? "writable" : gle == ERROR_WRITE_PROTECT ? "read-only" : "unknown", succ ? 0 : gle);
CloseHandle(hDev);
}

这是 Windows 文件系统根据 this thread 执行的操作@OSR:

... the in-box file systems send IOCTL_DISK_IS_WRITEABLE to determine whether the disk is read-only or not.

你也可以试试 IOCTL_DISK_GET_DISK_ATTRIBUTES但我猜该标志与 IOCTL_DISK_IS_WRITABLE 相同。

This thread声称 IOCTL_VOLUME_GET_GPT_ATTRIBUTES 可以发送到所有磁盘类型,但我不明白为什么这是更好的选择。

关于c - 对于没有任何文件系统的锁定 SD 卡,GetVolumeInformation() 不报告 FILE_READ_ONLY_VOLUME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44703463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com