Subversion Repositories SvarDOS

Rev

Rev 449 | Rev 453 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 449 Rev 450
Line 31... Line 31...
31
 
31
 
32
/* rewires my parent pointer, uninstalls rmod let DOS terminate me, UNLESS
32
/* rewires my parent pointer, uninstalls rmod let DOS terminate me, UNLESS
33
 * my parent is unknown */
33
 * my parent is unknown */
34
void sayonara(struct rmod_props far *rmod) {
34
void sayonara(struct rmod_props far *rmod) {
35
  unsigned short rmodseg = rmod->rmodseg;
35
  unsigned short rmodseg = rmod->rmodseg;
36
  unsigned long far *orgparent = MK_FP(rmodseg, RMOD_OFFSET_ORIGPARENT);
-
 
37
  unsigned long *myparent = (void *)0x0A;
36
  unsigned long *myparent = (void *)0x0A;
38
  unsigned short far *rmodenv_ptr = MK_FP(rmodseg, RMOD_OFFSET_ENVSEG);
37
  unsigned short far *rmodenv_ptr = MK_FP(rmodseg, RMOD_OFFSET_ENVSEG);
39
  unsigned short rmodenv = *rmodenv_ptr;
38
  unsigned short rmodenv = *rmodenv_ptr;
40
 
39
 
41
  /* detect "I am the origin shell" situations */
40
  /* detect "I am the origin shell" situations */
42
  if (*orgparent == 0xffff) return; /* original parent set to 0xffff (DOS-C / FreeDOS) */
41
  if (rmod->origparent == 0xffff) return; /* original parent set to 0xffff (DOS-C / FreeDOS) */
43
  if (rmod->flags & FLAG_PERMANENT) return; /* COMMAND.COM /P */
42
  if (rmod->flags & FLAG_PERMANENT) return; /* COMMAND.COM /P */
44
 
43
 
45
  /* set my parent back to original value */
44
  /* set my parent back to original value */
46
  *myparent = *orgparent;
45
  *myparent = rmod->origparent;
47
 
46
 
48
  _asm {
47
  _asm {
49
    /* free RMOD's code segment and env segment */
48
    /* free RMOD's code segment and env segment */
50
    mov ah, 0x49   /* DOS 2+ -- Free Memory Block */
49
    mov ah, 0x49   /* DOS 2+ -- Free Memory Block */
51
    mov es, [rmodseg]
50
    mov es, [rmodseg]