Subversion Repositories SvarDOS

Compare Revisions

Ignore whitespace Rev 447 → Rev 448

/svarcom/trunk/rmodinit.c
118,7 → 118,7
*owner = rmodseg;
_fmemcpy(mcb + 8, "SVARCOM", 8);
 
/* mark env memory as "self owned" */
/* mark env memory as "owned by rmod" */
mcb = MK_FP(envseg - 1, 0);
owner = (void far *)(mcb + 1);
*owner = rmodseg;
149,15 → 149,32
pop ax
}
 
/* set the int22 handler in my PSP to rmod so DOS jumps to rmod after I terminate */
/* 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 */
_asm {
push ax
push bx
push si
push di
push es
 
/* save my original parent in rmod's memory */
mov es, [rmodseg]
mov si, 0x0a
mov di, RMOD_OFFSET_ORIGPARENT
cld
movsw /* mov ES:[DI], DS:[SI] and SI += 2 and DI += 2 */
movsw
 
mov bx, 0x0a /* int22 handler is at 0x0A of the PSP */
mov ax, RMOD_OFFSET_ROUTINE
mov [bx], ax /* int handler offset */
mov ax, rmodseg
mov [bx+2], ax /* int handler segment */
 
pop es
pop di
pop si
pop bx
pop ax
}
166,29 → 183,18
}
 
 
/* scan memory for rmod, returns its segment if found, 0xffff otherwise */
/* look up my parent: if it's rmod then return its segment,
* otherwise return 0xffff */
unsigned short rmod_find(void) {
unsigned short i;
unsigned short far *ptrword;
unsigned char far *ptrbyte;
 
/* iterate over all paragraphs, looking for my signature */
for (i = 1; i != 65535; i++) {
ptrword = MK_FP(i, 0);
if (ptrword[0] != 0x1983) continue;
if (ptrword[1] != 0x1985) continue;
if (ptrword[2] != 0x2017) continue;
if (ptrword[3] != 0x2019) continue;
/* extra check: make sure the paragraph before is an MCB block and that it
* belongs to itself. otherwise I could find the rmod code embedded inside
* the command.com binary... */
ptrbyte = MK_FP(i - 1, 0);
if ((*ptrbyte != 'M') && (*ptrbyte != 'Z')) continue; /* not an MCB */
ptrword = MK_FP(i - 1, 1);
if (*ptrword != i) continue; /* not belonging to self */
return(i);
}
return(0xffff);
unsigned short *parent = (void *)0x0C; /* parent's seg in PSP[Ch] ("prev. int22 handler") */
unsigned short far *ptr;
const unsigned short sig[] = {0x1983, 0x1985, 0x2017, 0x2019};
unsigned char i;
/* is it rmod? */
ptr = MK_FP(*parent, 0);
for (i = 0; i < 4; i++) if (ptr[i] != sig[i]) return(0xffff);
/* match successfull (rmod is my parent) */
return(*parent);
}