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

时间:2010-02-28 05:22:59

标签: windows cluster-computing hard-drive sector low-level-io

当Windows准备休眠时,我丢弃了我的笔记本电脑,结果,我的硬盘驱动器发生了撞击。 (教我下次使用带有自由落体传感器的硬盘和/或笔记本电脑。)无论如何,运行SpinRite尝试恢复数据导致磁盘上的所有备用扇区全部用完所有到目前为止可恢复的部门。 SpinRite现在还在继续,但由于不再使用备用扇区,我认为除了告诉我所有坏道的位置之外,这将是一个徒劳无功的练习。

无论如何,我打算写一个应用程序试图从硬盘驱动器中抢救数据。从我过去的尝试到碎片整理,我知道我可以使用FSCTL_GET_RETRIEVAL_POINTERS来计算任何给定文件的逻辑簇号。

如何尝试读取该实际群集的扇区?我通过MSDN的磁盘,文件和卷设备控制代码列表挖掘出来并没有像我到达实际集群数据那样突然出现。

我是否应该费心去尝试低水平的阅读?我是否应该执行SetFilePointer()和ReadFile()调用以获取适当的簇大小的偏移到文件中并读取簇大小的块?

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

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

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

1 个答案:

答案 0 :(得分:2)

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