[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]

Benutzung von resload_Protect#?

Theorie

Es gibt viele Situationen, bei denen es sehr hilfreich wäre informiert zu werden, wenn das installierte Programm auf bestimmte Speicherzellen zugreift. Mithilfe der resload_Protect#? Funktionen ist es möglich, bestimmte Speicherbereiche vor dem Lesen und/oder Schreiben durch den Prozessor zu schützen. Schützen meint dabei, dass jeder Zugriff auf ein solcherart markierten Bereich eine "Access Fault" Exception auslöst, die in einem Fehlerrequester von WHDLoad angezeigt wird. Wenn ein Speicherbereich durch resload_Protect#? geschützt wird, verändert WHDLoad die entsprechenden Kachel-Descriptoren im MMU-Übersetzungsbaum. Dadurch generiert jeder Zugriff auf eine geschützte Kachel durch den Prozessor eine "Access Fault" Exception. Der Exception-Handler im WHDLoad prüft den Grund für jede Exception. Wenn der Grund ein Zugriff auf eine geschützte Kache l war, aber die zugegriffene Adresse nicht in einem geschützten Bereich lag, wird der Zugriff emuliert und die normale Programmausführung fortgesetzt. Ansonsten wird das installierte Programm mit einem entsprechendem Fehlerrequester beendet. Zugriffe des Instruction-Stream (d.h. Zugriffe bei denen Prozessorcode geladen wird) werden immer emuliert, oder mit anderen Worten: die resload_Protect#? Funktionen überwachen nur das Schreiben und Lesen von Daten.
Dadurch, dass jeder Zugriff auf eine geschützte Kachel (Kachelgröße gegenwärtig 4096 Byte) ein "Access Fault" generiert auch wenn der geschützte Bereich nur eine Größe von einem Byte hat, bedingt eine starke Verlangsamung der Ablaufgeschwindigkeit des installierten Programmes. Insbesondere wenn sich Programmcode auf derselben Kachel befindet. Wenn das installierte Programm sehr von seiner Ausführungsgeschwindigkeit abhängt, können sich Unterschiede in der Ausführung ergeben. Es kann auch sein, dass einige Programme deshalb nicht mit resload_Protect zusammen arbeiten.

Beispiel: Codeprüfsummen

Wenn ein Spiel mit WHDLoad installiert werden soll, muss die original Laderoutine so verändert werden, dass sie nun WHDLoad nutzt um die Spieldaten zu laden. Einige Spiele verwenden Prüfsummen über Codebereiche um festzustellen, ob der ursprüngliche Code verändert worden ist. Solche Prüfsummenroutinen sind manchmal nicht leicht zu finden. Unter Verwendung der resload_Protect#? Funktionen in WHDLoad ist dies aber ganz einfach! Alles was man tun sollte, ist die veränderten Bytes mit Leseschutz zu versehen. Dadurch erzeugt jede Routine, die versucht eine Prüfsumme zu berechnen indem sie die geänderten Bytes liest, eine "Access Fault" Exception. Womit die entsprechende Routine identifiziert ist.

Einschränkungen

Die Kachel, auf den der SSP zeigt, darf nicht geschützt werden. Falls dies doch getan wird und eine Exception auftritt, führt dies zu einem "Double Bus Fault", weil der Prozessor nicht in der Lage ist das Exception Stackframe zu schreiben. Nach einem "Double Bus Fault" ist nur noch ein Hardwarereset möglich. WHDLoad prüft beim Setzen des geschützten Bereiches ob dieser sich mit dem aktuellen SSP überdeckt. Wenn dies der Fall ist, beendet es sich mit einer entsprechenden Fehlermeldung. Das hilft aber natürlich nicht wenn sich der SSP später ändert.

Weitere Einschränkungen und zusätzliche Informationen sind unter den entsprechenden resload_Protect-Funktionen in den Autodocs dokumentiert:


[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]