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


Пример 5



Пример 5

/*== ПРИМЕР 11.5 == Файл 11_5.C ==*/ /*======== Программа, вызывающая другую программу ========*/ #include <dos.h> #include <string.h> #include <stdlib.h> #define byte unsigned char #define word unsigned int struct EPB { /* блок параметров EXEC */ word env; /* адрес окружения */ char far *parm_str; /* адрес строки параметров */ byte far *fcb1; /* адреса FCB */ byte far *fcb2; } epb; char call_string[128]; /* строка вызова */ char parm_string[128] = "*"; /* строка параметров, 1-ым байтом будет длина строки */ char env_str[]= "Специальное окружение\0 для иллюстрации\0\0$"; char father_file[] = "11_5.EXE"; char sun_file[] = "11_5_A.EXE"; word env; /* адрес подготовленного окружения */ word pid; /* свой PID */ union REGS rr; struct SREGS sr; char far *s, *s1;

main() { /* определение своего PID */ rr.h.ah=0x62; intdos(&rr,&rr); pid=rr.x.bx; /* формирование строки вызова */ for(s=(char *)MK_FP(peek(pid,0x2C),0); *s|*(s+1); s++); strcpy(call_string,s+4); if ((s=strstr(call_string,father_file))==NULL) exit(0); *s='\0'; strcat(call_string,sun_file); printf("\nПрограмма-родитель: PID = %04X\n",pid); printf("Вызов: >%s %s\n",call_string,parm_string+1); /* выделение памяти для нового окружения */ rr.h.ah=0x48; rr.x.bx=4; intdos(&rr,&rr); if (rr.x.cflag) printf("Ошибка 48h\n"); else { /* формирование нового окружения и EPB */ epb.env=env=rr.x.ax; s=(char *)MK_FP(env,0); for(s1=env_str; *s1!='$'; *(s++)=*(s1++)); /* формирование строки параметров */ printf("Введите строку параметров >"); gets(parm_string+1); epb.parm_str=parm_string; parm_string[0]=strlen(parm_string)-1; epb.fcb1=epb.fcb2=NULL; /* загрузить и выполнить */ rr.h.ah=0x4b; /* функция 4B */ rr.h.al=0; /* подфункция 0 */ sr.ds=FP_SEG(call_string); /* адр.строки вызова */ rr.x.dx=FP_OFF(call_string); sr.es=FP_SEG(&epb); /* адр.EPB */ rr.x.bx=FP_OFF(&epb); intdosx(&rr,&rr,&sr); if (rr.x.cflag) printf("Ошибка EXEC - %d\n",rr.x.ax); else { /* получение кода возврата */ rr.h.ah=0x4d; /* функция 4D */ intdos(&rr,&rr); printf("Возврат из вызова - %d, с кодом - %02xh\n", rr.h.ah,rr.h.al); } /* освобождение памяти */ rr.h.ah=0x49; sr.es=env; intdosx(&rr,&rr,&sr); if (rr.x.cflag) printf("Ошибка 49h\n"); } } /*== Файл 11_5_A.C ==*/ /*======== Программа, вызываемая из другой программы ========*/

#include <dos.h> #include <stddef.h> main(int argn, char *argv[]) { union REGS rr; int i; char *eee; printf("Hello, I`m 11_5_A!\n"); printf("ПАРАМЕТРЫ:\n"); for (i=0; i<argn; i++) printf(">>%s<<\n",argv[i]); printf("ОКРУЖЕНИЕ:\n"); for (i=0; environ[i]!=NULL; i++) printf("%s\n",environ[i]); rr.h.ah=0x4c; rr.h.al=0x47; intdos(&rr,&rr); }




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