Das XBRA-Verfahren

Stellen Sie sich vor, Sie haben ein Programm geschrieben, sagen wir einen Drucker-Spooler, das sich resident im Speicher installiert. Um die Daten in einen Puffer übernehmen zu können und sie dann aus diesem an den Drucker zu schicken, mußten Sie einige Systemvektoren des Betriebssystems ‘verbiegen’.

Sie haben also die Adresse, auf die der Vektor zeigte, ausgelesen und tragen die Startadresse Ihres Programms dort ein. Natürlich müssen Sie nach Beendigung Ihrer Routine zur alten Routine zurückspringen (siehe hierzu ‘Timer und Interrupts’ in diesem Sonderheft). Dies ist sicher kein großes Problem, da Sie ja die ursprüngliche Adresse ausgelesen haben.

Soweit, so gut. Solange Ihr Programm das einzige ist, das die entsprechenden Vektoren verbiegt, geht auch also gut. Stellen Sie sich nun aber weiter vor, daß ein zweites Programm die gleichen Vektoren verbiegen möchte. Kein Problem, sagen Sie? Im Prinzip haben Sie natürlich recht, aber wie überprüfen Sie bitte-schön, ob Ihr Programm bereits installiert ist (z.B. bei einem zweiten Aufruf)? Und wie deaktivieren Sie Ihren Spooler, wenn sich ein zweites Programm sich dazwischen geklinkt hat?

Um diesen Problemen zu entgehen, wurde das XBRA-Verfahren ‘entwickelt’. Es wurde erstmals 1988 von Julian Reschke im ‘ATARI ST Profibuch’ vorgestellt und hat sich mittlerweile durchgesetzt. Es besteht im Grunde genommen ‘nur’ daraus, eine verkettete Liste aufzubauen, die man komplett durchlaufen kann. Im Bild ist die XBRA-Struktur zu sehen. Sie wird direkt vor dem Anfang der neuen Routine plaziert. Sie besteht aus der XBRA-Kennung ‘XBRA’, einer vier Buchstaben langen Routinen-Kennung, und dem ausgelesenen ursprünglichen Wert des Vektors.

Mit Hilfe dieser Struktur ist es möglich, eine Kette von Routinen zu verfolgen. Dazu untersucht man die Zeiger jedes Systemvektors. Zeigen diese auf eine Routine, der die XBRA-Struktur vorausgeht, nimmt man den Zeiger aus der XBRA-Struktur und hat somit die Adresse der nächsten Routine (siehe hierzu Programm im Utility-Teil).

Sollten Sie Ihren Speicher voller vektor’verbiegender’ Programme haben, kann der Fall eintreffen,' daß Sie nicht alle Routinen einer Kette finden. Dann hält sich mit Sicherheit eines der installierten Programme nicht an das XBRA-Verfahren und unterbricht damit die ‘Durchlaufbarkeit’ der Kette.

Terminierung

Was kann man unternehmen, wenn man sein Programm aus einer Kette herausnehmen möchte? Wenn die Routine an erster Stelle der Kette steht, langt es, die gerettete Adresse aus xb_oldvec in die Systemvariable zu schreiben, die auf die zu terminierende Routine zeigt. Danach sollte man noch den reservierten Speicher freigeben und das Programm beenden. Eine Routine mitten aus einer XBRA-Struktur zu nehmen, ist auch kein Problem: Sie tragen die in Ihrer xb_oldvec-Variable stehende Adresse in die xb_oldvec-Variable ihres Vorgängers ein; das war alles.

Bei einer unterbrochenen XBRA-Struktur wird die Sache etwas aufwendiger. Hier müssen Sie einen kleinen (modifizierten) Rest Ihrer XBRA-Routine stehenlassen. Zum einen natürlich die XBRA-Struktur. Sie sollten aber die Routinen-Kennung (xbjd) unkenntlich machen (schließlich ist das folgende ja nicht mehr Ihre Original-Routine!). Als Routine benötigen Sie nun einen Programmcode, der direkt die in xb_oldvec adressierte Routine anspringt.

Zum Schluß nach ein Wort zu der Routinen-Kennung. Es ist einleuchtend, daß ein und dieselbe Kennung für zwei verschiedene Routinen nicht sehr hilfreich ist [wie kann ein Programm dann (einfach) feststellen, ob es bereits installiert ist?]. Zu diesem Zweck wird von Julian Reschke eine XBRA-Liste geführt. Nähere Auskünfte erhalten Sie bei ihm (siehe ATARI Profibuch ST-STE-TT).

typdef struct {
    char xb_magic[4];
    /* muß XBRA-Kennung enthalten:  'XBRA' */
    char xb_id[4];
    /* vier (ASCII-)Zeichen zur Kennung der Routine */ 
    long xb_oldvec;
    /* vorheriger Wert des Vektors */
} XBRA;

XBRA-Struktur in C



Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]