?? demo.cpp
字號(hào):
#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) /*讀取硬盤參數(shù)以便于LBA數(shù)據(jù)的計(jì)算*/
{
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;/*將得到的數(shù)據(jù)賦值給全局變量*/
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; /*保留字節(jié)*/
unsigned short nob; /*package的個(gè)數(shù)*/
unsigned short bufoff; /*數(shù)據(jù)緩沖區(qū)偏移量*/
unsigned short bufseg;/*數(shù)據(jù)緩沖區(qū)段地址*/
unsigned long slow; /*扇區(qū)起始地址低位*/
unsigned long shi; /*扇區(qū)起始地址高位*/
} 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地址轉(zhuǎn)化成LBA的扇區(qū)地址*/
printf("LBA:%ld.\n", lba);
err = iodisk (drv, cmd, buffer, lba, 0 , copys);/*調(diào)用函數(shù)讀寫扇區(qū)*/
return err;
}
int main ()
{
int i;
unsigned char buffer[512]; /*定義扇區(qū)數(shù)據(jù)區(qū)*/
get_parameter(HDD);/*調(diào)用函數(shù)獲得硬盤參數(shù)*/
//IoSectorEx (HDD, EXT_READ, 0, 0, 1, 1, buffer); /*調(diào)用函數(shù)讀取0柱面0磁頭1扇區(qū)的內(nèi)容*/
unsigned long lba = 0;
printf("start to read from LBA:0 \n");
iodisk (HDD, EXT_READ, buffer, lba, 0 , 1);/*調(diào)用函數(shù)讀寫扇區(qū)*/
for(i=0; i<sizeof(buffer); i++)
{
if (i&&i%32==0) printf("\n");
printf ("%02X ",buffer[i]);/*輸出所讀扇區(qū)的最后一個(gè)字節(jié)*/
}
lba = 61432560;
printf("\nstart to read from LBA:61432560 \n");
iodisk (HDD, EXT_READ, buffer, lba, 0 , 1);/*調(diào)用函數(shù)讀寫扇區(qū)*/
for(i=0; i<sizeof(buffer); i++)
{
if (i&&i%32==0) printf("\n");
printf ("%02X ",buffer[i]);/*輸出所讀扇區(qū)的最后一個(gè)字節(jié)*/
}
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -