unsigned char TheBuffer[50];
unsigned char Buffer[20];
//参数seg在这里是高16位,offset是低16位,需要取得值在他们表示的后16字节后。
int fetch_high(unsigned int seg,unsigned int offset)
{
unsigned int i;
union REGS in,out;
struct SREGS segregs;
//GDT的前16字节和后16字节。
for(i=0;i<16;i++)
{
TheBuffer[i] = 0;
TheBuffer[0x20 + i] = 0;
}
TheBuffer[0x10]=16;
TheBuffer[0x11]=0;
TheBuffer[0x12]=peekb(seg,offset + 0x10);//低16位中的低8位 值00
TheBuffer[0x13]=peekb(seg,offset + 0x11);//低16位中的高16位 值00
TheBuffer[0x14]=peekb(seg,offset + 0x12);//高16位中的低8位 值FF
TheBuffer[0x15]=0x93;//权限
TheBuffer[0x16]=0;
TheBuffer[0x17]=peekb(seg,offset + 0x13);//高16位中的高8位 值03
TheBuffer[0x18]=16;
TheBuffer[0x19]=0;
i = FP_OFF(Buffer);//想把高端的内存数值复制到本地的数组内
TheBuffer[0x1A]=i & 0xFF;
TheBuffer[0x1B]=i & 0xFF00;
i = FP_SEG(Buffer);
TheBuffer[0x1C]=i & 0xFF;
TheBuffer[0x1D]=0x93;
TheBuffer[0x1E]=0;
TheBuffer[0x1F]=i & 0xFF00;
segregs.es = FP_SEG(TheBuffer);
in.x.si = FP_OFF(TheBuffer);
in.h.ah = 0x87;
in.x.cx = 8;
//以下显示信息为了校验测试。
for(i=0;i<16;i++)
printf("%2x ",TheBuffer[i]);
printf("\n");
for(i=0;i<16;i++)
printf("%2x ",TheBuffer[0x10 + i]);
printf("\n");
for(i=0;i<16;i++)
printf("%2x ",TheBuffer[0x20 + i]);
printf("\n");
int86x(0x15, &in, &out, &segregs);
if(out.x.cflag == 1)
{
printf("fetch_high error \n");
return 0;//error
}
for(i=0;i<16;i++)
printf("%2x ",Buffer[i]);
return 1;
}