/*-----Лабораторная работа N10-----------------*/
/*------"Управление программами"----------------*/
/* Подключение стандартных заголовков */
#include <dos.h>
#include <conio.h>
/* Типы данных */
#define byte unsigned char
#define word unsigned int
/* Описание функций */
void get_DOS_version_h(void); /* Определение версии DOS */
void addr_PSP (void); /* Получение адреса PSP */
struct psp
{ /* ФОРМАТ PSP */
byte ret_op[2]; /* команда INT 20h */
word end_of_mem; /* вершина доступной памяти */
byte reserved1;
byte old_call_dos[5]; /* старый вызов DOS */
void *term_ptr; /* адрес завершения */
void *ctrlbrk_ptr; /* адрес обработчика Ctrl+Break */
void *criterr_ptr; /* адрес обработчика крит.ошибок */
word father_psp; /* PID родителя */
byte JFT[20]; /* таблица файлов программы */
word env_seg; /* адрес окружения */
void *stack_ptr; /* адрес стека */
word JFT_size; /* размер таблицы файлов */
byte *JFT_ptr; /* адрес таблицы файлов */
byte reserved2[24];
byte new_call_dos[3]; /* новый вызов DOS */
} *p_psp;
word pid; /* сегм.адрес PSP */
int dos_ver, /* версия DOS */
i, l, j;
char *s;
union REGS rr;
main()
{
textbackground(0);
clrscr();
textattr(0x0a);
cprintf("---------------");
cprintf(" Лабораторная работа N10 ");
cprintf("---------------");
cprintf("---------------");
cprintf(" Управление программами ");
cprintf("---------------");
textcolor(11);
get_DOS_version_h();
addr_PSP();
/* распечатка PSP */
cprintf("\n\n Адрес PID = %04X\n\n\r",pid);
p_psp=(struct psp *)MK_FP(pid,0);
textcolor(10);
cprintf("Команды:\n\r");
cprintf("--------\n\r");
textcolor(14);
cprintf(" Завершение — int 20h:");
textcolor(12);
cprintf(" %02X %02X\n\r",p_psp->ret_op[0],p_psp->ret_op[1]);
textcolor(14);
cprintf(" Старый вызов DOS: ");
textcolor(12);
for (i=0;i<5;cprintf("%02X ",p_psp->old_call_dos[i++]));
textcolor(14);
cprintf("\n\r Новый вызов DOS: ");
textcolor(12);
for(i=0;i<3;cprintf("%02X ",p_psp->new_call_dos[i++]));
textcolor(10);
cprintf("\n\n\rАдреса:\n\r");
cprintf("-------\n\r");
textcolor(14);
cprintf(" Конец памяти: ");
textcolor(12);
cprintf("%04X:0000\n\r",p_psp->end_of_mem);
textcolor(14);
cprintf(" Обработчик завершения: ");
textcolor(12);
cprintf("%Fp\n\r",p_psp->term_ptr);
textcolor(14);
cprintf(" Обработчик Ctrl+Break: ");
textcolor(12);
cprintf("%Fp\n\r",p_psp->ctrlbrk_ptr);
textcolor(14);
cprintf(" Обработчик критич.ошибки: ");
textcolor(12);
cprintf("%Fp\n\r",p_psp->criterr_ptr);
textcolor(14);
cprintf(" Стек: ");
textcolor(12);
cprintf("%Fp\n\n\r",p_psp->stack_ptr);
textcolor(14);
cprintf("\n\rРодитель: ");
textcolor(12);
cprintf("%04X ",p_psp->father_psp);
textcolor(0x8b);
cprintf("\n\n\rНажмите любую клавишу ...\n\r\7");
getch();
clrscr();
textattr(0x0a);
cprintf("---------------");
cprintf(" Лабораторная работа N10 ");
cprintf("---------------");
cprintf("---------------");
cprintf(" Управление программами ");
cprintf("---------------");
/* Распечатка таблицы файлов */
s=p_psp->JFT_ptr;
textcolor(10);
cprintf("\n\n\rТаблица файлов: ");
textcolor(12);
cprintf("%Fp (%d) ",s,p_psp->JFT_size);
textcolor(11);
if (s==(byte *)p_psp+0x18)
cprintf(" — в этом же PSP");
cprintf("\n\r");
for (i=0; ++i<=p_psp->JFT_size; cprintf("%d ",*(s++)));
textcolor(10);
cprintf("\n\n\rОкружение DOS: ");
textcolor(12);
cprintf("%04X\n\r",p_psp->env_seg);
s=(char *)MK_FP(p_psp->env_seg,0);
textcolor(11);
while(l=strlen(s))
{
cprintf(" %s\n\r",s);
s+=l+1;
}
if (dos_ver>2)
{
/* для DOS 3.0 и дальше можно получить строку вызова */
s++;
l=*((int *)s);
textcolor(10);
cprintf("\n\rЧисло строк вызова: ");
textcolor(12);
cprintf("%d\n\r",l);
s+=2;
textcolor(11);
for(i=0; i<l; i++)
{
cprintf("%s\n\r",s);
s+=strlen(s)+1;
}
}
textattr(0x8b);
cprintf("\n\n\n\n\rНажмите любую клавишу ...\7");
textattr(0x07);
cprintf("\n\r");
getch();
clrscr();
}
/* Определение версии DOS */
void get_DOS_version_h(void)
{
rr.h.ah=0x30;
intdos(&rr,&rr);
dos_ver=rr.h.al;
}
/* Получение адреса PSP */
void addr_PSP (void)
{
rr.h.ah=0x62;
intdos(&rr,&rr);
pid=rr.x.bx;
}