Как прочитать MBR (основную загрузочную запись) в C?

Я просто хочу написать программу для анализа MBR на C.

Я знаю несколько способов прочитать его с помощью API в Windows или команд в Linux.

Но могу ли я сделать это на C без каких-либо ограничений, зависящих от платформы?

Если я не могу, есть ли причина?


c mbr
person Kevin Dong    schedule 08.02.2014    source источник


Ответы (4)


Чтение основной загрузочной записи зависит от платформы, например, следующий код работает в 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 ваш код и сделать его зависимым от платформы.

person Marco A.    schedule 08.02.2014
comment
Можно ли это сделать в загрузчике (без API)? @MacroA - person Ebrahim Karimi; 26.04.2019

Нет, чтение MBR сильно зависит от платформы, включая вопрос, что такое MBR, если имеется более одного жесткого диска. Лучшее, на что вы можете надеяться, это библиотека, которая скрывает зависящие от платформы вещи из вашего кода, но вам, вероятно, придется написать это самостоятельно.

person Guntram Blohm    schedule 08.02.2014

Обычно вам нужно выполнить шаги, специфичные для платформы, чтобы получить дескриптор файла для всего содержимого диска, тогда использование этого файла для управления MBR относительно не зависит от платформы.

В дополнение к необходимости определить, какой жесткий диск вам нужен, как упоминает Гунтрам, многие платформы требуют, чтобы все файловые системы были размонтированы с этого диска, прежде чем вы сможете получить доступ для записи на диск. Это может даже помешать вашей цели.

person Potatoswatter    schedule 08.02.2014

Если я не могу, есть ли причина?

В POSIX нет понятия монтирования или блокировки устройств (специфичных для Linux), не говоря уже о ANSI C.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 04.10.2015