读取磁盘MBR及分区信息

风行水上 @ 2010-07-01 17:14:53
标签:

    主要是磁盘的底层操作。明白了道理,就知道一些磁盘工具其实并没那么神秘。

    用debug程序读取磁盘 MBR

    -a 100 
    mov ax, 0201   ; AH=02 代表“读”, (AL=要读的扇区数)
    mov bx, 0200   ; 运行结果放在内存地址 0200 处 
    mov cx, 1      ;
    mov dx, 80     ; (DH=磁头, DL=0、1软盘,80、81硬盘)  80 代表第一硬盘 
    int 13         ; 调用磁盘中断 
    int 20         ; 结束程序 
    -g =100        ; 从 100 处开始运行程序 
    -d 200         ; 显示主引导记录 
    

    Windows 下用 C/C++ 程序读取 MBR及分区信息

    在Windows上Mingw 环境下编译通过。

    #include <stdio.h>
    #include <windows.h>
    
    // 一个扇区可能的字节数为128×2n (n=0,1,2,3)。大多情况下,取n=2,为512字节
    const static int DISK_SECTOR_SIZE = 512;
    
    int read_mbr(const char *devname){
      char buffer[DISK_SECTOR_SIZE];  
    
      HANDLE hDev = CreateFile(devname, GENERIC_READ,   
                      FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);  
      if (hDev == INVALID_HANDLE_VALUE){  
          printf("Open %s FAIL.\n", devname);  
          exit(0);  
      }  
      printf("Open %s PASS.\n", devname);  
    
      //SetFilePointer(hDev, 0, 0, FILE_BEGIN);  
      int  cb;  
      BOOL ret = (BOOL) ReadFile(hDev, buffer, 512, (DWORD*) &cb, NULL);  
      CloseHandle(hDev);  
      if ( 0 == ret || DISK_SECTOR_SIZE != cb)  {  
         printf("Error: read error! ret=%d #bytes=%d\n", ret, cb);  
         exit(0);  
      }  
    
      printf("#bytes =  %d\n", cb);  
      printf("%10s 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f \n", " ");  
      for (int i=0 ;i<32 ;i++ ){  
          printf("%.8Xh: ", i);  
          for (int j=0 ;j<16 ;j++ ){
              printf("%.2x ", buffer[i*16+j] & 0xFF);  
          }  
          printf("\n");  
      }  
    
      printf("====MBR Partition Entry====\n");
      for(int i=0x01be; i<0x01FE; i+=16){
          for (int j=0 ;j<16 ;j++ ){  
              printf("%02x ", buffer[i + j] & 0xFF);  
          }  
          int d_status   = buffer[i+0] & 0xff;
          int d_format   = buffer[i+4] & 0xff;
    
          int s_head     = buffer[i+1] & 0xff;
          int s_sector   = buffer[i+2] & 0x3f;
          int s_cylinder = (((buffer[i+2] & 0xff) >> 6) << 8) + (buffer[i+3] & 0xff);
    
          int e_head     = buffer[i+5] & 0xff;
          int e_sector   = buffer[i+6] & 0x3f;
          int e_cylinder = (((buffer[i+6] & 0xff >> 6)) << 8) + (buffer[i+7] & 0xff);
    
          unsigned int sector_offset = *((unsigned int*)(buffer+i+8));
          unsigned int sector_size   = *((unsigned int*)(buffer+i+12));
          printf("\n");
    
          long d_mbytes = sector_size/1024*DISK_SECTOR_SIZE/1024/1024;
    
          printf("%02x | %02x | (%d, %d, %d) (%d, %d, %d) | %d+%d = %i GB\n", 
    	      d_status, d_format,
    	      s_cylinder, s_head, s_sector, e_cylinder, e_head, e_sector,
    	      sector_offset, sector_size,  d_mbytes);
          printf("\n");
      }
       
      return 0;
    }
    
    int main(int argc, char *argv[]){  
        //-- read_mbr("\\\\.\\C:");
        read_mbr("\\\\.\\PhysicalDrive0");
        return 0;
    }
    
    /****** Demo Output ******
    ====MBR Partition Entry====
    80 01 01 00 07 fe ff ff 3f 00 00 00 82 37 f9 0d 
    80 | 07 | (0, 1, 1) (1023, 254, 63) | 63+234436482 = 111 GB
    */
    

    相关资源

    标签:

      分享到:
      comments powered by Disqus

      29/33ms