#pragma inline #include #include #include #include #include #include #include #include"tsr.h" #undef putchar() #undef getchar() #define ALT 8 #define C 46 #define CHECK_INSTALLED 0xC001 #define SUCCESS 0xC002 #define FAILURE 0xC003 #define UNINSTALL 0xC004 struct INTERRUPT { unsigned bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,fl; }; void interrupt (*prev_8)(); void interrupt our_8(); void interrupt (*prev_9)(); void interrupt our_9(); void interrupt (*prev_28)(); void interrupt our_28(); void interrupt (*prev_2f)(); void interrupt our_2f(); unsigned size,key,ss,sp,px,py,our_psp; unsigned short want_to_popup,active; unsigned char far *dosbusy,far *kb = (unsigned char far *)0x417; char far (stack[4000]); union REGS ip,op; int store; main(int no_of_args,char *args[]) { if(no_of_args == 1) { ip.x.ax = CHECK_INSTALLED; int86(0x2f,&ip,&op); if(op.x.ax != SUCCESS) { buffer = malloc((16-10)*160+(76-2)*2); if(buffer == NULL) printf("\nInsufficient memory.. Try quitting one or more TSRs"); else { our_psp=getpsp(); getdosflag(); captureint(); /* ebptr=MK_FP(our_psp,0x2c); freemem(*ebptr); */ size = (_DS - _psp)+((unsigned)buffer+((15-10)*160+(75-2)*2)); keep(0,size); } } else printf("\nTSR already in memory ! .. Try pressing ALT + C"); } else if(no_of_args == 2 && !strcmpi(args[1],"\\u")) { ip.x.ax = CHECK_INSTALLED; int86(0x2f,&ip,&op); if(op.x.ax == SUCCESS) { printf("\nUninstalling..."); ip.x.ax = UNINSTALL; int86(0x2f,&ip,&op); if(op.x.ax == FAILURE) printf("\nUninstalling failed ! please reboot the computer"); else if(op.x.ax == SUCCESS) printf("\nUninstallation successfull"); } else printf("\nTSR not in memory"); } } getdosflag() { input.h.ah = 0x34; intdosx(&input,&output,&sregisters); dosbusy = (char far *) MK_FP(sregisters.es,output.x.bx); } captureint() { prev_8 = getvect(8); setvect(8,our_8); prev_9 = getvect(9); setvect(9,our_9); prev_28 = getvect(0x28); setvect(0x28,our_28); prev_2f = getvect(0x2f); setvect(0x2f,our_2f); } void interrupt our_8() { (*prev_8)(); if(want_to_popup==1 && *dosbusy == 0 && active == 0) popup(); } void interrupt our_9() { key = inportb(0x60); if(key == C && (*kb&ALT) == ALT) want_to_popup=1; (*prev_9)(); } void interrupt our_28() { (*prev_28)(); if(want_to_popup==1 && *dosbusy <= 1 && active == 0) popup(); } popup() { active = 1; ss = _SS; sp = _SP; savewin(10,2,16,76); disable(); _SS = FP_SEG(stack); _SP = FP_OFF(stack+3999); enable(); px=wherex(); py=wherey(); realfunction(); disable(); _SS=ss; _SP=sp; enable(); gotoxy(px,py); restorewin(10,2,16,76); active = 0; want_to_popup=0; } realfunction() { } void interrupt (*prev_1b)(); void interrupt (*prev_23)(); void interrupt ctrlbrk_dis(); void interrupt ctrlbrk_dis() { } capctrlbrk() { prev_1b = getvect(0x1B); setvect(0x1B,ctrlbrk_dis); prev_23 = getvect(0x23); setvect(0x23,ctrlbrk_dis); } relctrlbrk() { setvect(0x1B,prev_1b); setvect(0x23,prev_23); } void interrupt our_2f(struct INTERRUPT r) { if(r.ax == CHECK_INSTALLED) { r.ax = SUCCESS; return; } if(r.ax == UNINSTALL) { r.ax = uninstall(); return; } asm pop bp asm pop di asm pop si asm pop ds asm pop es asm pop dx asm pop cx asm pop bx asm pop ax asm jmp cs:_prev_2f; } int uninstall() { if(our_2f == getvect(0x2f)) { setvect(0x2f,prev_2f); setvect(9,prev_9); setvect(8,prev_8); setvect(0x28,prev_28); freemem(our_psp); return(SUCCESS); } else return(FAILURE); } getstring(char chr[]) { char ch; int i; while((ch = getchar()) != '\n') chr[i++]=ch; chr[i]='\0'; }