Fehlender Environment-Block bei manchen Programmen

  • Hallo,


    laut all den Fachbüchern die ich habe legt DOS für jedes Programm das es startet einen Environment-Block im Speicher an.


    Bei manchen Programmen scheint dies jedoch nicht der Fall zu sein, z.B. starte ich in meiner AUTOEXEC.BAT die Programme MSCDEX.EXE, KEYB.COM und DOSKEY.COM


    Ich hab mir ein Turbo Pascal Programm geschrieben welches die Kette der Memory Control Blocks im Speicher durchläuft und die jeweiligen Environments der Programme die gefunden werden auflistet (also die Strings die da gespeichert sind).


    Wenn ich die Memory Control Blocks der Reihe nach durchlaufe dann tauchen in der Liste zwar die MCBs für die oben genannten Programme auf, aber es fehlt der jeweilige MCB für das zugehörige Environment was für mich dannach aussieht als würden diese Programme über kein Environment verfügen.


    Bei Turbo Pascal Programmen die ich selber geschrieben habe oder auch beispielsweise bei TURBO.EXE (Turbo Pascal IDE) selbst existiert der zugehörige Environment MCB jedoch.


    Macht DOS da bei manchen Programmen Ausnahmen und legt keinen Environment-Block an?


    Was auch total seltsam ist:


    Man kann die Segment-Adresse des Environment-Blocks ja aus dem PSP des jeweiligen Programms auslesen (das Word bei Offset 44)

    Und in den genannten drei Programmen steht an dieser Stelle die Segmentadresse des Environment-Blocks von meinem Turbo Pascal Programm.

    Meine Erwartung wäre eben gewesen daß hier eine Segmentadresse vermerkt ist welche auf den Environment-Block des jeweiligen Programms zeigt und nicht auf jenen von meinem Programm.

    Neben der fehlenden Existenz eines Environment-Blocks ist das der zweite Punkt der mir keine Ruhe lässt.


    Kann mir da wer weiterhelfen?


    lg, Markus

  • markusk

    Hat den Titel des Themas von „Fehler Environment-Block bei manchen Programmen“ zu „Fehlender Environment-Block bei manchen Programmen“ geändert.
  • Ohne es genau zu wissen: Ich höre zum ersten mal, dass jedes Programm sein eigenes Environment bekommt. Es würde wenig Sinn ergeben, da diese Variablen gerade für alle gelten sollen, und Speicher war knapp. Meine Vermutung daher, dass es nur ein Environment gibt und jedes Programm nur einen Pointer bekommt.

  • Hallo,


    doch, es ist tatsächlich so daß jedes Programm sein eigenes Environment bekommt. Ich kenn das auch von der TSR-Programmierung, wenn man das Programm wieder aus dem Speicher entfernt muß man neben dem eigentlichen Programm auch extra noch den Environment Speicherblock über die Funktion 49h des Interrupt 21h freigeben. Die Segmentadresse des Environment-Blocks steht an Offset 44 im PSP des Programms.


    So auch zu lesen beispielsweise auf der Seite https://www.plantation-product….com/DOS/ch18/CH18-4.html


    "To remove the TSR from memory requires two DOS calls, one to free the memory in use by the TSR and one to free the memory in use by the environment area assigned to the TSR. To do this, you need to make the DOS deallocation call . This call requires that you pass the segment address of the block to release in the es register. For the TSR program itself, you need to pass the address of the TSR's PSP. This is one of the reasons a TSR needs to save its PSP when it first installs itself. The other free call you must make frees the space associated with the TSR's environment block. The address of this block is at offset 2Ch in the PSP. So we should probably free it first."


    Der Environment-Block beinhaltet die Strings in 0-terminierter Form und schließt mit einem doppelten 0-Wert ab. Dann folgt ein Word das angibt wieviele zusätzliche Werte noch folgen, letzter Stand der DOS-Entwicklung ist hier bis heute der Wert 1.

    Auf dieses Word folgt ebenfalls in 0-terminierter Form der volle Pfad des Programms (also z.B. c:\tp6\turbo.exe), weitere Werte folgen nicht da im genannten Word ja der Wert 1 vermerkt ist und daher ist das Ende des Environment-Blocks erreicht.


    Es scheint jedoch Programme zu geben welche ihren Environment Block nach dem Start freigeben, z.B. um Platz zu sparen. Das hab ich mittlerweile im Zuge meiner Recherchen auf der Seite http://www.fysnet.net/tsrdemo.htm gesehen.


    Dies wäre natürlich eine Erklärung warum dann kein entsprechender MCB für das Environment gefunden wird. Ich werd mit dem Freigeben des Environment-Blocks mal ein wenig rumexperimentieren und testen wie sich das auswirkt.


    lg, Markus

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!