如何用C语言“读取”MBR(主引导记录)?

3

我想用C语言编写一个分析MBR的程序。

我知道通过Windows API或Linux命令可以读取MBR。

但是,是否可以没有任何平台依赖限制地在C中实现呢?

如果不能,是否有任何原因?

4个回答

8

读取主引导记录是与平台相关的,例如以下代码适用于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();

}

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

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

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

最好的解决方案是对您的代码进行#ifdef处理,并使其与平台相关。


能否在引导加载程序中(无 API)完成此操作?@MacroA - Ebrahim Karimi

5
不,读取MBR与平台高度相关,其中一个问题是如果有多个硬盘,“the” MBR 是什么。最好的方法是使用库来隐藏与平台有关的细节,但你可能需要自己编写该库。

3
通常情况下,您需要按照特定于平台的步骤获取到整个磁盘内容的文件句柄,然后使用该文件来操作MBR相对来说是平台无关的。
除了需要确定您想要的硬盘之外,正如Guntram所提到的,许多平台都要求在您获得对磁盘的写访问权限之前,必须卸载该驱动器上的所有文件系统。这甚至可能会阻止您的目标实现。

0
如果我不能,有什么原因吗?
POSIX没有挂载或块设备的概念(仅适用于Linux),更不用说ANSI C了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接