Subversion Repositories SvarDOS

Rev

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

Rev 439 Rev 448
Line 116... Line 116...
116
  mcb = MK_FP(rmodseg - 1, 0);
116
  mcb = MK_FP(rmodseg - 1, 0);
117
  owner = (void far *)(mcb + 1);
117
  owner = (void far *)(mcb + 1);
118
  *owner = rmodseg;
118
  *owner = rmodseg;
119
  _fmemcpy(mcb + 8, "SVARCOM", 8);
119
  _fmemcpy(mcb + 8, "SVARCOM", 8);
120
 
120
 
121
  /* mark env memory as "self owned" */
121
  /* mark env memory as "owned by rmod" */
122
  mcb = MK_FP(envseg - 1, 0);
122
  mcb = MK_FP(envseg - 1, 0);
123
  owner = (void far *)(mcb + 1);
123
  owner = (void far *)(mcb + 1);
124
  *owner = rmodseg;
124
  *owner = rmodseg;
125
  _fmemcpy(mcb + 8, "SVARENV", 8);
125
  _fmemcpy(mcb + 8, "SVARENV", 8);
126
 
126
 
Line 147... Line 147...
147
    pop dx
147
    pop dx
148
    pop bx
148
    pop bx
149
    pop ax
149
    pop ax
150
  }
150
  }
151
 
151
 
152
  /* set the int22 handler in my PSP to rmod so DOS jumps to rmod after I terminate */
152
  /* set the int22 handler in my PSP to rmod so DOS jumps to rmod after I
-
 
153
   * terminate and save the original handler in rmod's memory */
153
  _asm {
154
  _asm {
154
    push ax
155
    push ax
155
    push bx
156
    push bx
-
 
157
    push si
-
 
158
    push di
-
 
159
    push es
-
 
160
 
-
 
161
    /* save my original parent in rmod's memory */
-
 
162
    mov es, [rmodseg]
-
 
163
    mov si, 0x0a
-
 
164
    mov di, RMOD_OFFSET_ORIGPARENT
-
 
165
    cld
-
 
166
    movsw  /* mov ES:[DI], DS:[SI] and SI += 2 and DI += 2 */
-
 
167
    movsw
-
 
168
 
156
    mov bx, 0x0a                   /* int22 handler is at 0x0A of the PSP */
169
    mov bx, 0x0a                   /* int22 handler is at 0x0A of the PSP */
157
    mov ax, RMOD_OFFSET_ROUTINE
170
    mov ax, RMOD_OFFSET_ROUTINE
158
    mov [bx], ax                   /* int handler offset */
171
    mov [bx], ax                   /* int handler offset */
159
    mov ax, rmodseg
172
    mov ax, rmodseg
160
    mov [bx+2], ax                 /* int handler segment */
173
    mov [bx+2], ax                 /* int handler segment */
-
 
174
 
-
 
175
    pop es
-
 
176
    pop di
-
 
177
    pop si
161
    pop bx
178
    pop bx
162
    pop ax
179
    pop ax
163
  }
180
  }
164
 
181
 
165
  return(rmodseg);
182
  return(rmodseg);
166
}
183
}
167
 
184
 
168
 
185
 
169
/* scan memory for rmod, returns its segment if found, 0xffff otherwise */
186
/* look up my parent: if it's rmod then return its segment,
-
 
187
 * otherwise return 0xffff */
170
unsigned short rmod_find(void) {
188
unsigned short rmod_find(void) {
171
  unsigned short i;
-
 
172
  unsigned short far *ptrword;
189
  unsigned short *parent = (void *)0x0C; /* parent's seg in PSP[Ch] ("prev. int22 handler") */
173
  unsigned char far *ptrbyte;
190
  unsigned short far *ptr;
174
 
-
 
175
  /* iterate over all paragraphs, looking for my signature */
191
  const unsigned short sig[] = {0x1983, 0x1985, 0x2017, 0x2019};
176
  for (i = 1; i != 65535; i++) {
-
 
177
    ptrword = MK_FP(i, 0);
192
  unsigned char i;
178
    if (ptrword[0] != 0x1983) continue;
-
 
179
    if (ptrword[1] != 0x1985) continue;
-
 
180
    if (ptrword[2] != 0x2017) continue;
-
 
181
    if (ptrword[3] != 0x2019) continue;
-
 
182
    /* extra check: make sure the paragraph before is an MCB block and that it
-
 
183
     * belongs to itself. otherwise I could find the rmod code embedded inside
-
 
184
     * the command.com binary... */
193
  /* is it rmod? */
185
    ptrbyte = MK_FP(i - 1, 0);
194
  ptr = MK_FP(*parent, 0);
186
    if ((*ptrbyte != 'M') && (*ptrbyte != 'Z')) continue; /* not an MCB */
195
  for (i = 0; i < 4; i++) if (ptr[i] != sig[i]) return(0xffff);
187
    ptrword = MK_FP(i - 1, 1);
-
 
188
    if (*ptrword != i) continue; /* not belonging to self */
196
  /* match successfull (rmod is my parent) */
189
    return(i);
-
 
190
  }
-
 
191
  return(0xffff);
197
  return(*parent);
192
}
198
}
193
 
199
 
194
 
200
 
195
/* update rmod's pointer to comspec */
201
/* update rmod's pointer to comspec */
196
void rmod_updatecomspecptr(unsigned short rmod_seg, unsigned short env_seg) {
202
void rmod_updatecomspecptr(unsigned short rmod_seg, unsigned short env_seg) {