2014-02-08 57 views
2

我只想编写一个程序来分析C中的MBR。如何在C中“读取”MBR(主引导记录)?

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

但是,我可以在C 中做什么,没有任何平台相关的限制

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

回答

5

读取主引导记录是与平台相关的,比如下面的代码在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你的代码,使其平台依赖性。

5

不,读取MBR是高度依赖于平台的 - 包括如果存在多个硬盘时“MBR”是什么的问题。你最好希望的是一个图书馆,它隐藏了你的代码中依赖于平台的东西 - 但你可能必须自己写。

3

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

除了需要确定您想要的硬盘驱动器之外,正如Guntram所述,许多平台都要求在获得对磁盘的写入权限之前,从该驱动器卸下所有文件系统。这甚至可能妨碍你的目标。

0

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

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