这是我的代码,你试试吧,我运行过没问题的:
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <bios.h>
#include <dos.h>
#include <math.h>
#include <dir.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/movedata.h>
#include <go32.h>
#include <dpmi.h>
#define HANDLE_PRAGMA_PACK_PUSH_POP 1
#pragma pack(push,1)
typedef struct
{
unsigned char PacketSize; /* 数据包尺寸(16字节) */
unsigned char Reserved1; /* 置0 */
unsigned char BlockCount; /* 要传输的数据块个数(以扇区为单位) */
unsigned char Reserved2; /* 置0 */
unsigned short BufferAddrOFF; /* 缓冲区偏移地址 */
unsigned short BufferAddrSEG; /* 缓冲区段地址 */
unsigned long long LBA; /* 磁盘起始绝对块地址*/
}
DiskAddressPacket;
#pragma pack(pop)
/* 用扩展13中断,读写大硬盘 */
int ExInt13(char cmd, char driveNum, unsigned long startSector, int sectorNum, char buf[])
{
__dpmi_regs reg;
DiskAddressPacket DAP_package;
memset(&DAP_package, 0, sizeof(DiskAddressPacket));
DAP_package.PacketSize = sizeof(DiskAddressPacket);
DAP_package.BlockCount = sectorNum;
DAP_package.BufferAddrOFF = __tb & 0x0F;
DAP_package.BufferAddrSEG = __tb >> 4;
DAP_package.LBA = startSector;
dosmemput(&DAP_package, sizeof(DiskAddressPacket), __tb + 512 * sectorNum);
reg.h.ah = cmd;
reg.h.dl = driveNum;
reg.h.al = 0; /* 0 为无写校验,1为有 */
reg.x.ds = (__tb + 512 * sectorNum) >> 4;
reg.x.si = (__tb + 512 * sectorNum) & 0x0F;
__dpmi_int(0x13, ®);
if((reg.x.flags & 0x0001) == 0)
{
dosmemget(__tb, 512 * sectorNum, buf);
return 0;
}
else
return(reg.h.ah);
}
int main(void)
{
int i, result, temp;
unsigned long log_sector;
char buf[512];
char s[5];
scanf("%lu", &log_sector); /*输入扇区号*/
result = ExInt13(0x42, 0x80, log_sector, 1, buf); /*读磁盘扇区*/
if (result!= 0) /*判断是否操作成功*/
{
perror("Read Disk Error"); /*不成功显示出错*/
exit(1);
}
printf("Read OK\n"); /*成功显示"ok"*/
for (i=446; i<512; i++) /*循环读出分区表*/
{
if(buf[i] < 0) /*将ascii为负值的变为正值*/
temp = buf[i] + 256;
else
temp = buf[i];
sprintf(s, "%x", temp); /*将分区表内容格式转换为16进制*/
if(temp < 16)
printf("0%s", s); /*输出显示*/
else
printf("%s", s);
printf(" ");
if((i==461)||(i==477)||(i==493)||(i==509))
printf("\n");
}
getch();
return(0);
}