⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo.cpp

📁 dos启动下
💻 CPP
字号:
#include <dos.h>
#include <stdio.h>

#define EXT_READ 0x42
#define EXT_WRITE 0x43
#define HDD 0x80

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
unsigned long CYLINDERS, HEADS, SECTORS;
 
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的扇区地址*/
    printf("LBA:%ld.\n", lba);
    err = iodisk (drv, cmd, buffer, lba, 0 , copys);/*调用函数读写扇区*/
    return err;
}

int main ()
{
	int i;
	unsigned char buffer[512]; /*定义扇区数据区*/
	get_parameter(HDD);/*调用函数获得硬盘参数*/
	//IoSectorEx (HDD, EXT_READ, 0, 0, 1, 1, buffer); /*调用函数读取0柱面0磁头1扇区的内容*/
	
	unsigned long lba = 0;
	printf("start to read from  LBA:0 \n");
	iodisk (HDD, EXT_READ, buffer, lba, 0 , 1);/*调用函数读写扇区*/
	for(i=0; i<sizeof(buffer); i++)
	{
		if (i&&i%32==0)  printf("\n");
		printf ("%02X ",buffer[i]);/*输出所读扇区的最后一个字节*/
	}
	
	
	lba = 61432560;
	printf("\nstart to read from  LBA:61432560 \n");
	iodisk (HDD, EXT_READ, buffer, lba, 0 , 1);/*调用函数读写扇区*/
	
	
	for(i=0; i<sizeof(buffer); i++)
	{
		if (i&&i%32==0)  printf("\n");
		printf ("%02X ",buffer[i]);/*输出所读扇区的最后一个字节*/
	}
	
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -