【问题标题】:Win32 C++ detect USB-drive corruptionWin32 C++ 检测 USB 驱动器损坏
【发布时间】:2015-05-20 13:47:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 嗯,当你只有一个小问题时,不要试图解决一个大问题。将文件复制到磁盘驱动器永远不会使您的应用程序崩溃。它失败的更多原因与损坏的闪存驱动器无关。从测试复制到完整驱动器开始,这很容易。
  • 除了按照 Hans Passant 的建议修复您的崩溃错误之外,您可能还希望禁用弹出窗口:sevenforums.com/tutorials/… 我没有尝试过,但是创建 USB 驱动器的简单方法导致 Windows 显示此对话框的方法是在将大文件复制到其中的过程中物理删除 FAT32 格式的驱动器。
  • 抱歉延迟回来。拉扯别的东西。我了解我的应用程序崩溃存在问题。这需要修复,但我正在寻找一种方法来再次创建这种情况,以便我可以准确地看到坠机时发生的事情。 Codegaurd 在下面给出了一个答案,似乎给了我我需要的东西。感谢您的意见。
  • 目前正在继续调查。将发布我发现的内容。

标签: c++ winapi usb corruption


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的信息。我特别感谢有关创建测试 USB 的信息。现在我可以开始找出问题出在我的代码中了。同意修复应用程序崩溃。由于远程客户向我报告了此错误,并且我无法访问他们的 USB 进行测试,因此我首先需要获得一个我可以测试的 USB,以确保修复是适当的。现在我可以修复崩溃,还可以提前测试以提示用户运行 chkdsk 或取消。再次感谢。
  • 在上面错误地发布了这个。我目前正在继续研究这个问题。将发布我发现的内容。
  • 好的,所以我以为我没有制作损坏的 USB 驱动器,但是在使用“fsutil 脏查询 f:”后,我得到了“音量 - f: 是脏的”。但是当我将它弹出、移除然后重新插入时,我没有看到上面显示的对话框。这似乎意味着脏 fs 不是导致对话框查询扫描/修复的原因。
  • 只是为了检查一下,在另一个我没有弄乱过的 USB 上使用该命令会产生“Volume - g: is NOT Dirty”。
  • 我自己测试了一下;在fsutil dirty set 之后,USB 闪存在 Win7 和 Win8 上都产生了扫描和修复消息。可能是您的闪存驱动器不是 NTFS 格式,或者您没有将正确的驱动器号放在 f: 的位置?
猜你喜欢
  • 2015-11-21
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 2010-12-18
  • 2023-01-07
  • 2012-12-04
  • 2018-08-27
相关资源
最近更新 更多