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

时间:2015-05-20 13:47:57

标签: c++ winapi usb corruption

我正在使用Windows 7作为操作系统的Kiosk应用程序,以及用于检测和管理USB驱动器的Win32 C ++。我们刚发现一个错误,如果USB以某种方式损坏,操作系统将弹出以下对话框,该对话框隐藏在自助服务终端应用程序后面,因此永远不会显示。

image of the dialog

当用户转到此驱动器时,应用程序崩溃。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

PS:我认为你应该弄清楚为什么你的应用程序崩溃并修复它。我相信这是您应用中的一个单独问题。