我需要恢复意外删除的分区表。我使用了一个名为TestDisk的应用程序。它简直令人兴奋。我从磁盘读取每个圆柱体。我见过类似的这类应用程序可以与MBR和分区。
我很好奇。
他们如何阅读 来自的集群/汽缸/部门 磁盘?是否有某种API?
它是否又取决于操作系统?如果是这样,那么Linux和Linux的方式是什么?对于Windows?
修改 好吧,我不只是好奇我想要亲身体验。我想写一个显示每个LBA的简单应用程序。
答案 0 :(得分:3)
气缸和扇区(wiki explanation)在很大程度上被较新的LBA(logical block addressing)解决方案所废弃。
如果您对历史感到好奇,请使用维基百科文章作为起点。如果您只是想知道它现在是如何工作的,那么代码应该只使用LBA地址(其工作方式与文件大致相同 - 以块的形式排列的线性字节数组)
答案 1 :(得分:3)
由于* nix特殊设备文件的神奇之处,这很容易。您可以像阅读任何其他文件一样打开和阅读/dev/sda
。
只需使用open
,lseek
,read
,write
(或pread
,pwrite
)。如果要确保从驱动器而不是从内核缓冲区中物理获取数据,可以使用标志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
。
只需使用open
,lseek
,read
,write
(或pread
,pwrite
)。如果要确保从驱动器而不是从内核缓冲区中物理获取数据,可以使用标志O_DIRECT
打开(尽管必须执行512字节块的对齐读/写才能使其工作)。
Windows平台
对于Windows,有特殊对象\\.\PhisicalDriveX
,其中 X 作为驱动器号,可以使用普通CreateFile API打开。要执行读取或写入,只需调用ReadFile和WriteFile(缓冲区必须在扇区大小上对齐)。
可以在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