<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[API Aufruf mir Inline Assembler &#x2F; Rücksprungaddresse ermitteln]]></title><description><![CDATA[<p>Hallo!</p>
<p>Da ich jetzt schon mehere Stunden verzweifelt damit verbracht habe,<br />
einen simplen API Aufruf mit Inline Assembler zu realisieren, setze<br />
ich meine ganze Hoffnung in Euch. Mein Probleme:</p>
<h1>1. Frage</h1>
<p>Ich benutze den BCB 6 und möchte GetForegroundWindow aufrufen und<br />
den Rückgabewert (in EAX) in einer Variable speichern. Das ganze<br />
geschieht innerhalb eines Hooks, was aber für meine Frage unerheblich<br />
ist.</p>
<pre><code class="language-cpp">HWND APIENTRY new_GetForegroundWindow( void )
{
       HWND RetVal = 0x12346789;    // init

        __asm {
                call org_GetForegroundWindow;
                MOV RetVal, EAX;
              }

        return RetVal;
}
</code></pre>
<p>Das hooken klappt und lässt sich schön im Debugger verfolgen. Nur<br />
der Rückgabewert (RetVal) wird nicht gesetzt (obwohl er definitiv<br />
in EAX steht). Soweit ich im Debugger verfolgen konnte, wird der<br />
Wert im Aufruf ( MOV RetVal, EAX ) nicht ans Offset von RetVak<br />
im Speicher geschrieben, sondern etwas dahinter (ein paar bytes).</p>
<p>Bei einem DWORD/HWND (wie oben im Code) sieht die Anweisung so<br />
aus:</p>
<pre><code class="language-asm">0040137C  PUSH EBX
0040137D  PUSH ECX
0040137E  MOV DWORD PTR SS:[ESP],12346789   &lt;-- INIT, offset == 0x0012FF74
00401385  CALL DWORD PTR DS:[40E7C0]        &lt;-- CALL hooked, return value in EAX
0040138B  MOV DWORD PTR SS:[EBP],EAX        &lt;-- 0x0012FF88 != 0x0012FF88
0040138E  MOV EAX,DWORD PTR SS:[ESP]
00401391  POP EDX
00401392  POP EBX
00401393  RETN
</code></pre>
<p>Statt an offset 0x0012FF74, wird an 0x0012FF88 gespeichert. Mir ist<br />
nicht klar, wieso. Und egal wie ich es drehe und wende, nie funktioniert<br />
es.</p>
<h1>2. Frage:</h1>
<p>Neben dem Rückgabewert möchte ich auch ermitteln, woher der Call kam.<br />
In VC++ gibt es dafür die Anweisung:</p>
<pre><code class="language-cpp">extern &quot;C&quot;
void * _ReturnAddress(void);
#pragma intrinsic(_ReturnAddress) 

HWND APIENTRY new_GetForegroundWindow( void )
{

DWORD RetAddr=(DWORD)_ReturnAddress();
}
</code></pre>
<p>Der Scheiss BCB meldet mir aber unresolved external. Also vermutlich<br />
MS spezifisch. Natürlich lässt sich das in __asm machen, allerdings<br />
weiss ich nicht wie und angesicht derart merkwürdiger Probleme (siehe<br />
oben) kann ich es auch nicht ausprobieren.</p>
<p>Ideen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/80798/api-aufruf-mir-inline-assembler-rücksprungaddresse-ermitteln</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 10:00:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/80798.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 24 Jul 2004 21:36:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to API Aufruf mir Inline Assembler &#x2F; Rücksprungaddresse ermitteln on Sat, 24 Jul 2004 21:36:31 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Da ich jetzt schon mehere Stunden verzweifelt damit verbracht habe,<br />
einen simplen API Aufruf mit Inline Assembler zu realisieren, setze<br />
ich meine ganze Hoffnung in Euch. Mein Probleme:</p>
<h1>1. Frage</h1>
<p>Ich benutze den BCB 6 und möchte GetForegroundWindow aufrufen und<br />
den Rückgabewert (in EAX) in einer Variable speichern. Das ganze<br />
geschieht innerhalb eines Hooks, was aber für meine Frage unerheblich<br />
ist.</p>
<pre><code class="language-cpp">HWND APIENTRY new_GetForegroundWindow( void )
{
       HWND RetVal = 0x12346789;    // init

        __asm {
                call org_GetForegroundWindow;
                MOV RetVal, EAX;
              }

        return RetVal;
}
</code></pre>
<p>Das hooken klappt und lässt sich schön im Debugger verfolgen. Nur<br />
der Rückgabewert (RetVal) wird nicht gesetzt (obwohl er definitiv<br />
in EAX steht). Soweit ich im Debugger verfolgen konnte, wird der<br />
Wert im Aufruf ( MOV RetVal, EAX ) nicht ans Offset von RetVak<br />
im Speicher geschrieben, sondern etwas dahinter (ein paar bytes).</p>
<p>Bei einem DWORD/HWND (wie oben im Code) sieht die Anweisung so<br />
aus:</p>
<pre><code class="language-asm">0040137C  PUSH EBX
0040137D  PUSH ECX
0040137E  MOV DWORD PTR SS:[ESP],12346789   &lt;-- INIT, offset == 0x0012FF74
00401385  CALL DWORD PTR DS:[40E7C0]        &lt;-- CALL hooked, return value in EAX
0040138B  MOV DWORD PTR SS:[EBP],EAX        &lt;-- 0x0012FF88 != 0x0012FF88
0040138E  MOV EAX,DWORD PTR SS:[ESP]
00401391  POP EDX
00401392  POP EBX
00401393  RETN
</code></pre>
<p>Statt an offset 0x0012FF74, wird an 0x0012FF88 gespeichert. Mir ist<br />
nicht klar, wieso. Und egal wie ich es drehe und wende, nie funktioniert<br />
es.</p>
<h1>2. Frage:</h1>
<p>Neben dem Rückgabewert möchte ich auch ermitteln, woher der Call kam.<br />
In VC++ gibt es dafür die Anweisung:</p>
<pre><code class="language-cpp">extern &quot;C&quot;
void * _ReturnAddress(void);
#pragma intrinsic(_ReturnAddress) 

HWND APIENTRY new_GetForegroundWindow( void )
{

DWORD RetAddr=(DWORD)_ReturnAddress();
}
</code></pre>
<p>Der Scheiss BCB meldet mir aber unresolved external. Also vermutlich<br />
MS spezifisch. Natürlich lässt sich das in __asm machen, allerdings<br />
weiss ich nicht wie und angesicht derart merkwürdiger Probleme (siehe<br />
oben) kann ich es auch nicht ausprobieren.</p>
<p>Ideen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/567656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/567656</guid><dc:creator><![CDATA[graumarl]]></dc:creator><pubDate>Sat, 24 Jul 2004 21:36:31 GMT</pubDate></item><item><title><![CDATA[Reply to API Aufruf mir Inline Assembler &#x2F; Rücksprungaddresse ermitteln on Sat, 24 Jul 2004 21:40:18 GMT]]></title><description><![CDATA[<p>Kleiner fehler: Statt</p>
<p>0040138B MOV DWORD PTR SS:[EBP],EAX &lt;-- 0x0012FF88 != 0x0012FF88</p>
<p>muss es</p>
<p>0040138B MOV DWORD PTR SS:[EBP],EAX &lt;-- <strong>0x0012FF74 != 0x0012FF88</strong></p>
<p>heissen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/567657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/567657</guid><dc:creator><![CDATA[graumarl]]></dc:creator><pubDate>Sat, 24 Jul 2004 21:40:18 GMT</pubDate></item><item><title><![CDATA[Reply to API Aufruf mir Inline Assembler &#x2F; Rücksprungaddresse ermitteln on Sat, 24 Jul 2004 21:52:44 GMT]]></title><description><![CDATA[<p>Ich bin zwar kein Assembler-Experte, aber sollte es nicht heißen:</p>
<pre><code class="language-asm">mov [RetVal], eax;
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/567661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/567661</guid><dc:creator><![CDATA[Shlo]]></dc:creator><pubDate>Sat, 24 Jul 2004 21:52:44 GMT</pubDate></item><item><title><![CDATA[Reply to API Aufruf mir Inline Assembler &#x2F; Rücksprungaddresse ermitteln on Sat, 24 Jul 2004 22:03:52 GMT]]></title><description><![CDATA[<p>Muss das denn sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ??? Asm für Api-Calls zu verwenden ist sowas von unnötig. Vielleicht solltest du alles noch ma überdenken. Im übrigen verbirgt sich hinter HWND ein Pointer auf struct HWND__. Also rechnet mit Zeigern und nicht mit Daten... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/567665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/567665</guid><dc:creator><![CDATA[CanDL]]></dc:creator><pubDate>Sat, 24 Jul 2004 22:03:52 GMT</pubDate></item><item><title><![CDATA[Reply to API Aufruf mir Inline Assembler &#x2F; Rücksprungaddresse ermitteln on Sat, 24 Jul 2004 22:12:17 GMT]]></title><description><![CDATA[<p>Das klappt auch nicht, der Dreckscompiler macht anscheinend was er will.<br />
Borland eben...</p>
<p>Übrigens so geht es (aber das ist ABSOLUTER PFUSCH):</p>
<pre><code class="language-cpp">HWND APIENTRY new_GetForegroundWindow( void )
{
       HWND RetVal;

        __asm {
                mov RetVal, 0;
                call org_GetForegroundWindow;
                MOV DWORD PTR SS:[ESP],EAX
        }
        return RetVal;

}
</code></pre>
<p>Das sieht das in ASM so aus:</p>
<pre><code class="language-asm">0040137C   PUSH EBX
0040137D   PUSH ECX
0040137E   MOV DWORD PTR SS:[EBP],0     &lt;--- @0x0012FF88 (Anw. muss drin sein, sonst siehe unten)
00401385   CALL DWORD PTR DS:[40E7C0]
0040138B   MOV DWORD PTR SS:[ESP],EAX   &lt;--- HARDCORE @0x0012FF74 (the real offset of RetVal)
0040138F   MOV EAX,DWORD PTR SS:[ESP]   &lt;--- ist auch Rückgabewert (ok)
00401392   POP EDX
00401393   POP EBX
00401394   RETN
</code></pre>
<p>Das MOV retVal,0 muss drinbleiben, sonst vermurkst der Compiler alles,<br />
dh. er optimiert die Anweisung komplett weg und nichts geht mehr:</p>
<pre><code class="language-asm">0040137C   PUSH EBX
0040137D   PUSH ESI
0040137E   CALL DWORD PTR DS:[40E7C0]
00401384   MOV DWORD PTR SS:[ESP],EAX  &lt;--- @0x0012FF74 (ok)
00401388   MOV EAX,ESI                 &lt;--- wtf kommt das her?! == return SCHROTT!!
0040138A   POP ESI
0040138B   POP EBX
0040138C   RETN
</code></pre>
<p>Das ist doch nur noch zum kotzen. Hätte mir doch den VC++ statt BCB kaufen sollen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/567669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/567669</guid><dc:creator><![CDATA[graumarl]]></dc:creator><pubDate>Sat, 24 Jul 2004 22:12:17 GMT</pubDate></item><item><title><![CDATA[Reply to API Aufruf mir Inline Assembler &#x2F; Rücksprungaddresse ermitteln on Sat, 24 Jul 2004 22:17:15 GMT]]></title><description><![CDATA[<p>CanDL schrieb:</p>
<blockquote>
<p>Muss das denn sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ??? Asm für Api-Calls zu verwenden ist sowas von unnötig. Vielleicht solltest du alles noch ma überdenken. Im übrigen verbirgt sich hinter HWND ein Pointer auf struct HWND__. Also rechnet mit Zeigern und nicht mit Daten... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>mfg</p>
</blockquote>
<p>Und die Rücksprungadresse kriege ich mit 0815 API auch, was? Wenn Du wüsstest, wofür ich den Code einsetze, würdest Du sowas nicht schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/567672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/567672</guid><dc:creator><![CDATA[graumarl]]></dc:creator><pubDate>Sat, 24 Jul 2004 22:17:15 GMT</pubDate></item><item><title><![CDATA[Reply to API Aufruf mir Inline Assembler &#x2F; Rücksprungaddresse ermitteln on Sun, 25 Jul 2004 02:15:53 GMT]]></title><description><![CDATA[<p>jetzt hast du mich neugierig gemacht ! wofür willst du denn den code einsetzen ?<br />
Weil ich denk auch dann besser nicht über asm zu machen (vor allem den api aufruf solltest du dem compiler allein überlassen).<br />
und die rücksprungadresse wird ja normal glaub ich auf den stack gelegt und da musst du sie nur noch runterholen.</p>
<p>MFG O-G</p>
]]></description><link>https://www.c-plusplus.net/forum/post/567709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/567709</guid><dc:creator><![CDATA[O-G]]></dc:creator><pubDate>Sun, 25 Jul 2004 02:15:53 GMT</pubDate></item></channel></rss>