我只想写一个程序来分析C中的MBR。
我知道一些通过 Windows 上的 API 或 Linux 上的命令来阅读它的方法。
但是,我可以在没有任何依赖于平台的限制的情况下在 C 中做到这一点吗?
如果我不能,有什么理由吗?
读取主引导记录取决于平台,例如以下代码可在 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
您的代码并使其依赖于平台。
不,读取 MBR 高度依赖于平台 - 包括如果有多个硬盘,MBR 是什么的问题。最好的希望是一个库,它可以从您的代码中隐藏与平台相关的东西——但您可能必须自己编写它。
通常您需要遵循特定于平台的步骤来获取整个磁盘内容的文件句柄,然后使用该文件来操作 MBR 是相对于平台无关的。
正如 Guntram 所提到的,除了需要确定您想要的硬盘驱动器之外,许多平台还需要从该驱动器卸载所有文件系统,然后才能获得对磁盘的写访问权限。这甚至可能会妨碍您的目标。
如果我不能,有什么理由吗?
POSIX 没有挂载或块设备的概念(特定于 Linux),更不用说 ANSI C。