如何使用gcc/linux讀取C++中的硬盤扇區?是否有我可以使用的標準庫或必須下載的東西?在Windows中,我可以使用CreateFile(...)訪問原始磁盤扇區,但我不知道如何在Linux中執行操作。在Linux上使用C++讀取硬盤扇區
我在Ubuntu LTS 10.4上使用GCC。感謝您的幫助。
如何使用gcc/linux讀取C++中的硬盤扇區?是否有我可以使用的標準庫或必須下載的東西?在Windows中,我可以使用CreateFile(...)訪問原始磁盤扇區,但我不知道如何在Linux中執行操作。在Linux上使用C++讀取硬盤扇區
我在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
,訪問整個磁盤(而不僅僅是分區)等
你也可以打開它作爲一個C++ fstream
或C FILE
,但我不推薦這個。如果您使用open
代替,您將有更好的時間查找示例代碼並獲得論壇幫助。
你可以轉儲磁盤扇區用dd命令文件和讀取文件生成
正如其他人正確地指出,在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)));
}
謝謝你,這是非常有用的代碼。 –
'的/ dev/sda1'將是一個分區......對原始驅動器訪問你可能想用'的/ dev/sda' –
+1「只是一個文件」,而不是搞亂' dd'。要小心權限,你可能需要成爲磁盤組或root的成員(不是一個好主意)才能這樣做。 – Flexo
這將是非常有幫助的。 –