当 Windows 准备休眠时,我的笔记本电脑掉了下来,结果我的硬盘驱动器发生了头部碰撞。(教我下一次买一个带有自由落体传感器的硬盘和/或笔记本电脑。)无论如何,运行 SpinRite 来尝试恢复数据导致磁盘上的所有备用扇区都被全部用完。到目前为止可恢复的部门。SpinRite 现在仍在运行,但由于不再有备用扇区可供使用,我认为这将是徒劳的,除了告诉我所有坏扇区在哪里。
无论如何,我正计划编写一个应用程序来尝试从硬盘驱动器中抢救数据。从我过去对碎片整理的尝试中,我知道我可以使用 FSCTL_GET_RETRIEVAL_POINTERS 来找出任何给定文件的逻辑簇号。
我该如何尝试读取该实际集群的扇区?我在 MSDN 的磁盘、文件和卷设备控制代码列表中进行挖掘,并没有在我获得实际集群数据的过程中发现任何问题。
我不应该费心去读那么低的水平吗?我应该改为执行 SetFilePointer() 和 ReadFile() 调用以获取文件中适当的集群大小的偏移量并读取集群大小的块吗?
如果我要读取的文件有坏扇区,NTFS 会将整个文件标记为坏文件并阻止我以后访问该文件吗?如果是这样,我如何告诉 NTFS 不要将文件标记为坏或死?(请记住,HD 现在没有可以重新映射的备用扇区。)
我应该掸掉我的 *nix 知识并弄清楚如何从 /dev/ 读取吗?
更新:我找到了自己问题的答案。:-) 解决方案是在卷句柄上而不是在文件句柄上执行 SetFilePointer() 和 ReadFile()。