主引导扇区丢失,怎样快速查找硬盘分区表?用程序实现!

解决方案 »

  1.   

    MBR丢失后,仍然可以通过DPT链来找到其它分区的信息。通常,第一个分区都从LBA63扇区(CHS表示法就是0柱面1磁头0扇区)开始(前头为包含MBR在内的63个隐含扇区),第一个扇区即LBA63就是分区DPT,EA为1BE的地方保存着本分区的DPT,再加16个字节处的第二个DPT表指示下一分区的DPT表。利用BIOS 扩展int 13功能就可以根据DPT表链不断追踪下去,直到找到所有的分区。
    下面是关于利用扩展int 13读取磁盘的C代码(不过不是我写的,手头只有这一段代码,给你看看先啦):#include <dos.h>
    #include <stdio.h>
    #define EXT_READ 0x42
    #define EXT_WRITE 0x43
    #define HDD 0x80unsigned long CYLINDERS, HEADS, SECTORS;typedef unsigned char BYTE;
    typedef unsigned short WORD;
    typedef unsigned long DWORD;int get_parameter (int drive) /*读取硬盘参数以便于LBA数据的计算*/
    {
        union REGS regs;
        struct SREGS sregs;
        struct {
               WORD size;
               WORD inforflags;
               DWORD cylns;
               DWORD heads;
               DWORD sects;
               DWORD tslow;
               DWORD tshi;
               WORD  bps;
        } package;
        regs.h.ah=0x48;
        regs.h.dl=drive;
        sregs.ds=FP_SEG(&package);
        regs.x.si=FP_OFF(&package);
        int86x(0x13,&regs,&regs,&sregs);
        CYLINDERS = package.cylns;/*将得到的数据赋值给全局变量*/
        HEADS = package.heads;
        SECTORS = package.sects;
        if (regs.h.ah) return (regs.h.ah);
        else return 0;
    }int iodisk(unsigned char drv, unsigned char cmd, unsigned char *buffer,
    unsigned long startlow, unsigned long starthi, unsigned short copyblk)
    {
        union REGS regs;
        struct SREGS sregs;
        struct {
               unsigned char len; /*package的大小*/
               unsigned char res; /*保留字节*/
               unsigned short nob; /*package的个数*/
               unsigned short bufoff; /*数据缓冲区偏移量*/
               unsigned short bufseg;/*数据缓冲区段地址*/
               unsigned long  slow; /*扇区起始地址低位*/
               unsigned long  shi; /*扇区起始地址高位*/
               } package;           package.len=sizeof(package);
               package.res=0;
               package.nob=copyblk;
               package.bufoff=FP_OFF(buffer);
               package.bufseg=FP_SEG(buffer);
               package.slow=startlow;
               package.shi=starthi;
               regs.h.ah=cmd;
               regs.h.dl=drv;
               regs.h.al=0;
               sregs.ds=FP_SEG(&package);
               regs.x.si=FP_OFF(&package);
               int86x(0x13,&regs,&regs,&sregs);
               if (regs.h.ah) return (regs.h.ah);
               else return (0);
    }int  IoSectorEx (unsigned char drv, unsigned char cmd, unsigned long cylinder,unsigned long head, unsigned long sector, unsigned long copys, unsigned char *buffer)
    {
        int err;
        unsigned long lba;
        lba = ((cylinder * HEADS + head) * SECTORS ) + sector - 1; /*将CHS地址转化成LBA的扇区地址*/
        err = iodisk (drv, cmd, buffer, lba, 0 , copys);/*调用函数读写扇区*/
        return err;
    }void main ()
    {
    unsigned char buffer[512]; /*定义扇区数据区*/
    get_parameter(HDD);/*调用函数获得硬盘参数*/
    IoSectorEx (HDD, EXT_READ, 0, 0, 1, 1, buffer); /*调用函数读取0柱面0磁头1扇区的内容*/
    printf ("%X\n",buffer[511]);/*输出所读扇区的最后一个字节*/
    }