他们如何从磁盘读取群集/磁盘/扇区?

我需要恢复我不小心删除的分区表。 我使用了名为TestDisk的应用程序。 它简直令人兴奋。 我从磁盘读取每个圆柱体。 我见过类似的应用程序与MBR和分区工作。

我很好奇。

他们如何从磁盘读取群集/磁盘/扇区? 有这种API吗?

它是否依赖于操作系统? 如果是这样的Linux和Windows的方式是什么?

编辑:好吧,我不只是好奇,我想要一个经验的手。 我想写一个简单的应用程序,显示每个LBA。

用于寻址驱动器的更新的LBA( 逻辑块寻址 )方案大部分已经废弃了柱面和扇区( 维基解释 )。

如果您对历史感兴趣,请使用维基百科文章作为起点。 如果你只是想知道它现在是如何工作的,那么代码就可以简单地使用LBA地址(它的工作原理与文件的方式基本相同 – 以块为单位的线性字节数组)

由于* nix特殊设备文件的魔力,这很容易。 您可以像读取任何其他文件一样打开并读取/dev/sda

只需使用openlseekreadwrite (或者preadpwrite )即可。 如果你想确保你正在从一个驱动器而不是从内核缓冲区获取数据,你可以打开O_DIRECT标志(虽然你必须执行512字节块的对齐的读/写操作)。

对于* nix,已经有了答案(/ dev目录); 对于Windows,有特殊对象\\.\PhisicalDrive X ,其中X为驱动器的编号,可以使用普通的CreateFile API打开。 要实际执行读取或写入,您必须使用DeviceIoControl函数。

更多信息可以在CreateFile API文档的“Physical Disks and Volumes”部分找到。

我是OP。 我将Eric Seppanen&Matteo Italia的答案结合起来,使其完整。

* NIX平台:

由于* nix特殊设备文件的魔力,这很容易。 您可以像读取任何其他文件一样打开并读取/dev/sda

只需使用openlseekreadwrite (或者preadpwrite )即可。 如果你想确保你正在从一个驱动器而不是从内核缓冲区获取数据,你可以打开O_DIRECT标志(虽然你必须执行512字节块的对齐的读/写操作)。

Windows平台

对于Windows,有特殊对象\\.\PhisicalDrive X ,其中X是驱动器的编号,可以使用普通的CreateFile API打开。 要执行读取或写入,只需调用ReadFile和WriteFile (缓冲区必须按扇区大小对齐)。

更多信息可以在CreateFile API文档的“Physical Disks and Volumes”部分找到。

或者,您也可以通过DeviceIoControl函数将控制代码直接发送到指定的设备驱动程序,使相应的设备执行相应的操作。

在Linux上,以root身份,你可以像这样保存你的MBR(假设你的驱动是/ dev / sda):

 dd if=/dev/sda of=mbr bs=512 count=1 

如果你想从你的驱动器读取1Mb,从第10 MB开始:

 dd if=/dev/sda of=1Mb bs=1Mb count=1 skip=10