20011010wo 发表于 2016-7-31 22:27:19

简单MBR读取库的实现

本帖最后由 20011010wo 于 2016-7-31 23:01 编辑

<div class="blockcode"><blockquote>#define WIN32_LEAN_AND_MEAN            

#include <windows.h>
#include <io.h>
#include <sys\stat.h>
#include <sys\types.h>
#include <share.h>
#include <fcntl.h>
#include <cstdlib>

#include <string>
struct MBRPartitionTable
{
      unsigned char bootsign;
      unsigned char start_chsaddress;
      unsigned char type;
      unsigned char end_chsaddress;
      unsigned char used_sectorsnum;
      unsigned char total_sectorsnum;
};
struct MBR
{
      unsigned char bootstrapcode;
      MBRPartitionTable a;
      MBRPartitionTable b;
      MBRPartitionTable c;
      MBRPartitionTable d;
      unsigned char endsign;
};
// 物理驱动器对象
class PhysicalDrive
{
public:
      PhysicalDrive(void) : drive(L"\\\\.\\PhysicalDrive"), drive_index(0){}      //构造函数
      std::wstring GetDriveName(void)                                                                                        //获取存储设备名称
      {
                wchar_t drive_index_buffer;
                _itow_s(drive_index, drive_index_buffer, 8, 10);                                        //int 转 wcahr_t
                return drive + drive_index_buffer;
      }
private:
      std::wstring drive;                                                   //存储设备部分名称
      int drive_index;                                                                              //存储设备号
};

class Libmbr {
public:
      Libmbr(void) = delete;                                                          //不允许合成构造函数
      Libmbr(PhysicalDrive);                                                                        //构造函数
      bool ReadMBR();                                                                                       //读MBR函数
      bool WriteMBR();                                                                                    //写MBR函数
      MBR code = {0};                                                            //将要写入的数据
private:
      bool ReadWriteMBR(bool);                                                   //内部实现函数
      PhysicalDrive m_drive;                                                          //存储设备对象
      int iFileHandler;                                                            //文件句柄
};

#include "libmbr.h"



inline Libmbr::Libmbr(PhysicalDrive drive) :m_drive(drive) {}      //构造函数

inline bool Libmbr::ReadMBR()
{
      return ReadWriteMBR(true);
}

inline bool Libmbr::WriteMBR()
{
      return ReadWriteMBR(false);
}


bool Libmbr::ReadWriteMBR(bool isRead)
{
      //打开设备
      if (_wsopen_s(&iFileHandler, m_drive.GetDriveName().c_str(), _O_BINARY | _O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE))
                return false;
      //判断是否至EOF
      if (_eof(iFileHandler))
                return false;
      //移动至起始点
      if (_lseek(iFileHandler, 0, SEEK_SET) == -1)
                return false;
      //读写属性
      if (isRead)
      {
                if (_read(iFileHandler, &code, 512) == -1)      //读512个字
                        return false;
      }
      else
      {
                if (_write(iFileHandler, &code, 512) == -1)      //写512个字
                        return false;
      }
      //刷新设备缓冲
      if (_commit(iFileHandler) == -1)
                return false;
      //关闭句柄
      if (_close(iFileHandler) == -1)
                return false;
      return true;
}


20011010wo 发表于 2016-7-31 22:32:35

补充:还有数据结构还没加入

20011010wo 发表于 2016-7-31 23:02:10

加入了

nkc3g4 发表于 2016-7-31 23:12:54

赞~
页: [1]
查看完整版本: 简单MBR读取库的实现