我只想編寫一個程序來分析C中的MBR。如何在C中「讀取」MBR(主引導記錄)?
我已經知道了一些通過Windows上的API或Linux上的命令來讀取它的方法。
但是,我可以在C 中做什麼,沒有任何平臺相關的限制?
如果我不行,有什麼理由嗎?
我只想編寫一個程序來分析C中的MBR。如何在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.