<?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[Falsche Calling Convention?]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich möchte die Funktion GetComputerNameExA in einem Projekt benutzen das auch auf Win95 laufen soll. Da die Api dort nicht direkt läuft muß ich sie dynamisch über LoadLibrary ansteuern.<br />
Dieser Source dunktioniert aber nicht, weil der ESP nicht gesichert wurde. Die anderen beiden calls sind aber auch nicht richtig.<br />
In dem Source gibt es zwei Aufrufe von GetComputerNameExA. Wenn ich einen auskommentiere gibt es den Absturz nicht mehr, der Buffer ist aber mit Müll beschrieben. Wenn der zweite Aufruf aktiv ist, wird hier der Buffer zwar gefüllt, ich erhalte aber den ESP Fehler. Was mache ich falsch?</p>
<p>Vielen Dank</p>
<p>Peter</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;malloc.h&gt;

#define BUFFER_SIZE 1000

typedef enum _COMPUTER_NAME_FORMAT {
    ComputerNameNetBIOS,
    ComputerNameDnsHostname,
    ComputerNameDnsDomain,
    ComputerNameDnsFullyQualified,
    ComputerNamePhysicalNetBIOS,
    ComputerNamePhysicalDnsHostname,
    ComputerNamePhysicalDnsDomain,
    ComputerNamePhysicalDnsFullyQualified,
    ComputerNameMax
} COMPUTER_NAME_FORMAT;

// GetComputerNameExA()
typedef int (__stdcall *MyFunc) ( int, char *, unsigned long * );
// typedef int (__cdecl *MyFunc) ( int, char *, unsigned long * );
// typedef int (__stdcall *MyFunc) ( int, char *, unsigned long * );

int ReadDomainWinXP() {
	char name[MAX_COMPUTERNAME_LENGTH + 1];
	unsigned long size = MAX_COMPUTERNAME_LENGTH + 1;
	MyFunc GetComputerNameExA;
	HINSTANCE hInst;

	hInst = LoadLibrary(&quot;kernel32.dll&quot;); 
	if(hInst != NULL) {
		GetComputerNameExA = (MyFunc)GetProcAddress(hInst, &quot;GetComputerNameExA&quot;);

		GetComputerNameExA(ComputerNamePhysicalDnsFullyQualified, name, &amp;size);
		printf(&quot;WinXP full domain: %s\n&quot;, name);
		GetComputerNameExA(ComputerNameDnsDomain, name, &amp;size);
		printf(&quot;WinXP domain: %s\n&quot;, name);
	}

	return 0;
}

int main(void) {
  ReadDomainWinXP();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/180841/falsche-calling-convention</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 02:58:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180841.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 May 2007 09:49:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Falsche Calling Convention? on Mon, 07 May 2007 09:49:50 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich möchte die Funktion GetComputerNameExA in einem Projekt benutzen das auch auf Win95 laufen soll. Da die Api dort nicht direkt läuft muß ich sie dynamisch über LoadLibrary ansteuern.<br />
Dieser Source dunktioniert aber nicht, weil der ESP nicht gesichert wurde. Die anderen beiden calls sind aber auch nicht richtig.<br />
In dem Source gibt es zwei Aufrufe von GetComputerNameExA. Wenn ich einen auskommentiere gibt es den Absturz nicht mehr, der Buffer ist aber mit Müll beschrieben. Wenn der zweite Aufruf aktiv ist, wird hier der Buffer zwar gefüllt, ich erhalte aber den ESP Fehler. Was mache ich falsch?</p>
<p>Vielen Dank</p>
<p>Peter</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;malloc.h&gt;

#define BUFFER_SIZE 1000

typedef enum _COMPUTER_NAME_FORMAT {
    ComputerNameNetBIOS,
    ComputerNameDnsHostname,
    ComputerNameDnsDomain,
    ComputerNameDnsFullyQualified,
    ComputerNamePhysicalNetBIOS,
    ComputerNamePhysicalDnsHostname,
    ComputerNamePhysicalDnsDomain,
    ComputerNamePhysicalDnsFullyQualified,
    ComputerNameMax
} COMPUTER_NAME_FORMAT;

// GetComputerNameExA()
typedef int (__stdcall *MyFunc) ( int, char *, unsigned long * );
// typedef int (__cdecl *MyFunc) ( int, char *, unsigned long * );
// typedef int (__stdcall *MyFunc) ( int, char *, unsigned long * );

int ReadDomainWinXP() {
	char name[MAX_COMPUTERNAME_LENGTH + 1];
	unsigned long size = MAX_COMPUTERNAME_LENGTH + 1;
	MyFunc GetComputerNameExA;
	HINSTANCE hInst;

	hInst = LoadLibrary(&quot;kernel32.dll&quot;); 
	if(hInst != NULL) {
		GetComputerNameExA = (MyFunc)GetProcAddress(hInst, &quot;GetComputerNameExA&quot;);

		GetComputerNameExA(ComputerNamePhysicalDnsFullyQualified, name, &amp;size);
		printf(&quot;WinXP full domain: %s\n&quot;, name);
		GetComputerNameExA(ComputerNameDnsDomain, name, &amp;size);
		printf(&quot;WinXP domain: %s\n&quot;, name);
	}

	return 0;
}

int main(void) {
  ReadDomainWinXP();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1280170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280170</guid><dc:creator><![CDATA[abcd]]></dc:creator><pubDate>Mon, 07 May 2007 09:49:50 GMT</pubDate></item><item><title><![CDATA[Reply to Falsche Calling Convention? on Tue, 08 May 2007 07:25:49 GMT]]></title><description><![CDATA[<p>Ich kann keinen Fehler feststellen.<br />
Du musst aber</p>
<pre><code class="language-cpp">size = MAX_COMPUTERNAME_LENGTH+1;
</code></pre>
<p>Vor jeder Abfrage neu setzen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280665</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 08 May 2007 07:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to Falsche Calling Convention? on Tue, 08 May 2007 17:08:40 GMT]]></title><description><![CDATA[<p>Hallo Martin,</p>
<p>es lag daran das MAX_COMPUTERNAME_LENGTH nicht die richtige Buffergröße war. Bei dem Aufruf wird die Domain auch noch zurückgegeben. Durch das falsche setzen der Size kam es dann zum Bufferoverflow...</p>
<p>Vielen Grüße</p>
<p>Peter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1281059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281059</guid><dc:creator><![CDATA[abcd]]></dc:creator><pubDate>Tue, 08 May 2007 17:08:40 GMT</pubDate></item></channel></rss>