如何";改为;C中的MBR(主引导记录)?

如何";改为;C中的MBR(主引导记录)?,c,mbr,C,Mbr,我只想用C写一个程序来分析MBR 我知道通过Windows上的API或Linux上的命令来阅读它的一些方法 但是,我可以在C中执行此操作而不受任何平台相关限制吗 如果我不能,有什么原因吗?不,读取MBR是高度依赖于平台的-包括如果有多个硬盘,“MBR”是什么的问题。您最希望的是一个库,它可以从您的代码中隐藏与平台相关的内容,但您可能必须自己编写。读取主引导记录是与平台相关的,例如,以下代码在Windows上工作(如果您有权这样做) 最好的解决方案是#ifdef您的代码并使其依赖于平台。通常您需要

我只想用C写一个程序来分析MBR

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

但是,我可以在C中执行此操作而不受任何平台相关限制吗


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

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

读取主引导记录是与平台相关的,例如,以下代码在Windows上工作(如果您有权这样做)


最好的解决方案是
#ifdef
您的代码并使其依赖于平台。

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

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

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


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

是否可以在引导加载程序(没有api)中执行此操作?@MacroA
#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();

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