如何在Windows中使用DeviceIoControl()读取各个扇区/群集?

Windows准备进入hibernate状态时,我放弃了笔记本电脑,结果硬盘上出现了一个头部故障。 (教我下次使用自由落体传感器的硬盘驱动器和/或笔记本电脑。)无论如何,运行SpinRite尝试恢复数据导致磁盘上的所有备用扇区全部用完到目前为止可回收的部门。 SpinRite现在还在运行,但由于不再有备用扇区了,我认为除了告诉我所有的坏道在哪里之外,这是徒劳的。

无论如何,我正在计划编写一个应用程序来试图从硬盘上抢救数据。 从我过去的整理碎片,我知道我可以使用FSCTL_GET_RETRIEVAL_POINTERS找出任何给定文件的逻辑簇编号。

我怎么去尝试阅读该实际集群的部门? 我通过MSDN列出的磁盘,文件和音量设备控制代码来挖掘我没有任何东西跳到我实际的群集数据的方式。

我是否应该甚至不打算在这么低的水平上阅读? 我应该做SetFilePointer()和ReadFile()调用来获得适当的集群大小偏移到文件和读取群集大小的块?

如果我试图读取的文件有一个坏扇区,NTFS会将整个文件标记为坏,并阻止我将来访问该文件? 如果是这样,我该如何告诉NTFS不要将文件标记为坏或死亡? (请记住,房屋署现在没有备用扇区进行重新映射。)

我应该掸掉我的* nix知识,弄清楚如何从/ dev /中读取数据?

更新:我find了我自己的问题的答案。 :-)解决scheme是在卷处理上而不是在文件句柄上执行SetFilePointer()和ReadFile()。

我找到了自己的问题的答案。 :-)解决方案是在卷处理上而不是在文件句柄上执行SetFilePointer()和ReadFile()。