Damit es nicht untergeht: Deklaration von
exp_regdump im C-Code ist entscheidend.
Wenn du das z.B. so deklarierst:
extern void exp_regdump();
bekommst du die Adresse doch mit
rptr = exp_regdump;
Besonders toll ist dann, dass
&exp_regdump =
exp_regdump =
*exp_regdump =
**exp_regdump = ...
Aber
exp_regdump[0] geht trotzdem nicht, denn
exp_regdump ist kein Array. Ist doch alles ganz logisch ^^
Noch lustiger ist nur noch
extern void (*exp_regdump[])();. Da bekommst du dann die Adresse mit
exp_regdump oder
&exp_regdump. Den Wert in
rd_eip bekommst du mit
exp_regdump[0] oder
*exp_regdump (was wieder gleich
**exp_regdump und so weiter ist.)
C ist ja die einzig wahre Hochsprache und praktisch eine Obermenge von Assembler, wie die dritte Möglichkeit des Auslesens zeigt. Hierbei nutze ich die Kommutativität von Arrayzugriffen aus. Wenn du auf Bezeichner in eckigen Klammern stehst, kommst du an das erste Element (
rd_eip) mit
0[exp_regdump] bzw. 0[exp_regdump + 0]. An das zweite Element (
rd_eax) kommst du mit
0[exp_regdump + 1], an das dritte mit
0[exp_regdump + 2]. Genial oder? Musst nur beachten, dass du hier nicht wie in Assembler *4 rechnen darfst, sondern das macht der Compiler für dich. Alleine dieses Feature ist schon ein Grund mehr C zu verwenden
![Wink ;)](https://forum.lowlevel.eu/Smileys/classic/wink.gif)
Edit: Von
extern void (*exp_regdump)(); rate ich übrigens ab. Das ist total unlogisch, denn da ist
exp_regdump ungleich
&exp_regdump ![Wink ;)](https://forum.lowlevel.eu/Smileys/classic/wink.gif)
Logischerweise ist
extern void (**exp_regdump)(); auch nicht gleich
extern void (*exp_regdump[])();.