//svarcom/trunk/cmd/ver.c |
---|
53,7 → 53,8 |
char far *fptr; |
unsigned short i; |
printf("rmod->rmodseg = 0x%04X\r\n", p->rmod->rmodseg); |
printf("rmod->origparent = %04X:%04X\r\n", p->rmod->origparent >> 16, p->rmod->origparent & 0xffff); |
printf("rmod->origint22 = %04X:%04X\r\n", p->rmod->origint22 >> 16, p->rmod->origint22 & 0xffff); |
printf("rmod->origparent = 0x%04X\r\n", p->rmod->origparent); |
printf("rmod->origenvseg = 0x%04X\r\n", p->rmod->origenvseg); |
printf("rmod->flags = 0x%02X\r\n", p->rmod->flags); |
printf("[rmod:RMOD_OFFSET_ENVSEG] = 0x%04X\r\n", *rmod_envseg); |
//svarcom/trunk/rmodinit.c |
---|
235,8 → 235,9 |
pop ax |
} |
/* save my original parent in rmod's memory */ |
res->origparent = *((unsigned long *)0x0a); /* original parent seg:off is at 0x0a of my PSP */ |
/* save my original int22h handler and parent in rmod's memory */ |
res->origint22 = *((unsigned long *)0x0a); /* original int22h handler seg:off is at 0x0a of my PSP */ |
res->origparent = *((unsigned short *)0x16); /* PSP segment of my parent is at 0x16 of my PSP */ |
/* set the int22 handler in my PSP to rmod so DOS jumps to rmod after I |
* terminate and save the original handler in rmod's memory */ |
//svarcom/trunk/rmodinit.h |
---|
58,7 → 58,8 |
struct rmod_props { |
unsigned short rmodseg; /* segment where rmod is loaded */ |
unsigned long origparent; /* original parent (far ptr) of the shell */ |
unsigned long origint22; /* original int 22 handler (far ptr) of the shell */ |
unsigned short origparent; /* original parent (PSP's segment) */ |
unsigned short origenvseg; /* original environment segment */ |
unsigned char flags; /* command line parameters */ |
unsigned char version; /* used to detect mismatch between rmod and SvarCOM */ |
//svarcom/trunk/sayonara.c |
---|
33,16 → 33,20 |
* my parent is unknown */ |
void sayonara(struct rmod_props far *rmod) { |
unsigned short rmodseg = rmod->rmodseg; |
unsigned long *myparent = (void *)0x0A; |
unsigned long *myint22 = (void *)0x0A; |
unsigned short *myparent = (void *)0x16; |
unsigned short far *rmodenv_ptr = MK_FP(rmodseg, RMOD_OFFSET_ENVSEG); |
unsigned short rmodenv = *rmodenv_ptr; |
/* detect "I am the origin shell" situations */ |
if (rmod->flags & FLAG_PERMANENT) return; /* COMMAND.COM /P */ |
if ((rmod->origparent >> 16) == 0xffff) return; /* original parent seg set to 0xffff (DOS-C / FreeDOS) */ |
if ((rmod->origint22 >> 16) == 0xffff) return; /* original int22h seg set to 0xffff (DOS-C / FreeDOS) */ |
if (rmod->origenvseg == 0) return; /* no original environment (MSDOS 5/6) */ |
/* set my parent back to original value */ |
/* set my int 22h handler back to its original value */ |
*myint22 = rmod->origint22; |
/* set my parent back to its original value */ |
*myparent = rmod->origparent; |
_asm { |