感谢David Heffernan的帮助,我有一个用Freepascal编写的程序(但我的问题的Delphi解决方案就足够了),它按扇区读取物理磁盘扇区。它使用Windows API CreateFileW函数为磁盘句柄,然后FileFile,FileSeek等进行导航和读取。如果所有扇区都没问题,它可以正常工作。但是,如果磁盘有坏扇区,我需要区别对待它们。
我的问题是,是否有可以使用的程序或库,同时阅读这些部门,以确定它们是否是坏扇区?如果没有,我该怎么办呢?我知道它是磁盘控制器,知道什么扇区是坏的,哪些不是,所以我不认为我的程序实际上可以访问坏扇区,那么如何检测哪些是坏扇区并采取相应措施?是否需要查询SMART,如果需要,如何查询?
我搜索了这个网站(只找到this C post,它与程序有关,而不是代码)并用Google搜索,没有明显的解决方案引起我的注意。
答案 0 :(得分:2)
部门及其硬件状态不是普通用户级代码需要处理的事情,因此没有简单的复制/粘贴API可用于此目的。
一般而言,行业概念在多个层面上被抽象出来。举一个例子,请参阅Wikipedia: logical disk address translation。物理部门的地位是非常低级的概念。一些硬件供应商甚至根本不通过公共API公开它。通常在硬件本身中检测到坏(或可疑)扇区并自动重定向到其他位置。所以一般来说坏磁盘扇区概念不存在
... 坏扇区。如果磁盘驱动程序遇到坏扇区,它可能会在重试操作后读取或写入扇区,但扇区最终会变坏。如果磁盘驱动程序可以继续,它应该记录一个警告事件;否则,应记录错误事件。如果文件系统驱动程序发现大量坏扇区并修复它们,则记录警告事件可能有助于管理员确定磁盘可能即将失败...
如果你真的需要使用这个低级概念,那么首先要忘记Pascal或Delphi作为你的要求。
了解如何使用Windows API,一旦您知道它以您选择的语言绑定到API(您可以轻松地将任何Win32用户级API函数映射到Free Pascal)。
了解用户级代码如何看待磁盘抽象开始阅读文档MSDN → Dev Center - Desktop → Device Management Reference → Device Management Functions → DeviceIOControl function
要了解内核级代码如何看待硬件以及如何与用户级代码进行通信,请从MSDN → Dev Center - Hardware → Develop → Drivers → Concepts for all driver developers开始阅读文档
有关阅读S.M.A.R.T.磁盘信息的示例,请参阅WinSim Inc. DISKID32 source code
ReadPhysicalDriveInNTUsingSmart()
在我看来,你将在黑暗中游泳。没有手电筒和游泳圈的深水区域,您应该三思而后行(或您的用户)真正需要/想要的东西,或许可以改进问题以获得合理大小的主题答案
答案 1 :(得分:2)
一般来说,你根本无法访问坏扇区(它们已被重新映射,因此不在LBA中)。您可以访问的是待处理扇区,尝试读取它们将始终导致读取错误。 SMART将告诉您除了坏/待处理扇区的数量。所以你可能应该继续使用选择的API解释持久读取错误作为“坏”扇区的诊断,只需确保它们不是由访问共享冲突引起的。 如果你想以某种方式获得一个p列表或g列表,它只能在终端模式下(对于PATA / SATA,而不是SCSI),需要连接到HDD的服务端口,USB到COM适配器,并且是供应商 - 和产品特定的,如果可能的话。