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

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

当 Windows 准备休眠时,我的笔记本电脑掉了下来,结果硬盘驱动器发生了磁头碰撞。 (教我下次买一个带有自由落体传感器的硬盘驱动器和/或笔记本电脑。)无论如何,运行 SpinRite 试图恢复数据导致磁盘上的所有备用扇区都用完了所有到目前为止的可恢复扇区。 SpinRite 现在仍在运行,但由于不再有可用的备用扇区,我认为除了告诉我所有坏扇区在哪里之外,这将是徒劳的。

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

我如何着手尝试读取该实际集群的扇区?我在 MSDN 的磁盘、文件和卷设备控制代码列表中进行挖掘,但在获取实际集群数据的过程中并没有让我突然想到什么。

我什至不应该费心尝试阅读那么低的水平吗?我是否应该改为执行 SetFilePointer() 和 ReadFile() 调用以将适当的簇大小偏移量放入文件并读取簇大小的 block ?

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

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

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

最佳答案

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

关于windows - 如何在 Windows 中使用 DeviceIoControl() 读取单个扇区/集群?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2350181/

相关文章:

python - 使用Python在3D空间(长方体)给定边界内随机生成均匀分布的点

java - 同一java应用程序服务器中应用程序的不同版本

c# - 计算硬盘吞吐量

c# - .NET 无法在同一目录中找到非托管 DLL

performance - 在 Apache Spark 中花费更长的时间的任务

matlab - 使用 MATLAB 搜索插入我的设备的外部硬盘驱动器的路径?

linux - 创建硬盘镜像后可以再次使用

windows - CertCreateCertificateChainEngine 在 Windows 7 中引发错误

c++ - 从不同线程访问 std::map

windows - Windows中的jq命令无法按预期工作