分区体系与文件系统——分区体系(中)-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 301094
  • 博文数量: 33
  • 博客积分: 132
  • 博客等级: 入伍新兵
  • 技术积分: 1002
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-16 22:24
个人简介

学习计算机科学与技术专业,喜欢计算机,喜欢linux,喜欢编程

文章存档

2014年(7)

2013年(12)

2012年(14)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: c/c

2013-06-16 18:25:52

这个是 linux c实现的读取mbr的代码:

(我的系统是 64 位 fedora 18,编译环境是 gcc 4.7.2)                                     


  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <stdlib.h>

  7. #define mbr_table 512 //mbr分区表大小

  8. #define partition_offset 446 //分区表项的起始位置
  9. #define partition_start 16             //分区大小

  10. typedef struct mbr_struct
  11. {
  12.     unsigned char active_record; //0x00表示非活动记录,0x80表示活动记录
  13.     unsigned char start[3];  //起始磁头号,扇区号,柱面号。其中磁头号1字节,扇区号2字节的低6位,柱面号2字节的高2位3字节
  14.     unsigned char partition_type;     //分区类型
  15.     unsigned char end[3];             //结束磁头号
  16.     unsigned int start_sector;         //逻辑起始扇区号
  17.     unsigned int occupy_sector_num; //占用的扇区数
  18. }mbr_read;


  19. void print_mbr_info(mbr_read *mbr)
  20. {
  21.     printf("(第1字节)分区活动标记: hhx\n", mbr->active_record);
  22.     
  23.     printf("(第2、3、4字节)分区起始磁头、扇区、柱面号:");
  24.     printf("hhxhhxhhx\n", mbr->start[0], mbr->start[1], mbr->start[2]);
  25.     
  26.     printf("(第5字节)分区类型: hhx\n", mbr->partition_type);
  27.     
  28.     printf("(第6、7、8字节)分区结束磁头、扇区、柱面号:");
  29.     printf("hhxhhxhhx\n", mbr->end[0], mbr->end[1], mbr->end[2]);
  30.     
  31.     printf("(第9、10、11、12字节)逻辑起始扇区号:%u\n", mbr->start_sector);
  32.     
  33.     printf("(第13、14、15、16字节)所占扇区数量: %u\n", mbr->occupy_sector_num);
  34. }


  35. int main(int argc, char *argv[])
  36. {
  37.     
  38.     int fd, size, index;
  39.     char mbr_buffer[mbr_table];
  40.     mbr_read *mbr;



  41.     /*打开文件和错误信息处理*/
  42.     fd = open("/dev/sda", o_rdonly); //这个一定要注意,以只读打开。防止对mbr的误操作
  43.     if ( fd == 0 )
  44.     {
  45.         printf("open failed!\n");
  46.         exit(0);
  47.     }

  48.     size = read(fd, mbr_buffer, sizeof(mbr_buffer));

  49.     if ( size == -1 )
  50.     {
  51.         printf("权限不够,请用root权限操作!\n");
  52.         exit(0);
  53.     }
  54.     close(fd);



  55.     /*打印mbr信息,十六进制码*/
  56.     for (index = 0; index < mbr_table; index)
  57.     {
  58.         printf("hhx ", mbr_buffer[index]);
  59.     
  60.         if (( index 1 ) % 32 == 0)
  61.         {
  62.             printf("\n");
  63.         }
  64.     }
  65.     printf("\n\n\n");



  66.     /*打印分区表项信息*/
  67.     printf("打印分区表项信息\n");
  68.     printf("\n分区表项 1:\n\n");
  69.     printf("当前分区数据:");
  70.     for (index = partition_offset partition_start * 0; index < partition_offset partition_start * 1; index)
  71.     {
  72.         printf("hhx ", mbr_buffer[index]);
  73.     }
  74.     printf("\n\n");
  75.     print_mbr_info((mbr_read *)(mbr_buffer partition_offset partition_start * 0));
  76.     



  77.     printf("\n\n分区表项 2:\n\n");
  78.     printf("当前分区数据:");
  79.     for (index = partition_offset partition_start * 1; index < partition_offset partition_start * 2; index)
  80.     {
  81.         printf("hhx ", mbr_buffer[index]);
  82.     }
  83.     printf("\n\n");
  84.     print_mbr_info((mbr_read *)(mbr_buffer partition_offset partition_start * 1));



  85.     
  86.     printf("\n\n分区表项 3:\n\n");
  87.     printf("当前分区数据:");
  88.     for (index = partition_offset partition_start * 2; index < partition_offset partition_start * 3; index)
  89.     {
  90.         printf("hhx ", mbr_buffer[index]);
  91.     }
  92.     printf("\n\n");
  93.     print_mbr_info((mbr_read *)(mbr_buffer partition_offset partition_start * 2));


  94.     

  95.     printf("\n\n分区表项 4:\n\n");
  96.     printf("当前分区数据:");
  97.     for (index =partition_offset partition_start * 3; index < partition_offset partition_start * 4; index)
  98.     {
  99.         printf("hhx ", mbr_buffer[index]);
  100.     }
  101.     printf("\n\n");
  102.     print_mbr_info((mbr_read *)(mbr_buffer partition_offset partition_start * 3));


  103.     return 0;

  104. }
阅读(2170) | 评论(2) | 转发(2) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图