Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading Hard Disk Sectors in C++ on Linux

Tags:

c++

linux

How do you read hard disk sectors in C++ with gcc/linux? Is there a standard library that I can use or must something be downloaded? In Windows I can use CreateFile(...) to access raw disk sectors, but I do not know how to do in in Linux.

I am using GCC on Ubuntu LTS 10.4. Thank you for your help.

like image 388
Anthoni C Avatar asked Sep 02 '11 21:09

Anthoni C


People also ask

Can Linux read Windows hard drive?

To successfully mount and access NTFS drives on Linux, you will need to install a driver to ensure no incompatibility issues arise. The go-to driver when working with NTFS drives is NTFS-3G. It's cross-compatible between Debian/Ubuntu derivatives, Arch Linux-based systems as well as RHEL/CentOS/Fedora systems.


2 Answers

The hard disk is just another file (not a "regular file" but a "device file", but still, a file). Open it the normal way...

int fdes = open("/dev/sda1", O_RDONLY);
if (fdes < 0)
    err(1, "/dev/sda1");
... do more ...

You will get permission errors unless you have the right permissions. Note that "/dev/sda1" is just an example, it is the first partition on disk sda, the exact path will depend on your system. You can list mount points with the mount command, and you can access entire disks (instead of just partitions) using /dev/sda, /dev/sdb, etc.

You could also open it as a C++ fstream or C FILE, but I do not recommend this. You will have a better time finding example code and getting help on forums if you use open instead.

like image 173
Dietrich Epp Avatar answered Oct 11 '22 18:10

Dietrich Epp


As others have correctly pointed out, disk access on Linux (and other Unix-like operating systems) is via a device special file. On my Ubuntu laptop, my hard drive is named "/dev/sda".

Since you specifically ask how to do it in C++ (not merely how to do it in Linux), here is how to read one sector using 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)));
}
like image 30
Robᵩ Avatar answered Oct 11 '22 16:10

Robᵩ