Win32 C++ 检测 USB 驱动器损坏

Win32 C++ detect USB-drive corruption

我正在开发一个使用 Windows 7 作为 OS 和 Win32 C++ 检测和管理 USB 驱动器的信息亭应用程序。我们刚刚发现一个错误,如果 USB 以某种方式损坏,OS 将弹出以下对话框,该对话框隐藏在信息亭应用程序后面,因此永远不会显示。

当用户复制到这个驱动器时,应用程序崩溃。

我一直在寻找一种方法来检测当我收到 USB DBT_DEVICEARRIVAL 通知时这个新添加的 USB 是否已损坏,但没有找到任何好的可能性。我想到的是调用 DeviceIoControl() 并将 IOCTL_DISK_GET_PARTITION_INFO 作为控制代码传递的可能性,因为返回的 PARTITION_INFORMATION 结构可以告诉我分区类型是否被识别。但这不一定告诉我 USB 是否已损坏。我假设这更有可能判断这是否是公认的 NTFS 格式,而不是 Linux 或 Mac 系统编写的格式。

任何人都可以告诉我如何检测新添加的 USB 驱动器中的损坏,以便我可以采取必要的后续步骤吗?

还有一件事。我试图故意在我的 USB 驱动器上创建一个损坏,以便我可以模拟我们的用户发现的问题,但 Win7 似乎足够聪明来阻止我这样做。有谁知道为测试目的创建损坏的 USB 驱动器的方法吗?

您错误地将此与 USB 联系起来。相反,它是一个音量标志。例如,可以通过 WMI 获得此状态。请参阅 Win32_LogicalDisk.VolumeDirty - 如果为 TRUE,则磁盘需要 chkdsk。一旦您知道卷需要修复,您可以从您的程序 运行 chkdsk.exe。

您还可以使用 fsutil dirty query f: 检查卷是否需要修复,并使用 fsutil dirty set f: 手动设置此位。这也允许您制作测试 USB。

在某些计算机上,扫描和修复弹出窗口可能被禁用。不过,如果您设置了脏位,Scan&Fix 将显示未禁用它的计算机。

PS:我认为您应该找出您的应用崩溃的原因并修复它。我认为这是您应用中的一个单独问题。