📄 demo.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,®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的扇区地址*/
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 + -