如何在C中“读取”MBR(主引导记录)?

时间:2014-02-08 15:20:53

标签: c mbr

我只想编写一个程序来分析C中的MBR。

我已经知道一些方法可以通过Windows上的API或Linux上的命令来读取它。

但是,我可以在C 中进行此操作而不存在任何与平台相关的限制吗?

如果我不能,有什么理由吗?

4 个答案:

答案 0 :(得分:6)

读取主引导记录与平台有关,以下代码适用于Windows(如果您有权执行此操作)

#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;
short ReadSect
       (const char *_dsk,    // disk to access
       char *&_buff,         // buffer where sector will be stored
       unsigned int _nsect   // sector number, starting with 0
       )
{
  DWORD dwRead;   
  HANDLE hDisk=CreateFile(_dsk,GENERIC_READ,FILE_SHARE_VALID_FLAGS,0,OPEN_EXISTING,0,0);
  if(hDisk==INVALID_HANDLE_VALUE) // this may happen if another program is already reading from disk
    {  
       CloseHandle(hDisk);
       return 1;
    }
  SetFilePointer(hDisk,_nsect*512,0,FILE_BEGIN); // which sector to read

  ReadFile(hDisk,_buff,512,&dwRead,0);  // read sector
  CloseHandle(hDisk);
  return 0;
}

int main()
{
  char * drv="\\\\.\\C:"; 
  char *dsk="\\\\.\\PhysicalDrive0";
  int sector=0;

  char *buff=new char[512];
  ReadSect(dsk,buff,sector);
  if((unsigned char)buff[510]==0x55 && (unsigned char)buff[511]==0xaa) cout <<"Disk is bootable!"<<endl;


  getchar();

}

http://www.cplusplus.com/forum/windows/18019/

在Linux上,您甚至可以使用终端命令

sudo dd if=/dev/sda ibs=512 count=1 | hexdump -C

最佳解决方案是#ifdef您的代码,并使其与平台相关。

答案 1 :(得分:5)

不,阅读MBR是高度依赖于平台的 - 包括如果有多个硬盘,“MBR”是什么的问题。你可以期待的最好的是一个隐藏代码中依赖于平台的东西的库 - 但是你可能必须自己编写。

答案 2 :(得分:3)

通常,您需要遵循特定于平台的步骤来获取整个磁盘内容的文件句柄,然后使用该文件操作MBR与平台无关。

除了需要识别您想要的硬盘驱动器之外,正如Guntram所提到的,许多平台都要求在您获得对磁盘的写入权限之前从该驱动器卸载所有文件系统。这甚至可能妨碍您的目标。

答案 3 :(得分:0)

  

如果我不能,有什么理由吗?

POSIX没有安装或阻止设备的概念(特定于Linux),更不用说ANSI C。