如何使用gcc/linux通过C++读取硬盘扇区?是否有我可以使用的标准库或必须下载某些内容?在Windows中,我可以使用CreateFile(...)访问原始磁盘扇区,但我不知道如何在Linux中实现。
我正在Ubuntu LTS 10.4上使用GCC。感谢您的帮助。
硬盘只是另一个文件(不是“普通文件”而是“设备文件”,但仍然是一个文件)。 以正常方式打开它即可...
int fdes = open("/dev/sda1", O_RDONLY);
if (fdes < 0)
err(1, "/dev/sda1");
... do more ...
你需要正确的权限才能避免许可错误。请注意,"/dev/sda1"
只是一个示例,它是磁盘 sda
上的第一个分区,确切路径将取决于您的系统。您可以使用 mount
命令列出挂载点,并且您可以使用 /dev/sda
、/dev/sdb
等来访问整个磁盘(而不仅仅是分区)。fstream
或者 C 的 FILE
来打开文件,但我不推荐这样做。如果你使用 open
,你会更容易找到示例代码并在论坛上获得帮助。正如其他人正确指出的那样,在Linux(和其他类Unix操作系统)上,磁盘访问是通过设备特殊文件进行的。在我的Ubuntu笔记本电脑上,我的硬盘命名为“/dev/sda”。
由于您特别要求使用C++来完成它(不仅仅是在Linux中完成),这里是使用std::ifstream
读取一个扇区的方法。
#include <fstream>
#include <cerrno>
#include <stdexcept>
#include <cstring>
#include <vector>
int main() {
// Which disk?
char diskName[] = "/dev/sda";
std::string diskError = std::string() + diskName + ": ";
// Open device file
std::ifstream disk(diskName, std::ios_base::binary);
if(!disk)
throw(std::runtime_error(diskError + std::strerror(errno)));
// Seek to 54321'th sector
disk.seekg(512 * 54321);
if(!disk)
throw(std::runtime_error(diskError + std::strerror(errno)));
// Read in one sector
std::vector<char> buffer(512);
disk.read(&buffer[0], 512);
if(!disk)
throw(std::runtime_error(diskError + std::strerror(errno)));
}
你可以使用dd命令将磁盘扇区转储到文件中,并读取生成的文件
/dev/sda1
是一个分区......如果需要原始驱动器访问,您可能会想要使用/dev/sda
。 - David Zdd
。注意权限,你可能需要成为磁盘组的成员或者 root 用户(这不是个好主意)才能执行此操作。 - Flexo