Системное программное обеспечение персональных ЭВМ


Пример 1



Пример 1

/*== ПРИМЕР 11.1 ==*/ /*=============== Распечатка собственного PSP ============*/ #include <dos.h> #define byte unsigned char #define word unsigned int struct 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 */ } *mypsp; word mypid; /* сегм.адрес PSP */ int dos, i, l; char *s; union REGS rr; main() { clrscr(); /* определение версии DOS */ rr.h.ah=0x30; intdos(&rr,&rr); dos=rr.h.al; /* получение адреса своего PSP */ rr.h.ah=0x62; intdos(&rr,&rr); mypid=rr.x.bx; /* распечатка PSP */ printf("***** PID=%04X *****\n",mypid); mypsp=(struct psp *)MK_FP(mypid,0); printf ("Команды: завершение - int 20h ---> %02X %02X\n", mypsp->ret_op[0],mypsp->ret_op[1]); printf (" старый вызов DOS -------> "); for (i=0;i<5;printf("%02X ",mypsp->old_call_dos[i++])); printf ("\n новый вызов DOS --------> "); for(i=0;i<3;printf("%02X ",mypsp->new_call_dos[i++])); printf ("\n\nАдреса: конец памяти -------------> %04X:0000\n", mypsp->end_of_mem); printf(" обработчик завершения ----> %Fp\n", mypsp->term_ptr); printf(" обработчик Ctrl+Break ----> %Fp\n", mypsp->ctrlbrk_ptr); printf(" обработчик критич.ошибки -> %Fp\n", mypsp->criterr_ptr); printf(" стек ---------------------> %Fp\n", mypsp->stack_ptr); printf("\nРодитель: ------------------------> %04X ", mypsp->father_psp); pr_file_tab(); /* таблица файлов */ printf("\nОкружение DOS --------------------> %04X\n", mypsp->env_seg); s=(char *)MK_FP(mypsp->env_seg,0); while(l=strlen(s)) { printf(" %s\n",s); s+=l+1; } if (dos>2) { /* для DOS 3.0 и дальше можно получить строку вызова */ s++; l=*((int *)s); printf("Строки вызова ----------------------> %d\n",l); s+=2; for(i=0; i<l; i++) { printf("%s\n",s); s+=strlen(s)+1; } } getch(); /* увеличение размера таблицы файлов */ rr.h.ah=0x67; /* функция 67 */ rr.x.bx=30; /* новый размер - 30 */ intdos(&rr,&rr); if (rr.x.cflag) printf("Ошибка функции 67h\n"); else pr_file_tab(); getch(); } /*==== распечатка таблицы файлов ====*/ pr_file_tab() { s=mypsp->JFT_ptr; printf ("\n\nТаблица файлов: -------------------> %Fp (%d) ", s,mypsp->JFT_size); if (s==(byte *)mypsp+0x18) printf(" - в этом же PSP"); printf("\n"); for (i=0; ++i<=mypsp->JFT_size; printf("%d ",*(s++))); printf("\n"); }




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