2011-09-02 49 views
7

如何使用gcc/linux讀取C++中的硬盤扇區?是否有我可以使用的標準庫或必須下載的東西?在Windows中,我可以使用CreateFile(...)訪問原始磁盤扇區,但我不知道如何在Linux中執行操作。在Linux上使用C++讀取硬盤扇區

我在Ubuntu LTS 10.4上使用GCC。感謝您的幫助。

回答

11

硬盤只是另一個文件(不是「常規文件」,而是「設備文件」,但仍然是一個文件)。以正常方式打開它...

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代替,您將有更好的時間查找示例代碼並獲得論壇幫助。

+1

'的/ dev/sda1'將是一個分區......對原始驅動器訪問你可能想用'的/ dev/sda' –

+0

+1「只是一個文件」,而不是搞亂' dd'。要小心權限,你可能需要成爲磁盤組或root的成員(不是一個好主意)才能這樣做。 – Flexo

+0

這將是非常有幫助的。 –

1

你可以轉儲磁盤扇區用dd命令文件和讀取文件生成

7

正如其他人正確地指出,在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))); 
} 
+0

謝謝你,這是非常有用的代碼。 –