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

时间:2010-05-20 19:33:54

标签: windows linux api driver

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

我很好奇。

  

他们如何阅读   来自的集群/汽缸/部门   磁盘?是否有某种API?

它是否又取决于操作系统?如果是这样,那么Linux和Linux的方式是什么?对于Windows?

修改 好吧,我不只是好奇我想要亲身体验。我想写一个显示每个LBA的简单应用程序。

5 个答案:

答案 0 :(得分:3)

气缸和扇区(wiki explanation)在很大程度上被较新的LBA(logical block addressing)解决方案所废弃。

如果您对历史感到好奇,请使用维基百科文章作为起点。如果您只是想知道它现在是如何工作的,那么代码应该只使用LBA地址(其工作方式与文件大致相同 - 以块的形式排列的线性字节数组)

答案 1 :(得分:3)

由于* nix特殊设备文件的神奇之处,这很容易。您可以像阅读任何其他文件一样打开和阅读/dev/sda

只需使用openlseekreadwrite(或preadpwrite)。如果要确保从驱动器而不是从内核缓冲区中物理获取数据,可以使用标志O_DIRECT打开(尽管必须执行512字节块的对齐读/写才能使其工作)。

答案 2 :(得分:3)

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

可以在CreateFile API文档的"Physical Disks and Volumes" section中找到更多信息。

答案 3 :(得分:2)

我是OP。我正在结合Eric Seppanen的& Matteo Italia的答案是让它完整。

* NIX平台:

由于* nix特殊设备文件的神奇之处,这很容易。您可以像阅读任何其他文件一样打开和阅读/dev/sda

只需使用openlseekreadwrite(或preadpwrite)。如果要确保从驱动器而不是从内核缓冲区中物理获取数据,可以使用标志O_DIRECT打开(尽管必须执行512字节块的对齐读/写才能使其工作)。

Windows平台

对于Windows,有特殊对象\\.\PhisicalDriveX,其中 X 作为驱动器号,可以使用普通CreateFile API打开。要执行读取或写入,只需调用ReadFileWriteFile(缓冲区必须在扇区大小上对齐)。

可以在CreateFile API文档的"Physical Disks and Volumes" section中找到更多信息。

另外,您也可以使用DeviceIoControl函数将控制代码直接发送到指定的设备驱动程序,从而使相应的设备执行相应的操作。

答案 4 :(得分:1)

在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