主引导扇区丢失,怎样快速查找硬盘分区表?用程序实现! 主引导扇区丢失,怎样快速查找硬盘分区表?用程序实现! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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,®s,®s,&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,®s,®s,&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]);/*输出所读扇区的最后一个字节*/} 用MFC实现半透明的滚动字幕效果 求助-----关于让一个位图的颜色逐渐变化的问题-----人工拉长标题 VC经典书籍 求 写一个往文件中传输2进制数据的函数 视频教程问题 请问各位我的程序中用了链表存放数据,可是现发现当收到数据往一节点存数据时SetAt(), 请问如何将数据库导出到Excel? 各位高手帮帮忙,有个问题请教,急急急 help:如何在installshield中检查所要安装应用程序的支持程序? 关于CToolBar::_GetButton() 如何限制编辑框中只允许输入数字(包括小数点),<新手上路> 请问dc中的路径与剪切区的概念是怎么回事?不太明白
下面是关于利用扩展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,®s,®s,&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,®s,®s,&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]);/*输出所读扇区的最后一个字节*/
}