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

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

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

但是,我可以在没有任何平台相关限制的情况下在C中完成吗?

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

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

#include  #include  #include  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!"< 

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

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

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

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

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

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

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

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

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