home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------- *)
- (* FREE_ENV.PAS *)
- (* (c) Bengt Konrad & DMV-Verlag *)
- (* ------------------------------------------------- *)
- (* Sprache : Turbo Pascal ab 4.0 *)
- (* ------------------------------------------------- *)
- PROGRAM Free_Environment;
-
- {.$A-,B-,R-,I-}
-
- USES Dos;
-
- VAR
- Regs : Registers;
- EnvSeg, Owner, Offset, MCB : WORD;
- x : INTEGER;
- Prog : STRING;
-
- BEGIN
- IF ParamCount = 0 THEN BEGIN
- Writeln(ParamStr(0) + ': Programmname fehlt');
- Exit;
- END;
- Prog := '\' + ParamStr(1);
-
- (* ersten MCB finden *)
- Regs.AH := $52;
- MsDos(Regs);
- MCB := MemW[Regs.ES-1 : Regs.BX+14] +
- MemW[Regs.ES-1 : Regs.BX+12] SHR 4;
-
- REPEAT
- Owner := MemW[MCB:1];
- EnvSeg := MCB + 1;
-
- (* Environment gefunden ? *)
- IF (Owner > 8) AND (Owner <> EnvSeg) AND
- (MemW[Owner:0] = $20CD) AND
- (MemW[Owner:$2c] = EnvSeg) THEN BEGIN
- (* Environmentende suchen *)
- Offset := 0;
- WHILE MemW[EnvSeg:Offset] <> $0000 DO
- Inc(Offset);
-
- (* Programmname vorhanden ? *)
- IF MemW[EnvSeg:Offset+2] = $0001 THEN BEGIN
- Inc(Offset, 4);
-
- (* Namensende suchen ... *)
- WHILE Mem[EnvSeg:Offset] <> $00 DO
- Inc(Offset);
-
- (* ... und rückwärts vergleichen *)
- x := Length(Prog) + 1;
- REPEAT
- Dec(x); Dec(Offset);
- UNTIL (x = 0) OR
- (CHAR(Mem[EnvSeg:Offset]) <>
- UpCase(Prog[x]));
-
- (* Namensgleichheit ? *)
- IF x = 0 THEN BEGIN
- (* Environment freigeben *)
- Regs.AH := $49;
- Regs.ES := EnvSeg;
- MsDos(Regs);
- END;
- END;
- END;
-
- (* letzter MCB ? *)
- IF CHAR(Mem[MCB:0]) = 'Z' THEN Exit;
-
- (* nächster MCB ... *)
- Inc(MCB, MemW[MCB:3] + 1);
- UNTIL FALSE;
- END.
- (* ------------------------------------------------- *)
- (* Ende von FREE_ENV.PAS *)
-