<?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[Prozess-ID und Handle auf Gültigkeit prüfen?]]></title><description><![CDATA[<p>Hi</p>
<p>Ich möchte in meinem Code jederzeit in der Lage sein in einen fremden Prozess zu schreiben. Der Code ist für einen Spieletrainer. Mein Code zum schreiben schaut atm so aus:</p>
<pre><code class="language-cpp">bool Cmem::Write(long addr, unsigned char *data, unsigned int bytes)
{
	if (PID==0)                     // Do we have a process ID?
	{
		if (!Reopenprocess())	// try to reopen the process
			return 0;
		StoreTrainerInfo();	// recalculation of some moduladdresses
		WriteCodecaves();
		ReactivateOptions();
	}
	if (addr&gt;=0x00400000)		// prevent accessviolations
	{
		unsigned long Protection;
		VirtualProtectEx( hproc, (LPVOID)addr, bytes, PAGE_READWRITE, &amp;Protection);
		if( !WriteProcessMemory(hproc, (LPVOID)addr, (LPVOID)data, bytes, 0) )
		{
			if (!Reopenprocess())// write failed, try to reopen the process
			{
				return 0;
			}
			StoreTrainerInfo(); // recalculation of some moduladdresses
			WriteCodecaves();
			ReactivateOptions();
			VirtualProtectEx( hproc, (LPVOID)addr, bytes, PAGE_READWRITE, &amp;Protection);
			if( !WriteProcessMemory(hproc, (LPVOID)addr, (LPVOID)data, bytes, 0) )	// reopen successfull, try write again
			{
				return 0;
			}
		}
		VirtualProtectEx( hproc, (LPVOID)addr, bytes, Protection, 0);
		return 1;
	}
	accessviolation_prevented++; // increase access violation counter by one
	return 0;
}
</code></pre>
<p>Das funktioniert soweit ganz gut, aber ich habe mich gefragt ob das nicht einfacher geht. Anstatt &quot;if (PID==0)&quot; würde ich gerne an der Stelle eine generelle Überprüfung einbauen ob meine aktuelle ProzessID/ Prozesshandle gültig ist. Es ist davon auszugehen das sich beides ständig ändert. Diese Überprüfung sollte sicherstellen das ich problemlos WriteProcessMemory() verwenden kann. Ich möchte den kompletten Code nach dem ersten ...<br />
if( !WriteProcessMemory(hproc, (LPVOID)addr, (LPVOID)data, bytes, 0) )<br />
{<br />
// diesen code hier<br />
}<br />
... vermeiden und dort eine Fehlermeldung/MessageBox einbauen. Diese Fehlermeldung sollte dann in der Theorie NUR auftreten, wenn der Zielprozess zwischen dem Aufruf der Prozess-Gültigkeitsprüfung (jetzt noch PID==0) und WriteProcessMemory() beenden wird.</p>
<p>Sollte die Gültigkeitsprüfung negativ ausfallen muss einfach nur Reopenprocess() aufgerufen werden. Diese Funktion öffnet den Prozess dann neu und speichert PID/hproc innerhalb der Klasse.</p>
<p>Ich könnte wetten die Lösung dafür ist extrem einfach. Bisher konnte ich jedoch im MSDN nix dazu finden wie man PID/hproc von fremden Prozessen überprüft.</p>
<p>Gruß gluestick</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/224548/prozess-id-und-handle-auf-gültigkeit-prüfen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 21:24:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224548.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 Oct 2008 11:31:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Prozess-ID und Handle auf Gültigkeit prüfen? on Sat, 11 Oct 2008 11:31:02 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Ich möchte in meinem Code jederzeit in der Lage sein in einen fremden Prozess zu schreiben. Der Code ist für einen Spieletrainer. Mein Code zum schreiben schaut atm so aus:</p>
<pre><code class="language-cpp">bool Cmem::Write(long addr, unsigned char *data, unsigned int bytes)
{
	if (PID==0)                     // Do we have a process ID?
	{
		if (!Reopenprocess())	// try to reopen the process
			return 0;
		StoreTrainerInfo();	// recalculation of some moduladdresses
		WriteCodecaves();
		ReactivateOptions();
	}
	if (addr&gt;=0x00400000)		// prevent accessviolations
	{
		unsigned long Protection;
		VirtualProtectEx( hproc, (LPVOID)addr, bytes, PAGE_READWRITE, &amp;Protection);
		if( !WriteProcessMemory(hproc, (LPVOID)addr, (LPVOID)data, bytes, 0) )
		{
			if (!Reopenprocess())// write failed, try to reopen the process
			{
				return 0;
			}
			StoreTrainerInfo(); // recalculation of some moduladdresses
			WriteCodecaves();
			ReactivateOptions();
			VirtualProtectEx( hproc, (LPVOID)addr, bytes, PAGE_READWRITE, &amp;Protection);
			if( !WriteProcessMemory(hproc, (LPVOID)addr, (LPVOID)data, bytes, 0) )	// reopen successfull, try write again
			{
				return 0;
			}
		}
		VirtualProtectEx( hproc, (LPVOID)addr, bytes, Protection, 0);
		return 1;
	}
	accessviolation_prevented++; // increase access violation counter by one
	return 0;
}
</code></pre>
<p>Das funktioniert soweit ganz gut, aber ich habe mich gefragt ob das nicht einfacher geht. Anstatt &quot;if (PID==0)&quot; würde ich gerne an der Stelle eine generelle Überprüfung einbauen ob meine aktuelle ProzessID/ Prozesshandle gültig ist. Es ist davon auszugehen das sich beides ständig ändert. Diese Überprüfung sollte sicherstellen das ich problemlos WriteProcessMemory() verwenden kann. Ich möchte den kompletten Code nach dem ersten ...<br />
if( !WriteProcessMemory(hproc, (LPVOID)addr, (LPVOID)data, bytes, 0) )<br />
{<br />
// diesen code hier<br />
}<br />
... vermeiden und dort eine Fehlermeldung/MessageBox einbauen. Diese Fehlermeldung sollte dann in der Theorie NUR auftreten, wenn der Zielprozess zwischen dem Aufruf der Prozess-Gültigkeitsprüfung (jetzt noch PID==0) und WriteProcessMemory() beenden wird.</p>
<p>Sollte die Gültigkeitsprüfung negativ ausfallen muss einfach nur Reopenprocess() aufgerufen werden. Diese Funktion öffnet den Prozess dann neu und speichert PID/hproc innerhalb der Klasse.</p>
<p>Ich könnte wetten die Lösung dafür ist extrem einfach. Bisher konnte ich jedoch im MSDN nix dazu finden wie man PID/hproc von fremden Prozessen überprüft.</p>
<p>Gruß gluestick</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597339</guid><dc:creator><![CDATA[gluestick]]></dc:creator><pubDate>Sat, 11 Oct 2008 11:31:02 GMT</pubDate></item><item><title><![CDATA[Reply to Prozess-ID und Handle auf Gültigkeit prüfen? on Sat, 11 Oct 2008 15:21:27 GMT]]></title><description><![CDATA[<p>Was bitte ist die Gültigkeit eines PID oder Porzess-Handles?</p>
<p>Ein Prozess Handle ist solange gültig, wie Du es nicht schließt! Punkt!<br />
Das Handle behält auch seine Gültigkeit, wenn der Prozess beendet wird.<br />
Dein Schreiben in den Prozessraum wird dann dennoch fehlschlagen.</p>
<p>Ein PID ist dann gültig wenn Du OpenProcess auf ihn ausführen kannst. Solange Du ein Handle auf den Prozess hast ist auch der PID existent.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms684868(VS.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms684868(VS.85).aspx</a></p>
<blockquote>
<p>The handles are valid until closed, even after the process or thread they represent has been terminated.</p>
</blockquote>
<p>Wenn Du ein Handle geschlossen hast ist es nicht mehr verwendbar für Dich, heißt aber nicht, dass der Prozess nicht noch existiert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597451</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sat, 11 Oct 2008 15:21:27 GMT</pubDate></item><item><title><![CDATA[Reply to Prozess-ID und Handle auf Gültigkeit prüfen? on Sat, 11 Oct 2008 18:30:43 GMT]]></title><description><![CDATA[<blockquote>
<p>Was bitte ist die Gültigkeit eines PID oder Prozess-Handles?</p>
</blockquote>
<p>Ok, dann schei*e formuliert: Wie bekomme ich heraus ob sich hinter einem Handle ein aktiver Prozess verbirgt. Ich meinte also die Gültigkeit im Sinne von *auch verwendbar* für Funktionen wie WriteProcessMemory(). Klar ist das &quot;gültige&quot; aber *tote* Handle einen beendeten Prozesses damit auch verwendbar ... nur es macht keinen Sinn es so zu verwenden.</p>
<p>Habe gerade diese Lösung hier gefunden, ist perfekt:</p>
<p>How to identify a stale handle?<br />
<a href="http://nibuthomas.wordpress.com/category/windows-api/" rel="nofollow">http://nibuthomas.wordpress.com/category/windows-api/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597541</guid><dc:creator><![CDATA[gluestick]]></dc:creator><pubDate>Sat, 11 Oct 2008 18:30:43 GMT</pubDate></item><item><title><![CDATA[Reply to Prozess-ID und Handle auf Gültigkeit prüfen? on Sat, 11 Oct 2008 19:07:44 GMT]]></title><description><![CDATA[<p>Behalte das Handle offen nur dann ist es auch gültig.<br />
Der Code funktioniert nur, solange das Handle von Dir offen gehalten wird.</p>
<p>Ein Handle kann recycled werden. Es könnte aus dem Process-Handle ein Event oder ein File Handle werden und dann?<br />
Auch dann wäre ein Handle waitable.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597564</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sat, 11 Oct 2008 19:07:44 GMT</pubDate></item><item><title><![CDATA[Reply to Prozess-ID und Handle auf Gültigkeit prüfen? on Sat, 11 Oct 2008 19:06:52 GMT]]></title><description><![CDATA[<p>Wenn Du das Prozess-Handle hast, kannst Du natürlich &quot;GetExitCodeProcess&quot; aufrufen... so erfährst Du, ob der Prozess noch läuft.<br />
Oder Du machst ein &quot;WaitForSingleObject&quot; mit Timeout 0.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1597570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1597570</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Sat, 11 Oct 2008 19:06:52 GMT</pubDate></item><item><title><![CDATA[Reply to Prozess-ID und Handle auf Gültigkeit prüfen? on Thu, 16 Oct 2008 18:08:27 GMT]]></title><description><![CDATA[<p>Martin schrieb:</p>
<blockquote>
<p>Ein Handle kann recycled werden. Es könnte aus dem Process-Handle ein Event oder ein File Handle werden und dann? Auch dann wäre ein Handle waitable.</p>
</blockquote>
<p>Also heißt das mit WaitForSingleObject(hproc,0) kann ich nicht 100%ig sicher überprüfen ob sich hinter dem Handle noch ein laufender Prozess verbirgt?<br />
Ein Handle kann doch sicher erst dann neu verwendet (&quot;recycled&quot;) werden wenn man es mit CloseHandle(hproc) wieder freigegeben hat, oder etwa nicht?</p>
<p>Jochen schrieb:</p>
<blockquote>
<p>Oder Du machst ein &quot;WaitForSingleObject&quot; mit Timeout 0.</p>
</blockquote>
<p>Wenn ich es richtig verstehe widersprechen sich eure Antworten. Was ist den jetzt richtig?, kann man das Codesnippet von...<br />
<a href="http://nibuthomas.wordpress.com/category/windows-api/" rel="nofollow">http://nibuthomas.wordpress.com/category/windows-api/</a><br />
.. mit ruhigem Gewissen verwenden oder nicht? Dort wird es ja wie Jochen sagte mit Timeout 0 aufgerufen. Von recycelten Handles ist jedoch keine Rede - was mich erneut zur Frage bringt ob der Code korrekt ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600086</guid><dc:creator><![CDATA[gluestick]]></dc:creator><pubDate>Thu, 16 Oct 2008 18:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to Prozess-ID und Handle auf Gültigkeit prüfen? on Thu, 16 Oct 2008 19:09:16 GMT]]></title><description><![CDATA[<p>Korrekt. Solange man noch ein offenes Handle hat, kann dieses Handle nicht recycled werden und man kann WaitFor... darauf ausführen und feststellen ob der Prozess noch läuft.</p>
<p>Geht aber einfacher mit GetExitCodeProcess...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600120</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 16 Oct 2008 19:09:16 GMT</pubDate></item><item><title><![CDATA[Reply to Prozess-ID und Handle auf Gültigkeit prüfen? on Thu, 16 Oct 2008 19:41:02 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>&quot;offenes Handle&quot;</p>
<p>Zu den HANDLEs kann ich sagen, das Windows systemintern zu jeder PID (oder sonstigem Objekt, das mit mit H... (z.B. HDC) aus dem Kernel kommt) für jedes Handle einen Zähler hat. Erzeugst Du Dir mit <strong>GetCurrentProcess()</strong> ein Handle, dann hast Du ein <strong>Pseudohandle</strong>. Das ist quasi gemappt (copy by value) auf das echte Handle. Der Wert sollte dieser sein: echtesHandle - 1 = pseudoHandle. Der Handle-Zähler des Systems wird NICHT inkrementiert. Das zeigt sich darin, dass <strong>CloseHandle(pseudeHandle)</strong> nichts macht. Trotzdem kannst Du IN dem Prozess, auf den sich das Pseudohandle bezieht, mit diesem viel Quatsch machen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .<br />
Willst Du aus diesem &quot;weichen&quot; Handle aber ein &quot;hartes&quot; Handle machen, brauchst Du <strong>DuplicateHandle(pseudoHandle,pseudoHandle,pseudoHandle,&amp;pseudoHandle,...);</strong>.<br />
Jetzt ist Dein PseudoHandle &quot;hart&quot;. Der Handle-Zähler Deines Prozesses wurde inkrementiert. Machst Du nun ein CloseHandle(pseudoHandle), lebt Dein Prozess weiter, aber der Zähler des Systems für Deinen Prozess wurde dekrementiert.</p>
<p>Kleiner Tipp am Rande: Alles, was SECURITY_ATTRIBUTES verlagt, kommt aus dem Kernel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600127</guid><dc:creator><![CDATA[chezzmatazz]]></dc:creator><pubDate>Thu, 16 Oct 2008 19:41:02 GMT</pubDate></item></channel></rss>