<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Martin&#039;s Blog &#187; VS 2008</title>
	<atom:link href="http://blog.m-ri.de/index.php/category/programmieren/vs2008/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.m-ri.de</link>
	<description>Gesammeltes aus dem Leben eines &#34;normalen&#34; Programmierers... :-)</description>
	<lastBuildDate>Sat, 04 Feb 2012 12:07:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>VS-Tipps &amp; Tricks: Debugger Pseudo Variablen</title>
		<link>http://blog.m-ri.de/index.php/2011/11/26/vs-tipps-tricks-debugger-pseudo-variablen/</link>
		<comments>http://blog.m-ri.de/index.php/2011/11/26/vs-tipps-tricks-debugger-pseudo-variablen/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 18:28:55 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[VC-2008]]></category>
		<category><![CDATA[VC-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=851</guid>
		<description><![CDATA[Die folgenden Variablen helfen mir immer wieder beim Debuggen und zeigen einem während des Debuggens in Watch-Window manch nützliche Information: $TID Die Thread ID des aktuellen Threads. Nützlich wenn man mehrere Threads debuggt und bestimmte Threads bei einem Breakpoint identifizieren muss. $HANDLES Die Anzahl der aktuell benutzen System-Handles des Prozesses. Handle Leaks lassen sich damit [...]]]></description>
			<content:encoded><![CDATA[<p>Die folgenden Variablen helfen mir immer wieder beim Debuggen und zeigen einem während des Debuggens in Watch-Window manch nützliche Information:</p>
<ul>
<li><strong><em>$TID<br />
</em></strong>Die Thread ID des aktuellen Threads. Nützlich wenn man mehrere Threads debuggt und bestimmte Threads bei einem Breakpoint identifizieren muss.</li>
<li><em><strong>$HANDLES</strong></em><br />
Die Anzahl der aktuell benutzen System-Handles des Prozesses. Handle Leaks lassen sich damit im Debugger leicht überwachen.</li>
<li><em><strong>$ERR<br />
</strong>GetLastError</em> leicht gemacht. Schlägt ein WinApi Befehl fehl, dann ist es schön das man sofort beim Debuggen im Watch-Window sehen kann was die Ursache war. Oft genug ist ja im Code selbst kein Aufruf von <em>GetLastError</em> vorhanden oder nötig.</li>
</ul>
<p>Siehe auch MSDN:<br />
<a href="http://msdn.microsoft.com/en-us/library/ms164891.aspx">http://msdn.microsoft.com/en-us/library/ms164891.aspx</a></p>
<p>BTW: <em>WinDbg</em> hat noch einige mehr nette Pseudovariablen:<br />
<a href="http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/06/16/special-command-using-variables-and-retrieving-information-through-pseudo-registers.aspx">http://blogs.msdn.com/b/debuggingtoolbox/archive/2008/06/16/special-command-using-variables-and-retrieving-information-through-pseudo-registers.aspx</a><br />
Schmerzhaft vermisse ich immer wieder <em>$PEB, $TEB, $TPID, $RA</em> im <em>Visual Studio, </em>komisch, dass es die nur im <em>WinDbg</em> gibt.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/11/26/vs-tipps-tricks-debugger-pseudo-variablen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Für was ist der Makro %(PreprocessorDefinitions) gut ?</title>
		<link>http://blog.m-ri.de/index.php/2011/10/16/fur-was-ist-der-makro-preprocessordefinitions-gut/</link>
		<comments>http://blog.m-ri.de/index.php/2011/10/16/fur-was-ist-der-makro-preprocessordefinitions-gut/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 17:54:35 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[ATL]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Compiler]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=903</guid>
		<description><![CDATA[In den C++ Compilereinstellungen finden sich ein vorgegebener Makro %(PreprocessorDefinitions) in den C++ Präprozessor Definitionen. Die Verwendung dieses Makros ist nicht ganz offensichtlich. Dieser Makro sollten in jedem Fall nicht entfernt werden, denn Sie dienen der Übernahme einiger Einstellungen aus der General-Seite für die C++ Projekte. Zum Beispiel werden die Einstellungen für Unicode und MBCS über [...]]]></description>
			<content:encoded><![CDATA[<p>In den C++ Compilereinstellungen finden sich ein vorgegebener Makro <em>%(PreprocessorDefinitions)</em> in den C++ Präprozessor Definitionen. Die Verwendung dieses Makros ist nicht ganz offensichtlich.</p>
<p>Dieser Makro sollten in jedem Fall nicht entfernt werden, denn Sie dienen der Übernahme einiger Einstellungen aus der <em>General</em>-Seite für die C++ Projekte. Zum Beispiel werden die Einstellungen für Unicode und MBCS über den Makro <em>%(PreprocessorDefinitions)</em> in die allgemeinen Compiler-Einstellungen übernommen (die entsprechenden Defines sind <em>_UNICODE; UNICODE; _MBCS </em>).<br />
Erzeugt man eine DLL wird zusätzlich <em>_WINDLL</em> gesetzt.<br />
Setzt man ATL Optionen in der General Seite wird auch über die <em>%(PreprocessorDefinitions) _ATLDLL</em> bzw. <em>_ATL_STATIC_REGISTRY</em> gesetzt oder zurückgesetzt.<br />
Gleiches gilt, wenn die <em>MFC</em> als shared DLL verwendet wird. In diesem Fall wird der Define <em>_AFXDLL</em> zusätzlich gesetzt.</p>
<p>Löscht man also <em>%(PreprocessorDefinitions)</em> dann werden alle diese Einstellungen nicht mehr  korrekt übernommen.</p>
<p>Anmerkung:<br />
Bei dem Linker Makro <em>%(AdditionalDependencies) </em>habe ich eine ähnliche Verwendung vermutet, konnte aber keine direkte Beziehung zur Seite General herstellen.</p>
<p>Obwohl es auch hier Einflüsse auf die Linkereinstellungen gibt bei Änderungen in den <em>General</em>-Einstellungen. Werden allerdings die MFC als zusätzliche Bibliothek ausgewählt werden die Standard-LIBs aus dem SDK komplett entfernt. Hier gibt die MFC Bibliothek selbst vor in welchen zusätzlichen Libs, des SDK gesucht werden soll über #pragma comment(lib,..).</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/10/16/fur-was-ist-der-makro-preprocessordefinitions-gut/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LNK2001: unresolved external symbol _mainCRTStartup</title>
		<link>http://blog.m-ri.de/index.php/2011/07/28/lnk2001-unresolved-external-symbol-_maincrtstartup/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/28/lnk2001-unresolved-external-symbol-_maincrtstartup/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 18:53:35 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Anfänger]]></category>
		<category><![CDATA[VC-2010]]></category>
		<category><![CDATA[VC-Express]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=882</guid>
		<description><![CDATA[Ich habe einige Zeit gebraucht um herauszufinden warum ein Benutzer von VC-Express die folgende Meldung bekam: 1&#62;------ Build started: Project: Hallo Welt, Configuration: Debug Win32 ------ 1&#62;LINK : error LNK2001: unresolved external symbol _mainCRTStartup 1&#62;Hallo Welt.exe : fatal error LNK1120: 1 unresolved externals ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Der [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe einige Zeit gebraucht um herauszufinden warum ein Benutzer von VC-Express die folgende Meldung bekam:</p>
<pre>1&gt;------ Build started: Project: Hallo Welt, Configuration: Debug Win32 ------
1&gt;LINK : error LNK2001: unresolved external symbol _mainCRTStartup
1&gt;Hallo Welt.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========</pre>
<p>Der User war ein Anfänger und hat ein leeres Win32 Projekt erzeugt. Anschließend eine Sourcedatei und hat das typische &#8220;Hello World&#8221; Programm schreiben wollen.<br />
Das Problem war aber, dass er zwar die Sourcedatei angelegt hat, diese aber nicht in das erzeugte Projekt eingefügt hat.<br />
Sobald man über die erzeugte Sourcedatei über den Menüpunkt <em>File -&gt; Move file Hello World.cpp into -&gt; Hello World </em> in das Projekt einfügt, klappt alles wie erwartet.<br />
Man kann die Datei natürlich auch über das Kontexmenü im Projekt hinzufügen, oder per Drag &amp; Drop auf den Solution Explorer ziehen.</p>
<p>Und eigentlich ist die Meldung auch klar, für den der sie versteht. Der Linker läuft an, findet keine Objektdateien. Entsprechend werden auch keine <em>CRT</em> Libraries einbezogen und geladen. Aber der Linker will gemäß den Einstellungen einen entsprechenden Einsprungpunkt für die CRT finden und wirft die obige Fehlermeldung aus.</p>
<p>Ich muss ehrlich sagen, dass mir die Fehlermeldung erst etwas gesagt hat, als ich per Email, das Beispielprojekt zugesendet bekam.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/28/lnk2001-unresolved-external-symbol-_maincrtstartup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zur Abwechslung mal ein kleines Quiz: Was ist das Problem mit diesem Template?</title>
		<link>http://blog.m-ri.de/index.php/2011/07/17/zur-abwechslung-mal-ein-kleines-quiz-was-ist-das-problem-mit-diesem-template/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/17/zur-abwechslung-mal-ein-kleines-quiz-was-ist-das-problem-mit-diesem-template/#comments</comments>
		<pubDate>Sun, 17 Jul 2011 10:25:00 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=875</guid>
		<description><![CDATA[Folgender Code wurde in einem Programmteil von uns eingebaut: template &#60;class T&#62; void SecureClearString&#40;T &#38;strText&#41; &#123; ::SecureZeroMemory&#40;strText.GetBuffer&#40;0&#41;,strText.GetAllocLength&#40;&#41;&#41;; strText.Empty&#40;&#41;; &#125; Der Sinn und Zweck sollte sein, dass der Inhalt einer CString Variable durch diesen Code überschrieben und anschließend freigegeben wird, damit zum Beispiel ein Kennwort oder ein Benutzername nicht mehr im Speicher lesbar bleibt. Die Anwendung [...]]]></description>
			<content:encoded><![CDATA[<p>Folgender Code wurde in einem Programmteil von uns eingebaut:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> SecureClearString<span style="color: #008000;">&#40;</span>T <span style="color: #000040;">&amp;</span>strText<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #008080;">::</span><span style="color: #007788;">SecureZeroMemory</span><span style="color: #008000;">&#40;</span>strText.<span style="color: #007788;">GetBuffer</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>,strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  strText.<span style="color: #007788;">Empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Der Sinn und Zweck sollte sein, dass der Inhalt einer CString Variable durch diesen Code überschrieben und anschließend freigegeben wird, damit zum Beispiel ein Kennwort oder ein Benutzername nicht mehr im Speicher lesbar bleibt.<br />
Die Anwendung sieht in etwa so aus (war allerdings noch in einer Klasse gekapselt):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">CString strPassword<span style="color: #008080;">;</span>
...
<span style="color: #666666;">// Fill password and use it</span>
...
<span style="color: #007788;">SecureClearString</span><span style="color: #008000;">&#40;</span>strPassword<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Doch leider ist was faul mit dem Code&#8230; zwei Probleme gibt es mit diesem Stück Code.<br />
Meine Frage an meine Leser lautet nun was <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_question.gif' alt=':?:' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/17/zur-abwechslung-mal-ein-kleines-quiz-was-ist-das-problem-mit-diesem-template/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>VS-Tipps &amp; Tricks: Wie man gezielt einen Breakpoint für einen Thread setzen kann</title>
		<link>http://blog.m-ri.de/index.php/2011/07/02/vs-tipps-tricks-wie-man-gezielt-einen-breakpoint-fur-einen-thread-setzen-kann/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/02/vs-tipps-tricks-wie-man-gezielt-einen-breakpoint-fur-einen-thread-setzen-kann/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 18:46:07 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[Testen]]></category>
		<category><![CDATA[VS-2010]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=858</guid>
		<description><![CDATA[Wenn man eine Anwendung oder einen Dienst hat, der mit vielen Threads arbeitet, dann kann das Debuggen abenteuerlich werden. Besonders wenn viele Threads ein und die selbe Threadfunktion verwenden. Was macht man nun wenn man einen Thread isoliert hat und dessen Verhalten weiter prüfen möchte? Single-Stepping ist nicht drin, denn der Breakpoint würde auch jeden [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn man eine Anwendung oder einen Dienst hat, der mit vielen Threads arbeitet, dann kann das Debuggen abenteuerlich werden. Besonders wenn viele Threads ein und die selbe Threadfunktion verwenden.<br />
Was macht man nun wenn man einen Thread isoliert hat und dessen Verhalten weiter prüfen möchte? Single-Stepping ist nicht drin, denn der Breakpoint würde auch jeden anderen Thread anhalten, der diese Code-Position erreicht.</p>
<p>Die nachfolgende Methode ist relativ einfach um gezielt einen Breakpoint für einen Thread zu setzen.<br />
Gehen wir mal davon aus, dass wir im Debugger einen Breakpoint haben und uns im Kontext des Threads befinden, den wir nun weiter verfolgen wollen.</p>
<ol>
<li>Zuallererst ermitteln wir die <em>Thread-Id</em>.<br />
Das geht elementar einfach über die Pseudo-Debugger-Variable <em>$TID</em>, die wir uns im Watch-Fenster, oder im Quick-View anzeigen lassen:<br />
<a href="http://blog.m-ri.de/wp-content/uploads/2011/05/BP1.png"><img class="size-full wp-image-861 alignnone" title="BP1" src="http://blog.m-ri.de/wp-content/uploads/2011/05/BP1.png" alt="" width="501" height="219" /></a></li>
<li>Als nächstes modifizieren wir den Breakpoint so, dass er nur noch dann stoppt, wenn auch unser Thread diesen Breakpoint erreicht.<br />
Das erreichen wir über die Breakpoint-Eigenschaft Condition (rechter Mausklick, über das Kontextmenü):<br />
<a href="http://blog.m-ri.de/wp-content/uploads/2011/05/BP2.png"><img class="alignnone size-full wp-image-862" title="BP2" src="http://blog.m-ri.de/wp-content/uploads/2011/05/BP2.png" alt="" width="472" height="320" /></a><br />
Hier geben wir einfach als Bedingung an, das $TID (also die Thread-ID) identisch sein muss, zu der ID des Threads, den wir beobachten wollen.</li>
<li>Den Rest macht der Debugger für uns, wenn wir wieder den Go-Befehl (F5) geben:<br />
<a href="http://blog.m-ri.de/wp-content/uploads/2011/05/BP3.png"><img class="alignnone size-full wp-image-863" title="BP3" src="http://blog.m-ri.de/wp-content/uploads/2011/05/BP3.png" alt="" width="595" height="103" /></a></li>
</ol>
<p>Auf diese Weise kann man auch mehrere Threads einfach beobachten.</p>
<p>Hinweis:<br />
Dieses Verfahren ändert das Laufzeitverhalten des Programmes, denn der Breakpoint wird immer intern ausgeführt, egal welcher Thread diese Codestelle passiert. Nur ermittelt der Debugger dann die Bedingung returniert und lässt das Programm, dann weiterlaufen, wenn die Id nicht passt. Wird diese Codestelle sehr oft passiert, dann kann ist der Einfluss eines solchen Breakpoints nicht  unerheblich.</p>
<p>Alternativ, kann man in solch einem Fall auch ein Stück Code einsetzen, der die aktuelle Thread-ID gegen eine statische Variable testet und einen <em>DebugBreak </em>ausführt. Die statische Variable setzt man dann während der Debugsession auf die gwünschte Thread-ID über das Watch-Window oder den Quick-View</p>
<p>Weiterführende Infos zu Debugger-Pseudo-Variablen von Visual-Studio findet man hier:<br />
<a href="http://msdn.microsoft.com/en-us/library/ms164891.aspx">http://msdn.microsoft.com/en-us/library/ms164891.aspx</a></p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/02/vs-tipps-tricks-wie-man-gezielt-einen-breakpoint-fur-einen-thread-setzen-kann/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Patchday vom 14.06.2011 behebt die Probleme der VisualStudio 2005/2008 Servicepacks vom 13.04.2011</title>
		<link>http://blog.m-ri.de/index.php/2011/06/18/patchday-vom-14-06-2011-behebt-die-probleme-der-visualstudio-20052008-servicepacks-vom-13-04-2011/</link>
		<comments>http://blog.m-ri.de/index.php/2011/06/18/patchday-vom-14-06-2011-behebt-die-probleme-der-visualstudio-20052008-servicepacks-vom-13-04-2011/#comments</comments>
		<pubDate>Sat, 18 Jun 2011 08:14:03 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[SP]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[WIndows XP]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=870</guid>
		<description><![CDATA[Die nachfolgenden 4 Sicherheitsupdates wurden am 14.06.2011 von Microsoft herausgegeben: Sicherheitsupdate für Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package (KB2538242) Sicherheitsupdate für Microsoft Visual Studio 2005 Service Pack 1 (KB2538218) Sicherheitsupdate für Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package (KB2538243) Sicherheitsupdate für Microsoft Visual Studio 2008 Service Pack 1 (KB2538241) Eigentlich [...]]]></description>
			<content:encoded><![CDATA[<p>Die nachfolgenden 4 Sicherheitsupdates wurden am 14.06.2011 von Microsoft herausgegeben:</p>
<p><a href="http://support.microsoft.com/kb/2538242">Sicherheitsupdate für Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package (KB2538242)</a><br />
<a href="http://support.microsoft.com/kb/2538218">Sicherheitsupdate für Microsoft Visual Studio 2005 Service Pack 1 (KB2538218)</a><br />
<a href="http://support.microsoft.com/kb/2538243">Sicherheitsupdate für Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package (KB2538243)</a><br />
<a href="http://support.microsoft.com/kb/2538241">Sicherheitsupdate für Microsoft Visual Studio 2008 Service Pack 1 (KB2538241)</a></p>
<p>Eigentlich beheben Sie nur das, was am Patchday vom 13.04.2011 hätte behoben werden sollen. Ich habe dazu ja mehrere Artikel geschrieben (<a href="http://blog.m-ri.de/index.php/2011/04/14/bug-black-patchday-for-all-os-from-xp-and-later-3-mfc-8-0-vc-2005-or-mfc-9-0-vc-2008-linked-dynamically-to-the-mfc-may-not-find-the-mfc-language-dlls-after-installation-of-the-security-packs-d/">1</a>, <a href="http://blog.m-ri.de/index.php/2011/04/14/workaround-fur-patchday-bug-vom-12-04-2011-wenn-unter-windows-2000-der-einsprungpunkt-findactctxsectionstringa-nicht-gefunden-wird/">2</a>, <a href="http://blog.m-ri.de/index.php/2011/04/14/bug-schwarzer-patchday-fur-alle-os-xp-und-spater-3-mfc-8-0-vc-2005-oder-mfc-9-0-vc-2008-die-dynamisch-gelinkt-wurden-finden-die-mfc-sprach-dlls-evtl-nicht-mehr-nach-installation-der-sicherhei/">3</a>, <a href="http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-2-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-static-libraries-erzeugen-auch-inkompatiblen-code-fur-windows-2000-durch-kb2465367-bzw-kb2465361/">4</a>, <a href="http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-dlls-sind-nicht-mehr-lauffahig-nach-installation-von-kb2467175-bzw-kb2467175/">5</a>). Nach Vergleich der entsprechenden Sourcen machen Sie Änderungen jetzt das, was sie sollen.</p>
<p>Auch das Problem, dass mit dem letzten Sicherheitsupdate, die Größe der Executables immens angewachsen ist wurde behoben.<br />
Schade, dass dieses Problem in VS-2010 weiter bestehen bleibt.<br />
Insbesondere funktioniert diese neue Runtime für <em>VS-2005 </em>auch auf Windows 2000. Eines der Hauptprobleme vom Patchday im April.</p>
<p>Anzumerken wäre hier eigentlich nur noch die neuen Versionen der Runtime die mit diesem Sicherheitsupdate veröffentlicht werden, d.h. auch, dass man nun die neuen Runtimes auch in sein Setup einbauen sollte, bzw. dass man die neueste passende VCRedist_x86 nun auch mit ausliefern muss. D.h. auch, dass sich die entsprechenden Manifeste wieder ändern, sofern man diese manuell angepasst hat:</p>
<ul>
<li>Die neuen Runtimedateien von <em>VS-2005 </em>haben die Versionsnummer ﻿﻿8.0.50727.6195<br />
Die neue Runtime für <em>VS-2005 </em>gibt es <a href="http://www.microsoft.com/download/en/details.aspx?id=26347">hier zum Download</a>.</li>
<li>Die neuen Runtimedateien von <em>VS-2008 </em>haben ﻿die Versionsnummer ﻿﻿9.0.30729.6161<br />
Die neue Runtime für <em>VS-2008</em> gibt es <a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=26368">hier zum Download</a>.</li>
</ul>
<p>Weitere und vollständige Infos zu diesem Sicherheitsupdate finden sich im VC-Blog:<br />
<a href="http://blogs.msdn.com/b/vcblog/archive/2011/06/17/10175518.aspx">http://blogs.msdn.com/b/vcblog/archive/2011/06/17/10175518.aspx</a></p>
<p>Ich jetzt kann nur allen Entwicklern raten diese neuen Sicherheitsupdates auch zu installieren und zu nutzen!</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/06/18/patchday-vom-14-06-2011-behebt-die-probleme-der-visualstudio-20052008-servicepacks-vom-13-04-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Feature Request: Always ask the developer before applying a service pack or a security fix to Visual Studio that need changed C++ runtime DLLs ATL/MFC/CRT</title>
		<link>http://blog.m-ri.de/index.php/2011/04/20/feature-request-always-ask-the-developer-before-applying-a-service-pack-or-a-security-fix-to-visual-studio-that-need-changed-c-runtime-dlls-atlmfccrt/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/20/feature-request-always-ask-the-developer-before-applying-a-service-pack-or-a-security-fix-to-visual-studio-that-need-changed-c-runtime-dlls-atlmfccrt/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 15:55:54 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Feature Request]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=832</guid>
		<description><![CDATA[I know this is a German blog, but for reaching a wider range of developer this article is written in English In the past security patches to Visual Studio were automatically installed on the machines of developers. This might have a great impact of to the shipment of the software that is created with this [...]]]></description>
			<content:encoded><![CDATA[<p>I know this is a German blog, but for reaching a wider range of developer this article is written in English <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>In the past security patches to <em>Visual Studio </em>were automatically installed on the machines of developers. This might have a great impact of to the shipment of the software that is created with this new pachted Visual-Studio version and it might cause incompatibilities with previous created modules.</p>
<p>And we all suffered under the problems that came with this patches and I don&#8217;t want to know how much time and money was wasted here.</p>
<p>Also I am aware of the risk that is caused when security fixes are not applied. But the last decision must be allowed to a developer if a fix is applied or not.</p>
<p>To avoid this I have a feature request that such security fixes to Visual Studio (any Version: <em>VS-2005</em>, <em>VS-2008</em>, <em>VS-2010</em>) is only applied to the developers machine if he is asked to do this!</p>
<p>Please use your vote and your words to comment this feature request <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /><br />
Here is the link:</p>
<p><strong><a href="https://connect.microsoft.com/VisualStudio/feedback/details/662511/always-ask-the-developer-before-applying-a-security-fix-or-service-pack-to-visual-studio-that-need-changed-the-c-runtime-dlls-atl-mfc-crt">Always ask the developer before applying a security fix or service pack to Visual Studio that need changed the C++ runtime DLLs ATL/MFC/CRT</a></strong></p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/04/20/feature-request-always-ask-the-developer-before-applying-a-service-pack-or-a-security-fix-to-visual-studio-that-need-changed-c-runtime-dlls-atlmfccrt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BUG: Black Patchday for all OS from XP and later 3. &#8211; MFC 8.0 (VC-2005) or MFC 9.0 (VC-2008) linked dynamically to the MFC may not find the MFC language DLLs after installation of the security packs dated April 12th 2011</title>
		<link>http://blog.m-ri.de/index.php/2011/04/14/bug-black-patchday-for-all-os-from-xp-and-later-3-mfc-8-0-vc-2005-or-mfc-9-0-vc-2008-linked-dynamically-to-the-mfc-may-not-find-the-mfc-language-dlls-after-installation-of-the-security-packs-d/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/14/bug-black-patchday-for-all-os-from-xp-and-later-3-mfc-8-0-vc-2005-or-mfc-9-0-vc-2008-linked-dynamically-to-the-mfc-may-not-find-the-mfc-language-dlls-after-installation-of-the-security-packs-d/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 15:30:15 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[SP]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[WIndows XP]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=830</guid>
		<description><![CDATA[This is the English translation of the already published German article: BUG: Schwarzer Patchday für alle OS XP und später 3. – MFC 8.0 (VC-2005) oder MFC 9.0 (VC-2008) die dynamisch gelinkt wurden finden die MFC Sprach-DLLs evtl. nicht mehr nach Installation der Sicherheitspatches vom 12.04.2011 Affected are: All programs created with MFC 8.0 and [...]]]></description>
			<content:encoded><![CDATA[<p><strong>This is the English translation of the already published German article:</strong><br />
<a title="Permanent Link: BUG: Schwarzer Patchday für alle OS XP und später 3. – MFC 8.0 (VC-2005) oder MFC 9.0 (VC-2008) die dynamisch gelinkt wurden finden die MFC Sprach-DLLs evtl. nicht mehr nach Installation der Sicherheitspatches vom 12.04.2011" rel="bookmark" href="http://blog.m-ri.de/index.php/2011/04/14/bug-schwarzer-patchday-fur-alle-os-xp-und-spater-3-mfc-8-0-vc-2005-oder-mfc-9-0-vc-2008-die-dynamisch-gelinkt-wurden-finden-die-mfc-sprach-dlls-evtl-nicht-mehr-nach-installation-der-sicherhei/">BUG: Schwarzer Patchday für alle OS XP und später 3. – MFC 8.0 (VC-2005) oder MFC 9.0 (VC-2008) die dynamisch gelinkt wurden finden die MFC Sprach-DLLs evtl. nicht mehr nach Installation der Sicherheitspatches vom 12.04.2011</a></p>
<h3>Affected are:</h3>
<ul>
<li>All programs created with MFC 8.0 and MFC 9.0 that link dynamically to the <em>MFC DLLs</em> .</li>
<li>All operating systems from <em>Windows XP </em>and later. 32bit as 64bit</li>
<li>Al programs that do not use an application local installation (program directory, see note at the bottom of the article). So all programs that use and depend on <em>WinSxS</em> and <em>VCRedist_x86.exe </em>( <em>VCRedist_x64.exe</em>).</li>
<li>All programs that are localized and use the <em>MFC90xxx.DLL </em>or. <em>MFC80xxx.DLL </em>language-DLLs and the OS system language is not set to English.</li>
</ul>
<h3>It is affected due to the security fixes offered April 12th, 2011:</h3>
<p>For VS-2005 SP1 <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2465367">http://support.microsoft.com/kb/2465367</a> and <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2467175">http://support.microsoft.com/kb/2467175</a><br />
For VS-2008 SP1 <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2465361">http://support.microsoft.com/kb/2465361</a> and <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2467174">http://support.microsoft.com/kb/2467174</a></p>
<h3>Failure description:</h3>
<p>The MFC language DLLs (satellite DLLs) are not loaded any longer. Parts of the application appear in English and not the selected language from the OS.</p>
<h3>Background:</h3>
<p>To prevent loading of wrong satellite DLLs (<em>Binary Planting</em>), an internal function in <em>appcore.cpp</em> named <em>_AfxLoadLangDLL was </em>changed. It checks if an activation context is active or not and if the DLLs should be loaded using this context. If there is an activation context active it is safe to load the satellite DLLs(<em>MFCDEUxxx.DLL</em> etc.) without defining a full path. If no activation context is active the path of the current application is used to load and find the satellite DLLs. The DLLs are loaded with a call to <em>LoadLibrary</em>.</p>
<p>The code used looks like this (empty lines removed):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">...
<span style="color: #007788;">TCHAR</span> <span style="color: #000040;">*</span>pszFilename <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">PathFindFileName</span><span style="color: #008000;">&#40;</span>szLangDLL<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
ACTCTX_SECTION_KEYED_DATA data<span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>FindActCtxSectionString<span style="color: #008000;">&#40;</span>
    FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX,
    <span style="color: #0000ff;">NULL</span>,
    ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION,
    pszFilename,
    <span style="color: #000040;">&amp;</span>data<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Load using the dll name only...</span>
    hInstance <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">LoadLibraryEx</span><span style="color: #008000;">&#40;</span>pszFilename, <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">else</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Load using the full path...</span>
    hInstance <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">LoadLibraryEx</span><span style="color: #008000;">&#40;</span>szLangDLL, <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
...</pre></div></div>

<p>The code looks OK.  And it is conform to the documentation of <a href="http://msdn.microsoft.com/en-us/library/aa375149(VS.85).aspx#">FindActCtxSectionString</a> where the last parameter is defined as <em>__out</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL FindActCtxSectionString<span style="color: #008000;">&#40;</span>
  __in   DWORD dwFlags,
  __in   <span style="color: #0000ff;">const</span> GUID <span style="color: #000040;">*</span>lpExtensionGuid,
  __in   ULONG ulSectionId,
  __in   LPCTSTR lpStringToFind,
  __out  PACTCTX_SECTION_KEYED_DATA ReturnedData
<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>But the documentation of <a href="http://msdn.microsoft.com/en-us/library/aa374148(VS.85).aspx">ACTCTX_SECTION_KEYED_DATA </a>tells a different story:</p>
<blockquote><p>Callers <strong>should initialize </strong>the ACTCTX_SECTION_KEYED_DATA structure as such:<br />
&#8220;ACTCTX_SECTION_KEYED_DATA askd = { sizeof(askd) };&#8221;<br />
which initializes all members to zero/null except the size field which is set correctly.</p></blockquote>
<p>(BTW: In my eyes a documentation failure)</p>
<p>So what we see is that the code misses this: <strong>data.cbSize isn&#8217;t initialized</strong> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /><br />
Now we have 3 possible scenarios what can happen with a  randomly initialized <em>data.cbSize </em>field:</p>
<ol>
<li><em>data.cbSize </em>is larger than <em>sizeof(ACTCTX_SECTION_KEYED_DATA):</em><br />
In this case the activation context is correctly detected. The program executes normal.  With an activation context no full path is needed. The MFC90xxx.DLL will be loaded from the WinSxS (Side by Side) or found over the common search path.</li>
<li><em>data.cbSize </em>is less than  <em>sizeof(ACTCTX_SECTION_KEYED_DATA)</em>:<br />
In this case <em>FindActCtxSectionString</em> returns with an error. The DLL is now loaded with a full path name constructed from the application directory to prevent <em>Binary Planting</em>. Butthe problemis that with a normal installation the searched files are all in WinSxS, and the application directory has no such data. The DLL is not loaded.<br />
If the application local assemblies are used and placed in sub directories they aren&#8217;t found either.</li>
<li>A future problem.<br />
If an OS will use a larger <em>ACTCTX_SECTION_KEYED_DATA </em>and <em>data.cbSize </em>has a greater value than the corresponding <em>sizeof(&#8230;)</em>:<br />
We have a buffer-overrun!</li>
</ol>
<p>I always recommend to use private and application local assemblies for the CRT and MFC DLLs. And to install all this files local to the application.<br />
Years ago I wrote an article for this scenario that was published on CodeProject and a hotfix for <em>VS-2008 </em>is also available<em> </em> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /><br />
<strong><a title="Create projects easily with private MFC, ATL and CRT assemblies" href="http://www.codeproject.com/KB/cpp/PrivateAssemblyProjects.aspx">Create projects easily with private MFC, ATL and CRT assemblies</a><br />
<a title="Hotfix für UseMSPrivateAssemblies.h und VC-2008" href="http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/">Hotfix für UseMSPrivateAssemblies.h und VC-2008</a></strong></p>
<h3>What to do?</h3>
<p>Uninstall all of the mentioned security fixes with the specified article IDs.<br />
Runtime-2005: KB2467175, Runtime-2008: KB2467174<br />
VS-2007 SP1: KB2465367, VS-2008 SP1: KB2465361).</p>
<h3>Further notes:</h3>
<p>The affected C/C++ Runtimes of <em>Visual Studio </em>have the following version numbers:<br />
- VC-2005 8.0.50727.5592 (KB2467175)<br />
- VC-2008 9.0.30729.5570 (KB2467174)</p>
<p>My comment to tis issue:<br />
It was easier to live with the DLL-hell. <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p><strong>Many thanks to my Co-MVP</strong><strong> Mike Ryan who helped me to discover this problems with the latest security patches:!:</strong></p>
<p><strong>What Do I mean with &#8220;application local&#8221;?<br />
</strong>Some people ship the MFC files in the application directory. In such a case this DLLs are not loaded if a newer version can be found in the WinSxS directory. This is not application local for <strong>me</strong>!<br />
So if the manifest file in the program directory still have a publicKey entry, the local files will be used  in case of the here described bug. Even if the activation context was not detected, so the local files are a kind of fallback and help prevent get around the problem.<br />
My articles describe how to make your application really application local in removingthe publicKey tokens from the manifest files. Such programs will never fail on such broken security patches. (Just read my article at Codeproject). (Thanks for Co-MVP David Ching who asked me for a clarification)</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/04/14/bug-black-patchday-for-all-os-from-xp-and-later-3-mfc-8-0-vc-2005-or-mfc-9-0-vc-2008-linked-dynamically-to-the-mfc-may-not-find-the-mfc-language-dlls-after-installation-of-the-security-packs-d/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>BUG: Schwarzer Patchday für alle OS XP und später 3. &#8211; MFC 8.0 (VC-2005) oder MFC 9.0 (VC-2008) die dynamisch gelinkt wurden finden die MFC Sprach-DLLs evtl. nicht mehr nach Installation der Sicherheitspatches vom 12.04.2011</title>
		<link>http://blog.m-ri.de/index.php/2011/04/14/bug-schwarzer-patchday-fur-alle-os-xp-und-spater-3-mfc-8-0-vc-2005-oder-mfc-9-0-vc-2008-die-dynamisch-gelinkt-wurden-finden-die-mfc-sprach-dlls-evtl-nicht-mehr-nach-installation-der-sicherhei/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/14/bug-schwarzer-patchday-fur-alle-os-xp-und-spater-3-mfc-8-0-vc-2005-oder-mfc-9-0-vc-2008-die-dynamisch-gelinkt-wurden-finden-die-mfc-sprach-dlls-evtl-nicht-mehr-nach-installation-der-sicherhei/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 08:12:30 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[MFCNext]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[SP]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[WIndows XP]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=826</guid>
		<description><![CDATA[Betroffen sind: Alle Programme die mit MFC 8.0 oder MFC 9.0 erzeugt wurden und dynamisch an die MFC DLLs gelinkt sind. Alle Betriebssysteme ab Windows XP aufwärts. 32bit wie 64bit Alle Programme, die nicht die MFC und CRT DLLs applikationsnah (d.h. im Programmverzeichnis, siehe dazu auch die Fußnote in meinem Artikel) installiert haben. Also alle [...]]]></description>
			<content:encoded><![CDATA[<h3>Betroffen sind:</h3>
<ul>
<li>Alle Programme die mit MFC 8.0 oder MFC 9.0 erzeugt wurden und dynamisch an die <em>MFC DLLs</em> gelinkt sind.</li>
<li>Alle Betriebssysteme ab <em>Windows XP </em>aufwärts. 32bit wie 64bit</li>
<li>Alle Programme, die nicht die <em>MFC</em> und <em>CRT DLLs </em>applikationsnah (d.h. im Programmverzeichnis, siehe dazu auch die Fußnote in meinem Artikel) installiert haben. Also alle Programme die <em>WinSxS</em> benutzen und die <em>VCRedist_x86.exe </em>( <em>VCRedist_x64.exe</em>)  mit ausliefern.</li>
<li>Alle Programme, die lokalisiert sind und die <em>MFC90xxx.DLL </em>bzw. <em>MFC80xxx.DLL </em>Sprach-DLLs verwenden und das OS nicht auf Englisch eingestellt ist</li>
</ul>
<h3>Betrifft die folgenden Fixes vom 12.04.2011:</h3>
<p>Für VS-2005 SP1 <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2465367">http://support.microsoft.com/kb/2465367</a> und <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2467175">http://support.microsoft.com/kb/2467175</a><br />
Für VS-2008 SP1 <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2465361">http://support.microsoft.com/kb/2465361</a> und <a onclick="javascript:_gaq.push(['_trackEvent','outbound-article','support.microsoft.com']);" href="http://support.microsoft.com/kb/2467174">http://support.microsoft.com/kb/2467174</a></p>
<h3>Effekt:</h3>
<p>Die MFC Statelite DLLs werden nicht geladen. Teile der Anwendung erscheinen in englischer Sprache.</p>
<h3>Hintergrund:</h3>
<p>Um das Laden von falschen Satelite DLLs zu verhindern (<em>Binary Planting</em>), wurde intern in <em>appcore.cpp </em>in der Funktion <em>_AfxLoadLangDLL </em>geprüft, ob die DLLs in aus einem Activation Context geladen werden oder nicht.  Sollte ein Activation Context vorhanden sein, dann kann man gefahrlos die Sprach DLLs (<em>MFCDEUxxx.DLL</em> etc.) ohne Pfadnamen laden. Ist kein Activation Context vorhanden wird der Pfad der Anwendung verwendet und <em>LoadLibrary</em> mit vollem Pfadnamen durchgeführt.</p>
<p>Der Code der dazu verwendet wird sieht so aus (Leerzeilen entfernt):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">...
<span style="color: #007788;">TCHAR</span> <span style="color: #000040;">*</span>pszFilename <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">PathFindFileName</span><span style="color: #008000;">&#40;</span>szLangDLL<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
ACTCTX_SECTION_KEYED_DATA data<span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>FindActCtxSectionString<span style="color: #008000;">&#40;</span>
    FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX,
    <span style="color: #0000ff;">NULL</span>,
    ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION,
    pszFilename,
    <span style="color: #000040;">&amp;</span>data<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Load using the dll name only...</span>
    hInstance <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">LoadLibraryEx</span><span style="color: #008000;">&#40;</span>pszFilename, <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">else</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Load using the full path...</span>
    hInstance <span style="color: #000080;">=</span> <span style="color: #008080;">::</span><span style="color: #007788;">LoadLibraryEx</span><span style="color: #008000;">&#40;</span>szLangDLL, <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
...</pre></div></div>

<p>Eigentlich sieht der Code prima aus. Und er verträgt sich auch mit der Doku von <a href="http://msdn.microsoft.com/en-us/library/aa375149(VS.85).aspx#">FindActCtxSectionString</a> dort wird der letzte Parameter als <em>__out</em> definiert.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">BOOL FindActCtxSectionString<span style="color: #008000;">&#40;</span>
  __in   DWORD dwFlags,
  __in   <span style="color: #0000ff;">const</span> GUID <span style="color: #000040;">*</span>lpExtensionGuid,
  __in   ULONG ulSectionId,
  __in   LPCTSTR lpStringToFind,
  __out  PACTCTX_SECTION_KEYED_DATA ReturnedData
<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Aber die Doku zu <a href="http://msdn.microsoft.com/en-us/library/aa374148(VS.85).aspx">ACTCTX_SECTION_KEYED_DATA </a>sagt was anderes:</p>
<blockquote><p>Callers <strong>should initialize </strong>the ACTCTX_SECTION_KEYED_DATA structure as such:<br />
&#8220;ACTCTX_SECTION_KEYED_DATA askd = { sizeof(askd) };&#8221;<br />
which initializes all members to zero/null except the size field which is set correctly.</p></blockquote>
<p>(BTW: Auch ein krasser Doku-Bug in meinen Augen)</p>
<p>Und jetzt sieht man was dem Code fehlt: <strong>data.cbSize wird nicht gesetzt</strong> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /><br />
Daraus ergeben sich nun drei Varianten, da <em>data.cbSize </em>nun zufälligen (nicht initialisierten) Inhalt hat:</p>
<ol>
<li><em>data.cbSize </em>ist größer als  <em>sizeof(ACTCTX_SECTION_KEYED_DATA):</em><br />
In diesem Fall wird korrekt ermittelt ob ein Activation Context vorhanden ist. Das Programm läuft normal. Mit Activation Context ist kein voller Pfadname nötig. Die MFC90xxx.DLL wird evtl. aus dem WinSxS (Side by Side) geladen, oder in einem der Suchpfade gefunden.</li>
<li><em>data.cbSize </em>ist kleiner als  <em>sizeof(ACTCTX_SECTION_KEYED_DATA)</em>:<br />
In diesem Fall liefert <em>FindActCtxSectionString</em> einen Fehler und nun wird es spannend. Die DLL wird nun versucht mit dem vollen Pfadnamen zu laden um <em>Binary Planting</em> zu verhindern. Das Problem ist aber dass bei korrekter Installation im WinSxS, dass im Applikationsverzeichnis keine dieser Daten liegen. Die DLL wird nicht gefunden.<br />
Sollten die private applikationsnahe Assemblies in einem Unterverzeichnis installiert sein, werden diese auch nicht gefunden.</li>
<li>Für die Zukunft.<br />
Ein zukünftiges OS vergrößert <em>ACTCTX_SECTION_KEYED_DATA </em>und <em>data.cbSize </em>hat zufälligen Inhalt und ist größer als <em>sizeof(&#8230;)</em>:<br />
Ein Buffer-Overrun!</li>
</ol>
<p>Ich empfehle nicht ohne Grund seit <em>VS-2005 </em>private Assemblies zu verwenden, und die MFC Dateien in das Anwendungsverzeichnis zu kopieren. Dazu habe ich auf Code-Projekt einen entsprechenden Artikel geschrieben und ein Hotfix für <em>VS-2008</em> existiert auch <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /><br />
<strong><a title="Create projects easily with private MFC, ATL and CRT assemblies" href="http://www.codeproject.com/KB/cpp/PrivateAssemblyProjects.aspx">Create projects easily with private MFC, ATL and CRT assemblies</a><br />
<a title="Hotfix für UseMSPrivateAssemblies.h und VC-2008" href="http://blog.m-ri.de/index.php/2008/05/06/hotfix-fuer-usemsprivateassembliesh-und-vc-2008/">Hotfix für UseMSPrivateAssemblies.h und VC-2008</a></strong></p>
<h3>Was ist zu tun?</h3>
<p>Deinstallation aller hier erwähnten Sicherheitspatches mit den entsprechenden Arikelnummern:<br />
Runtime-2005: KB2467175, Runtime-2008: KB2467174<br />
VS-2007 SP1: KB2465367, VS-2008 SP1: KB2465361).</p>
<h3>Weitere Anmerkungen:</h3>
<p>Die betroffenen C/C++ Runtimes des <em>Visual Studio </em>haben die folgenden Versionsnummern<br />
- VC-2005 8.0.50727.5592 (KB2467175)<br />
- VC-2008 9.0.30729.5570 (KB2467174)</p>
<p>Mein Kommentar dazu:<br />
Das Leben in der DLL-Hölle war fast angenehmer als das hier. Ohne Worte <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p><strong>Herzlichen Dank auch an meinem Mit-MVP</strong><strong> Mike Ryan, der mit mir zusammen auf diese gesamte Problematik gestoßen ist <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </strong></p>
<p><strong>Was meine ich mit &#8220;application local&#8221;?<br />
</strong>Einige Entwickler installieren die MFC runtme Dateien im Applikationsverzeichnis. In diesem Fall werden diese DLLs nicht verwendet wenn eine neuere Version der DLLs im WinSxS Verzeichnis liegen. Das ist <strong>für mich </strong>keine applikationsnahe Instalation! Diese Manifeste im Programmverzeichnis haben immer noch einen publicKey Eintrag. Aber durch die Existenz der lokalen Dateien wird dieses hier beschriebene Problem umgangen, weil die lokalen Dateien eine Art Fallback bilden.<br />
Meine Artikel beschriben wie man eine Anwendung wirklich applikationslokal macht und damit unabhängig von solchen &#8220;kaputten&#8221; Security Patches. Dazu muss der publicKey Token aus den Manifesten entfernt werden. (Lesen Sie meinen Artikel aufCodeproject).<br />
(Danke an Co-MVP David Ching der mich um Kläurung gebeten hat)</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/04/14/bug-schwarzer-patchday-fur-alle-os-xp-und-spater-3-mfc-8-0-vc-2005-oder-mfc-9-0-vc-2008-die-dynamisch-gelinkt-wurden-finden-die-mfc-sprach-dlls-evtl-nicht-mehr-nach-installation-der-sicherhei/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>BUG: Schwarzer Patchday für Windows 2000 2.- MFC 8.0 (VC-2005) und MFC 9.0 (VC-2008) Static Libraries erzeugen auch inkompatiblen Code für Windows 2000 durch KB2465367 bzw. KB2465361</title>
		<link>http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-2-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-static-libraries-erzeugen-auch-inkompatiblen-code-fur-windows-2000-durch-kb2465367-bzw-kb2465361/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-2-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-static-libraries-erzeugen-auch-inkompatiblen-code-fur-windows-2000-durch-kb2465367-bzw-kb2465361/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 20:48:14 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>
		<category><![CDATA[SP]]></category>
		<category><![CDATA[VS-2005]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[W2K]]></category>
		<category><![CDATA[Windows 2000]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=824</guid>
		<description><![CDATA[Wer VS-2005 SP1 oder VS-2008 SP1 installiert hatte und bei dem auch die entsprechenden Patches von gestrigen Tag (12.04.2011) durchlaufen wurden, der hat nun auch veränderte statische Libraries. Sollte man nun also EXEs oder DLLs mit den neuen Libararies statisch linken, dann sind diese genausowenig lauffähig unter Windows 2000. wie auch die EXEs und DLLs [...]]]></description>
			<content:encoded><![CDATA[<p>Wer <em>VS-2005 SP1 </em>oder <em>VS-2008 SP1 </em>installiert hatte und bei dem auch die entsprechenden Patches von gestrigen Tag (12.04.2011) durchlaufen wurden, der hat nun auch veränderte statische Libraries.</p>
<p><strong>Sollte man nun also EXEs oder DLLs mit den neuen Libararies statisch linken, dann sind diese genausowenig lauffähig unter <em>Windows 2000</em>. wie auch die EXEs und DLLs die gegen die MFC 8.0 bzw. MFC 9.0 DLLs gelinkt werden</strong> <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </p>
<p>Das Ganze ist hier aufgelistet:<br />
für VS-2005 SP1 <a href="http://support.microsoft.com/kb/2465367">http://support.microsoft.com/kb/2465367</a><br />
für VS-2008 SP1 <a href="http://support.microsoft.com/kb/2465361">http://support.microsoft.com/kb/2465361</a></p>
<p>Die LIBs sind aufgeführt und auch diese verwenden auch die Funktion <em>FindActCtxSectionStringA</em>, die natürlich nicht unter <em>Windows 2000 </em>vorhanden ist.</p>
<p>Siehe auch:<br />
<a href="http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-dlls-sind-nicht-mehr-lauffahig-nach-installation-von-kb2467175-bzw-kb2467175/">http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-dlls-sind-nicht-mehr-lauffahig-nach-installation-von-kb2467175-bzw-kb2467175/</a></p>
<p>PS: Ich kann nur raten die entsprechenden Patches zu deinstallieren sofern man noch für Windows 2000 entwickelt und warten bis neue Securitypatches vorhanden sind.</p>
<p><strong>Nachtrag:<br />
</strong>Die betroffenen C/C++ Runtimes des <em>Visual Studio </em>haben die folgenden Versionsnummern<br />
- VC-2005 8.0.50727.5592 (KB2467175)<br />
- VC-2008 9.0.30729.5570 (KB2467174)</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/04/13/bug-schwarzer-patchday-fur-windows-2000-2-mfc-8-0-vc-2005-und-mfc-9-0-vc-2008-static-libraries-erzeugen-auch-inkompatiblen-code-fur-windows-2000-durch-kb2465367-bzw-kb2465361/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

