Информатика и технология программирования


Реентерабельность и проблемы резидентных программ в DOS - часть 4



PSPI=*PSPADR; // Запоминаем идентификатор процесса


// (PSP прерванного процесса).


*PSPADR=PSP; // Устанавливаем свой PSP


DTAI=getdta(); // Запоминаем DTA прерванного процесса.


setdta(DTA); // Устанавливаем свой DTA


old24=getvect(0x24); // Запоминаем 24h вектор (адрес подпрограммы )


// реакции на фатальную ошибку)


setvect(0x24,(void interrupt(far*)(...))newscrit);
// Ставим свой вектор


rg.x.ax=0x3300; // Проверить реакцию на CTRL/BREAK,


intdos(&#38rg,&#38rg); //


CtrlBrk=rg.h.dl; // и запомнить эту реакцию


rg.x.ax=0x3301; // Установить реакцию на CTRL/BREAK:


rg.h.dl=0; // запретить остановку программы по CTRL/BREAK.


intdos(&#38rg,&#38rg); //


}


void RESTORECONTEXT() //Восстановление контекста прерванной задачи


{
setdta(DTAI); //Восстановить DTA прерванной программы,


*PSPADR=PSPI; //PSP,


setvect(0x24,old24); //вектор 24h (реакция на фатальную ошибку),


rg.x.ax=0x3301; //восстановить реакцию на CTRL/BREAK.


rg.h.dl=CtrlBrk;
intdos(&#38rg,&#38rg);
}


void PROCESS1() // Пример процесса, создающего файл


{ // средствами DOS


int fd;
if((fd=_creat(fname,0)) == -1) return;
fname[0]++;
char *p="Это строка из резидента\n\r";
_write(fd,(void*)p,strlen(p+1));
_close(fd);
}


void PROCKEY() // Обработка горячих клавиш


{ // с проверкой всех возможных условий


if (NKEY==0) return; // Нет кода - нечего обрабатывать


if (FORKH) return; // Исключение повторного входа (с потеря запроса)


if (WAITDOS !=-1) // Проверка на занятость DOS


{
if (*PDOSBUSY) //Если установлен флаг занятости DOS ...


{ putstr("Wait DOS ",0,1);
WAITDOS=1; // Взводим свой флаг и выходим


return;
}
}
if (WAITDISK !=-1) // Проверка занятости диска по прерыванию 13h


{
if (DISKFLAG) // Если дисковая подсистема занята ...


{ putstr("Wait DISK",20,1);
WAITDISK=1; // Взводим свой флаг и выходим


return;
}
}
if (WAITBIOS !=-1) // Проверка занятости BIOS - прерывание


{ // основного процесса в сегменте BIOS


if ((CS &#38 0xFF00) &#62= 0xC000)



Начало  Назад  Вперед



Книжный магазин