【问题标题】:How to "read" the MBR (Master Boot Record) in C?如何在 C 中“读取”MBR(主引导记录)?
【发布时间】:2014-02-08 15:20:52
【问题描述】:

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

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

但是,我可以在 C 中不受任何平台相关限制吗?

如果不能,有什么原因吗?

【问题讨论】:

    标签: c mbr


    【解决方案1】:

    读取主引导记录取决于平台,例如以下代码可在 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 您的代码并使其依赖于平台。

    【讨论】:

    • 是否可以在引导加载程序中进行(没有 api)?@MacroA
    【解决方案2】:

    不,读取 MBR 高度依赖于平台 - 包括如果有多个硬盘,MBR 是什么的问题。最好的希望是一个库,它可以从您的代码中隐藏与平台相关的内容 - 但您可能必须自己编写。

    【讨论】:

      【解决方案3】:

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

      正如 Guntram 所提到的,除了需要确定您想要的硬盘驱动器之外,许多平台还要求您从该驱动器卸载所有文件系统,然后才能获得对磁盘的写访问权限。这甚至可能会妨碍您的目标。

      【讨论】:

        【解决方案4】:

        如果不能,有什么原因吗?

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

        【讨论】:

          猜你喜欢
          • 2018-03-17
          • 2021-04-21
          • 2013-04-04
          • 2019-07-04
          • 2023-02-26
          • 1970-01-01
          • 2020-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多