【问题标题】:Detecting bad sectors using Delphi or freepascal使用 Delphi 或 freepascal 检测坏扇区
【发布时间】:2014-08-09 08:07:11
【问题描述】:

感谢David Heffernan 的帮助我有一个用 Freepascal 编写的程序(但我的问题的 Delphi 解决方案就足够了),它逐扇区读取物理磁盘。它使用 Windows API CreateFileW 函数来处理磁盘句柄,然后使用FileFileFileSeek 等进行导航和读取。如果所有扇区都正常,它工作正常。但是,如果磁盘有坏扇区,我需要区别对待。

我的问题是,在读取这些扇区时,是否可以使用程序或库来确定它们是否是坏扇区?如果没有,我该怎么做?我认为是磁盘控制器知道哪些扇区是坏的,哪些不是,所以我认为我的程序实际上不能访问坏扇区,那么我如何检测哪些是坏扇区并采取相应的行动?是否需要查询 SMART,如果需要,如何查询?

我已经搜索了这个网站(只找到了this C post,它与一个程序有关,而不是代码)并用谷歌搜索了它,我没有注意到任何明显的解决方案。

【问题讨论】:

  • 如果您还没有,请查看 Roadkil 的 Unstoppable Copier。这可以很好地从坏扇区中读取数据,显然是通过一遍又一遍地读取扇区,可能是几十甚至几百次。并不是说这是对您的 q 的回答,但也许通过谷歌搜索它会发现一些关于它使用的技术的有用信息。
  • 很容易出现连操作系统都认为没问题的坏磁盘扇区。
  • 请原谅缺乏细节。我不需要读取或尝试读取坏扇区中的数据。识别出的任何坏扇区都需要视为零。

标签: delphi file-io freepascal sector


【解决方案1】:

一般来说,您根本无法访问坏扇区(它们已经被重新映射,因此已超出 LBA)。您可以访问的是待处理扇区,尝试读取它们总是会导致读取错误。 SMART 只会告诉您坏/待处理扇区的数量。因此,您可能应该继续使用选择的 API 将持续读取错误解释为“坏”扇区的诊断,只要确保它们不是由访问共享冲突引起的。 如果您想以某种方式获得 p-list 或 g-list,则只能在终端模式下(对于 PATA/SATA,而不是 SCSI),需要连接到 HDD 的服务端口、USB-to-COM 适配器并且是供应商-和产品特定的,如果可能的话。

【讨论】:

    【解决方案2】:

    扇区及其硬件状态不是普通用户级代码需要处理的事情,因此没有可用于此目的的简单复制/粘贴 API。

    一般来说,部门概念在多个层面上被抽象出来。例如,请参阅Wikipedia: logical disk address translation。物理扇区状态是非常低级的概念。一些硬件供应商甚至根本不通过公共 API 公开它。通常在硬件本身中检测到坏(或可疑)扇区并自动重定向到其他地方。所以通常不存在坏磁盘扇区的概念

    MSDN Logging Guidelines

    ...坏扇区。如果磁盘驱动程序遇到坏扇区,它可能在重试操作后可以读取或写入该扇区,但该扇区最终会变坏。如果磁盘驱动程序可以继续,它应该记录一个警告事件;否则,它应该记录一个错误事件。如果文件系统驱动程序发现大量坏扇区并修复它们,记录警告事件可能有助于管理员确定磁盘可能即将发生故障...

    如果您确实需要使用这些低级概念,那么首先忘记 Pascal 或 Delphi 作为您的要求。

    了解如何使用 Windows API,一旦您知道它以您选择的语言绑定到 API(您可以轻松地将任何 Win32 用户级 API 函数映射到 Free Pascal)。

    在我看来,您将在没有手电筒和游泳圈的情况下在黑暗和深水中游泳,您应该三思而后行您(或您的用户)真正需要/想要什么,并可能改进问题以获得合理尺寸主题回答

    【讨论】:

    • 感谢您提供详细信息。我已经在使用像 deviceiocontrol 这样的 win api 函数,所以可以进一步寻找方法。我知道这是可以做到的,因为像 winhex 这样的工具是 Delphi 程序,但正如你所说,需要高超的编程技能
    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2010-10-19
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多