Spätestens bei der Reinstallation eines TSR-Programms wird man von der Möglichkeit Gebrauch machen müssen, Routinen innerhalb der installierten Kopie aufzurufen. Denn auch der Hochsprachen-Teil eines TSR wird oftmals Betriebsmittel (Speicher, Interrupt-Vektoren, Dateien) für sich in Anspruch nehmen, die bei seiner Entfernung aus dem Speicher wieder an das Betriebssystem zurückgegeben werden müssen.
Da sich die Segmentadresse der installierten Kopie problemlos über den MUX-Handler ermitteln läßt und die Offsetadresse der jeweiligen Routine die gleiche ist, wie in der gerade ausgeführten Kopie des Programms, ließe sich leicht ein FAR-Ziger auf die Routine in der installierten Kopie des Programms konstruieren, über den die gewünschte Routine aufgerufen werden kann. Voraussetzung dafür wäre lediglich, daß die aufgerufene Routine vom Typ FAR ist, aber auch das ließe sich bewerkstelligen.
Die ganze Sache hat jedoch einen großen Hacken, denn durch den direkten Aufruf der Routine findet kein Kontextwechesl zu der installierten Kopie des Programms im Speicher statt. Es bleibe also weiterhin das Datensegment der aktuell ausgeführten Kopie aktiv, genau wie deren PSP und DTA. Dadurch bliebe der aufgerufenen Routine aber der Zugriff auf ihre Variablen im Datensegment versperrt, denn sie würde auf die Variablen in der gerade aufgerufenen Kopie des Programms zugreifen.
Dashalb muß man sich für den Aufruf einer Routine in der bereits installierten Kopie des Programms eines Mittlers bedienen, der vor dem Aufruf der gewünschten Routine den Kontextwechsel zur installierten Kopie ausführt und auch den anschließenden Kontextwechsel zurück zum gerade ausgeführten Programm übernimmt.
Eine solche Routine würde als Argument lediglich die Offsetadresse der auszuführenden Routine in der installierten Kopie des TSR benötigen. Das funktioniert zwar, ist jedoch nicht besonders komfortabel, weil dabei keine Argumente an die aufzurufende Routine übergeben werden können und auch die Entgegennahme eines Rückgabewertes nicht möglich ist.
Um aber auch die Übergabe von Parametern und die Entgegennahme eines Funktionsergebnisses möglich zu machen, wurde für den Aufruf von Routinen in der bereits installierten Kopie des TSR-Programms ein anderer Weg gewählt, der in den zwei Routinen der Assembler-Schnittstelle involviert sind: TsrSetPtr und TsrCall.
Von diesen beiden Routinen muß zunächst TsrSetPtr aufgerufen werden, welche die Adresse der aufzurufenden Routine entgegennimmt und sie in einer Variablen der Assembler-Schnittstelle speichert. Anschließend erfolgt der Aufruf der Routine TsrCall, die den Kontextwechsel durchführt und sich der zuvor gepeicherten Adresse bedient, um die gewünschte Routine aufzurufen.
Das Problem dabei ist nur, das TsrCall natürlich innerhalb des Hochsprachen-Moduls deklariert und dabei auch die verschiedenen Parameter aufgeführt werden müssen, die über TsrCall an die jeweilige Routine übergeben werden sollen. Die Anzahl der Parameter und ihr Typ hängt von der auszuführenden Routine ab und variiert.
|