2

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

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

我搜索了这个站点(只找到了这个 C 帖子,它与程序有关,而不是代码)并用谷歌搜索,没有明显的解决方案引起我的注意。

4

2 回答 2

3

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

于 2014-06-27T12:57:38.417 回答
2

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

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

MSDN 日志记录指南

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

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

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

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

于 2014-06-19T18:27:32.750 回答