2010-02-28 86 views
2

当Windows准备进入休眠状态时,我放下笔记本电脑,结果硬盘驱动器发生了磁头崩溃。 (教会我下次使用自由落体传感器来获取硬盘驱动器和/或笔记本电脑。)无论如何,运行SpinRite以尝试恢复数据导致磁盘上的所有备用扇区全部用完到目前为止可回收的部门。 SpinRite现在仍在运行,但由于不再有备用扇区可供使用,我认为除了告诉我所有坏道在哪里之外,这将是徒劳无益的。如何在Windows中使用DeviceIoControl()读取各个扇区/群集?

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

我该如何着手尝试读取该实际群集的扇区?通过MSDN列出的磁盘,文件和音量设备控制代码,我没有遇到任何事情,因为我知道实际的集群数据。

我是否应该甚至懒得试图在低级别阅读?我是否应该通过SetFilePointer()和ReadFile()调用来获得适当的集群大小偏移到文件中并读取集群大小的块?

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

我是否应该清除我的* nix知识并弄清楚如何从/ dev /中读取?

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

回答

2

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

+0

'SetFilePointer'真的可以在卷控制器上工作吗?我不知道... – Mehrdad 2011-03-20 06:35:51

+0

你可以分享代码吗?有一些数学我做错了.. – lalli 2011-09-16 05:46:46

+0

为什么你必须访问卷句柄,而不是文件句柄? – 2015-12-26 21:45:06