/* This file is DPMI_V1.C ** ** this program shows the GDT, IDT and LDT tables ** compile with smallmodel,protected mode instuctions ** link with dpmiutil.obj */ #include #include #include "DPMI.H" #include void protected_program() { GDTR gdtr; /* struct for sgdt,sidt call */ WORD sel,ldtsel,idtsel; DWORD gdtbase,ldtbase,idtbase,handle; WORD gdtlimit,ldtlimit,idtlimit; unsigned i; DESCRIPTOR far *gdt ; GATE far *idt; sgdt(&gdtr) ; printf("\nGDT : limit %04X address %04X%04X \n", gdtr.limit,gdtr.hi,gdtr.lo); printf("LDT selector= %X\n",(ldtsel=sldt()) ); printf("Task selector= %X\n",str()); printf("CS selector= %X ",_CS ); printf("DS selector= %X\n",_DS ); /* now we must alloced one selector and set the address ** to the gdt address and limit */ gdtbase=(DWORD)gdtr.hi<<16 | gdtr.lo ; gdtlimit=gdtr.limit; if ((sel=AllocLDT(1))==0) { printf("error allocldt\n") ; return ; } if ((SetBaseAddress(sel,gdtbase))==-1) { printf("err setbase\n"); return ; } if ((SetLimit(sel,gdtlimit))==-1) { printf("err setlimit\n"); return ; } /* the same procedure for the idt table */ sidt(&gdtr) ; printf("IDT : limit %04X address %04X%04X \n",gdtr.limit,gdtr.hi,gdtr.lo); idtbase=((DWORD)gdtr.hi <<16) | gdtr.lo ; idtlimit=gdtr.limit; printf("GLOBALE DESCRIPTOR TABELLE:\n"); gdt=MK_FP(sel,0); /* this is a protected mode pointer */ gdtlimit++; gdtlimit/=8; /* one descriptor = 8 bytes */ for (i=0;i< gdtlimit ;i++) { printf("g=%2X l=%2X ",i<<3,(i<<3)+5); printdescriptor(gdt[i]); if (ldtsel==i*8) { /* to get the address of the ldt table */ ldtlimit=(DWORD)gdt[i].lim_hi; ldtlimit &= 15; ldtlimit<<=16; ldtlimit|= gdt[i].lim_lo; ldtbase=(DWORD)gdt[i].base_hi; ldtbase<<=8; ldtbase|=gdt[i].base_mi; ldtbase<<=16; ldtbase|=gdt[i].base_lo; } } printf("ldtbase ldt=%lX limit %lX\n",ldtbase,ldtlimit); printf("gebrauchter selektor %X\n",sel); if ((SetBaseAddress(sel,ldtbase))==-1) {printf("err setbase\n"); return ; } ; if ((SetLimit(sel,ldtlimit))==-1) {printf("err setlimit\n"); return ; } ; printf("LOKALE DESCRIPTOR TABELLE:\n"); ldtlimit++; ldtlimit/=8; for (i=0;i< ldtlimit ;i++) { printf("g=%2X l=%2X ",i<<3,(i<<3) +5); printdescriptor(gdt[i]); } printf("INTERRUPT DESCRIPTOR TABELLE:\n"); if ((SetBaseAddress(sel,idtbase))==-1) { printf("err setbase\n"); return ; } if ((SetLimit(sel,idtlimit))==-1) { printf("err setlimit\n"); return ; } idt=MK_FP(sel,0); idtlimit++; idtlimit/=8; for (i=0;i>5); if ((FreeLDT(sel))==-1) { printf("err freeldt\n"); return ; } } void main() { real_to_protected(); protected_program(); protected_to_real(); }