textattr(11);
cprintf("\n\r Программа tc_lab16 уже загружена."
" Попытка повторной инсталляции!");
textattr(7);
cprintf("\n\r");
}
else{ /* Программа не резидентна */
my_context();
old9= _dos_getvect(9);
disable();
_dos_setvect(9,new9);
rr.h.ah=0x48; rr.x.bx=2;
intdos(&rr,&rr); jmp_segm=rr.x.ax;
jmpar=(struct far_jmp far *)MK_FP(jmp_segm,0);
old2F=_dos_getvect(0x2F);
jmpar->jmp=0xea;
jmpar->int_h=(void interrupt far (*)(...))new2F;
_dos_setvect(0x2F,(void interrupt far(*)(...))jmpar);
a_2F.segm=FP_SEG(old2F);
a_2F.offs=FP_OFF(old2F);
enable();
text_print();
rr.h.ah=0x31;
rr.h.al=0;
rr.x.dx=TSR_size;
intdos(&rr,&rr);
}
return 0;
}
void my_context(void)
{
tsr_stack.segm=_SS;
tsr_stack.offs=_SP-100;
rr.h.ah=0x2f;
intdosx(&rr,&rr,&sr);
tsr_dta.segm=sr.es;
tsr_dta.offs=rr.x.bx;
/* сохранение своего PID */
rr.h.ah=0x62;
intdos(&rr,&rr);
tsr_pid=rr.x.bx;
}
/* сообщение о установке резидентной программы */
void text_print(void)
{
textattr(10);
cprintf("\n");
cprintf("▓▓▓▓▓▒▒▒▒▒░░░░░");
cprintf(" Лабораторная работа N16 ");
cprintf("░░░░░▒▒▒▒▒▓▓▓▓▓");
cprintf("▓▓▓▓▓▒▒▒▒▒░░░░░");
cprintf(" Резидентная программа ");
cprintf("░░░░░▒▒▒▒▒▓▓▓▓▓");
textattr(14);
cprintf("\n");
cprintf("Нажимайте комбинацию клавиш [ L_Shift + R_Shift + F1 ]\n\r");
textattr(11);
cprintf("Клавиша [1] при этом то блокируется, то разблокируется.");
textattr(7);
cprintf("\n\r");
}
void interrupt new9(...)
{
unsigned char c;
unsigned char byte17;//,byte18;
unsigned char mask=0x03;
//unsigned char mask17=0x04;
//unsigned char mask18=0x01;
byte17=peekb(0x40,0x17);
//byte18=peekb(0x40,0x18);
textattr(15+4*16);
if((inportb(0x60)==F1_code) && ((mask & byte17) && mask))
{
cputs("\7");
if(f==0)
{
f=1;
cout<<" Клавиша [3] заблокирована ";
}
else
{
f = 0;
cout<<" Клавиша [3] разблокирована ";
}
(*old9)();
}
if( (f==1) && (inportb(0x60)==key1_code) )
{
c=inportb(0x61);
outportb(0x61,c|0x80);
outportb(0x61,c);
outportb(0x20,0x20);
}
else
(*old9)();
}
#pragma argsused
void interrupt new2F(word bp,word di,word si,word ds,word es,
word dx,word cx,word bx,word ax,word ip,
word cs,word fl)
{
if ((ax>>8)==com_func)
/* Указан номер функции, занимаемой нашей программой */
if(!(ax&0xff)) /* проверка возможности установки */
{
ax|=0xff; /* запрет установки */
es=FP_SEG(mark);/* В регистрах ES:BX возвращается */
bx=FP_OFF(mark);/*адрес символьной строки tsr_mark*/
}
else
ax=0xffff;
else {
/* возврат из нашего обработчика в старый обработчик */
for (ast=(word far *)&bp;ast<=(word far *)&fl; ast++)
*(ast-3)=*ast;
cx=a_2F.offs; bx=a_2F.segm;
_SP-=6;
}
}
/* Поиск свободных функций 2F или функции, */
/* занятой tc_lab16 */
byte check_tsr(void) {
byte a, b;
char far *s1;
char *s2;
com_func=0;
for (a=0xff; a>=0xc0; a--) {
rr.h.ah=a; rr.h.al=0;
int86x(0x2f,&rr,&rr,&sr);
b=rr.h.al;
/* запоминание первого свободного номера функции */
if (!(b+com_func)) com_func=a;
if (b==0xff) /* функция занята */ {
s1=(char far*)(MK_FP(sr.es,rr.x.bx));
for (s2=tsr_mark; *s2; s1++,s2++)
if (*s1!=*s2) break;
if (*s2) continue;
/* занята нами */
com_func=a;
return (0);
}
}
return (1);
}
Результати роботи програми: Пiсля iніціалiзації програми по першому натиску комбiнацiї клавiш RShift+LShift+F1 програма переходить в режим блокування клавiшi 1, при другому - скасовує цей режим. Програма виконана в резидентному варiантi.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.