Was ist der richtige Weg, um sehr kleine Teile einer binären Datei programmatisch zu ersetzen?

StackOverflow https://stackoverflow.com/questions/2395077

Frage

Ich habe einen Spielcode (aus dem Ioquake3 -Projekt), der einen Teil von Gameplay -Binärdateien im laufenden Fliegen (das QVM -System) kompiliert. Jetzt könnte man es möglicherweise beschleunigen, indem zuvor zuvor gespeicherte Binärdateien dieses Vorgangs geladen werden (mit vorhandenen Vorsichtsmaßnahmen der Akten).

Aber Hinweise auf Funktionen, die in diesen Binärdateien gespeichert sind, sind durch Sitzungen nicht bestehen.

Was wäre der richtige Weg, um diese im laufenden Fliegen zu ändern? (Wenn man bedenkt, dass der Assembler und die Baugruppe in der Hauptanwendung verfügbar sind)

War es hilfreich?

Lösung

Das ist so ziemlich das, was ein normaler Lader für ausführbare Ausführungen tut. Sie arbeiten normalerweise, indem sie eine Tabelle der Orte speichern. Es gibt Hinweise auf Adressen, die basierend auf der geladenen Datei geändert werden müssen. Normalerweise speichern sie eine relative Adresse in jedem dieser Standorte. Um die Datei zu laden, schauen Sie sich die Tabelle an und fügen die Basislastadresse zu dem hinzu, was sich an jedem dieser Adressen befindet.

Andere Tipps

Übergeben Sie eine Tabelle relevanter Funktionszeiger als Parameter. Alternativ können Sie Code generiert haben, der sich auf einen Datenbereich stützt, der an einem festen, relativ zu Code und dem Standort festgelegt wird.

Ich erinnere mich, als ich mich mit diesem Zeug angemeldet hatte, ich habe eine Lese-/Schreiben/Schreibens -Speicherseite eingerichtet, die erste Hälfte für generierten Code und die zweite Hälfte für Daten verwenden. Der Code, sobald er die Kontrolle hatte, würde so folgen:

call l
l:
pop eax ; eax has the current eip
and eax, 0fffff000h ;round down to the page size, 4K AKA 0x1000
add eax, 800h ;now eax points at the data area

...usw.

Bei großem Maßstab generierten Code möchten Sie ihn möglicherweise als vollständige DLLs speichern und die systembereiteten Umzugs- und Adressdienste nutzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top