<?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; Vista / Windows 7</title>
	<atom:link href="http://blog.m-ri.de/index.php/category/programmieren/vista-2/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>Auf was man unbedingt achten muss, wenn man an Manifesten für Assemblies herumbastelt</title>
		<link>http://blog.m-ri.de/index.php/2011/04/25/auf-was-man-unbedingt-achten-muss-wenn-man-an-manifesten-fur-assemblies-herumbastelt/</link>
		<comments>http://blog.m-ri.de/index.php/2011/04/25/auf-was-man-unbedingt-achten-muss-wenn-man-an-manifesten-fur-assemblies-herumbastelt/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 18:34:08 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Manifest]]></category>
		<category><![CDATA[SxS]]></category>
		<category><![CDATA[WinSxS]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=810</guid>
		<description><![CDATA[Ich habe für ein Projekt Manifeste zur Verwendung von Registration-Free COM Module gebaut. Diese COM-Module wurden über ein Manifest in einer EXE geladen. Natürlich hatte jedes der COM Module wieder ein eigenes Manifest, die ich entsprechend angepasst habe. Jede COM-Class, die verwendet wird, muss ja in dem Manifest der DLL-Assembly aufgeführt werden. Eigentümlich war, dass [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe für ein Projekt Manifeste zur Verwendung von <a href="http://msdn.microsoft.com/en-us/magazine/cc188708.aspx">Registration-Free COM Module</a> gebaut.</p>
<p>Diese COM-Module wurden über ein Manifest in einer EXE geladen. Natürlich hatte jedes der COM Module wieder ein eigenes Manifest, die ich entsprechend angepasst habe. Jede COM-Class, die verwendet wird, muss ja in dem Manifest der DLL-Assembly aufgeführt werden.</p>
<p>Eigentümlich war, dass ich nach Änderungen der Manifeste und auch nachdem das COM Modul komplett neu gelinkt wurde, dennoch die EXE ihr Ladeverhalten nicht geändert hat. Manche COM-Klassen wurden nicht gefunden. Sobald ich aber den Rechner neu gestartet hatte funktionierte ab dann alles wie gewünscht und das geänderte Manifest schien nun wirksam zu sein.</p>
<p>Da gibt es einen Cache dachte ich mir. Und nach einiger Recherche im Internet stieß ich auf den folgenden interessanten Artikel von Junfeng Zang:<br />
<a href="http://blogs.msdn.com/b/junfeng/archive/2007/10/01/vista-activation-context-cache.aspx">Windows Vista Sxs Activation Context Cache</a></p>
<p>Wie man lesen kann, wird bei jedem erfolgreichen Einlesen einer Anwendung und dem erfolgreichen Laden aller Manifeste und DLLs, die ganzen ermittelten Daten in einen Cache gespeichert. Da ich die EXE aber nicht geändert habe, wurden auch die untergeordneten Manifeste nicht neu gelesen, auch wenn diese geändert wurden.</p>
<p>Durch das Ändern des Datums der EXE werden die Cacheeinträge ungültig, und danach werden alle Aktivierungskontexte der Anwednung und aller anderen Assemblies neu geladen.</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/25/auf-was-man-unbedingt-achten-muss-wenn-man-an-manifesten-fur-assemblies-herumbastelt/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>Umstellung eines Projektes auf VS-2010 schaltet DEP (/NXCOMPAT) ein und ASLR (/DYNAMICBASE) ein</title>
		<link>http://blog.m-ri.de/index.php/2011/03/26/umstellung-eines-projektes-auf-vs-2010-schaltet-dep-nxcompat-ein-und-aslr-dynamicbase-ein/</link>
		<comments>http://blog.m-ri.de/index.php/2011/03/26/umstellung-eines-projektes-auf-vs-2010-schaltet-dep-nxcompat-ein-und-aslr-dynamicbase-ein/#comments</comments>
		<pubDate>Sat, 26 Mar 2011 19:51:33 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[ASLR]]></category>
		<category><![CDATA[Crash]]></category>
		<category><![CDATA[Debuggen]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=649</guid>
		<description><![CDATA[Bei der Umstellung eines Projektes von VS-2005 auf VS-2010 lief unsere Software im Testfeld ohne Probleme, bis auf einem Rechner, auf dem gezielt immer wieder der selbe Fehler auftrat. Der Stackdump zeigte aber immer wieder eine unterschiedliche Absturzadresse. Glücklicherweise konnten wir durch Crash-Dumps einigermaßen lokalisieren was passierte. Eigentümlicherweise zeigte sich der Crash immer beimAufruf einer [...]]]></description>
			<content:encoded><![CDATA[<p>Bei der Umstellung eines Projektes von <em>VS-2005</em> auf <em>VS-2010 </em>lief unsere Software im Testfeld ohne Probleme, bis auf einem Rechner, auf dem gezielt immer wieder der selbe Fehler auftrat.</p>
<p>Der Stackdump zeigte aber immer wieder eine unterschiedliche Absturzadresse. Glücklicherweise konnten wir durch Crash-Dumps einigermaßen lokalisieren was passierte. Eigentümlicherweise zeigte sich der Crash immer beimAufruf einer bestimmten Windows-Prozedur:</p>
<p><a href="http://blog.m-ri.de/wp-content/uploads/2010/07/DEP4.png"><img title="DEP4" src="http://blog.m-ri.de/wp-content/uploads/2010/07/DEP4.png" alt="" width="773" height="185" /></a></p>
<p>Eigentümlicherweise lief das selbe Programm mit <em>VS-2005 </em>kompiliert auf allen Maschinen. Also vermutete ich einen Compilerfehler! Aber wie kann ein Compilerfehler nur auf einer Maschine zu einem Problem werden?</p>
<p>Aber ich lag komplett daneben.<br />
Nach der Analyse des Codes stellte sich heraus das <em>DEP</em> die Ursache war, und das der Crash nur auf der einizgen Maschine auftrat, auf der <em>DEP</em> unterstützt wurde und eingeschaltet war.</p>
<p><a href="http://blog.m-ri.de/wp-content/uploads/2010/07/DEP1.png"><img title="DEP1" src="http://blog.m-ri.de/wp-content/uploads/2010/07/DEP1.png" alt="" width="380" height="542" /></a></p>
<p>Die anderen Rechner im Testfeld unterstützen <em>DEP</em> nicht:</p>
<p><a href="http://blog.m-ri.de/wp-content/uploads/2010/07/DEP2.png"><img class="alignnone size-full wp-image-752" title="DEP2" src="http://blog.m-ri.de/wp-content/uploads/2010/07/DEP2.png" alt="" width="384" height="548" /></a></p>
<p>Und auf diesen trat der Fehler nicht auf.</p>
<p>Weitere Analyse zeigte, dass ein spezieller Code aus einer Fensterklasse, die ich von einer Libary übernommen hatte ein spezielles Windows Subclassing mit einem Thunking ähnlich wie <em>ATL</em> machte, jedoch wurde der Speicher nicht korrekt als ausführbar markierte.<br />
Folgerichtig krachte es. D.h. die paar Codezeilen, die gerade mal einen JMP und das laden eines Registers durchführten wurden von <em>DEP</em> als illegal betrachtet und es kam zum Crash.</p>
<p>Und das eigentümliche, dass der Code mit <em>VS-2005</em> kompiliert lief, war auch schnell erklärt.<br />
Als das Projekt von <em>VS-2005 </em>in <em>VS-2010 </em>übernommen wurde, wurden auch die Optionen für <em>DEP</em> (<em>/NXCOMPAT</em>) und auch <em>ASLR</em> (<em>/DYNAMICBASE</em>) eingeschaltet <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </p>
<p><a href="http://blog.m-ri.de/wp-content/uploads/2010/07/DEP3.png"><img class="alignnone size-full wp-image-753" title="DEP3" src="http://blog.m-ri.de/wp-content/uploads/2010/07/DEP3.png" alt="" width="853" height="291" /></a></p>
<p>Das ist eigentlich nicht nett, denn es hat schon einige weitreichende Konsequenzen für die Software.<br />
Also aufgepast bei der Konvertierung von Programmen und genau darüber nachgedacht ob man <em>DEP</em> und <em>ASLR</em> wirklich für seine Software will <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.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/03/26/umstellung-eines-projektes-auf-vs-2010-schaltet-dep-nxcompat-ein-und-aslr-dynamicbase-ein/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Massive Probleme mit ADO auf Windows 7 SP1</title>
		<link>http://blog.m-ri.de/index.php/2011/03/16/massiver-probleme-mit-ado-auf-windows-7-sp1/</link>
		<comments>http://blog.m-ri.de/index.php/2011/03/16/massiver-probleme-mit-ado-auf-windows-7-sp1/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 23:25:31 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[ADO]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[SP1]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Windows7]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=786</guid>
		<description><![CDATA[Windows 7 SP1 scheint einige Probleme in Bezug auf ADO zu haben. So jedenfalls hat dies Mike Ryan gemeldet. Hier die beiden Threads in den MSDN Foren, die von den Problemen berichten: Massive Thread-Handle Leaks bei asnychronen Operationen: ADO, adAsyncExecute and Windows 7 SP1 handles leaking http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/68e23681-f6b5-4ed5-b963-e63e34eeac2f Dieser Bug wurde bereits von Microsoft bestätigt. Wer [...]]]></description>
			<content:encoded><![CDATA[<p>Windows 7 SP1 scheint einige Probleme in Bezug auf ADO zu haben. So jedenfalls hat dies Mike Ryan gemeldet.<br />
Hier die beiden Threads in den MSDN Foren, die von den Problemen berichten:</p>
<ol>
<li>Massive Thread-Handle Leaks bei asnychronen Operationen:<br />
<strong>ADO, adAsyncExecute and Windows 7 SP1 handles leaking</strong><br />
<a href="http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/68e23681-f6b5-4ed5-b963-e63e34eeac2f">http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/68e23681-f6b5-4ed5-b963-e63e34eeac2f</a><br />
Dieser Bug wurde bereits von Microsoft bestätigt.<br />
Wer einen Fix braucht muss sich an den Microsoft Support wenden.</li>
<li>Das zweite Problem betrifft die COM Registrierung für Applikationen, die auf Windows 7 SP1 Maschinen gebaut werden.<br />
<strong>Breaking change in MDAC ADODB COM components in Windows 7 Service Pack 1</strong><br />
<a href="http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/3a4ce946-effa-4f77-98a6-34f11c6b5a13">http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/3a4ce946-effa-4f77-98a6-34f11c6b5a13</a><br />
Siehe auch:<br />
<a href="http://blogs.technet.com/b/asiasupp/archive/2011/03/14/changes-in-mdac-adodb-com-components-in-windows-7-service-pack-1.aspx">http://blogs.technet.com/b/asiasupp/archive/2011/03/14/changes-in-mdac-adodb-com-components-in-windows-7-service-pack-1.aspx</a></li>
</ol>
<p>PS: Ich bin ziemlich froh, dass ich direkt auf OLD-DB arbeite&#8230; <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.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/03/16/massiver-probleme-mit-ado-auf-windows-7-sp1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C:\WINDOWS\TEMP und die Tücken von Programme der Kategorie &#8220;es war einmal&#8221;</title>
		<link>http://blog.m-ri.de/index.php/2011/01/21/cwindowstemp-und-die-tuecken-von-programme-der-kategorie-es-war-einmal/</link>
		<comments>http://blog.m-ri.de/index.php/2011/01/21/cwindowstemp-und-die-tuecken-von-programme-der-kategorie-es-war-einmal/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 19:05:30 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[Legacy]]></category>
		<category><![CDATA[Rechte]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=639</guid>
		<description><![CDATA[Es waren einmal die Zeiten in denen man in C:\WINDOWS\TEMP einfach mal eine Datei anlegen konnte und jeder darauf zugreifen konnte. Seit Windows Vista hat sich ja einiges getan was Sicherheit betrifft, besonders auch die Rechtevergabe auf Dateien, die im C:\Windows\Temp Ordner angelegt werden. Ein Programm  im Rentenalter (es ist gerade mal so um die 16 Jahre [...]]]></description>
			<content:encoded><![CDATA[<p>Es waren einmal die Zeiten in denen man in <em>C:\WINDOWS\TEMP</em> einfach mal eine Datei anlegen konnte und jeder darauf zugreifen konnte.<br />
Seit Windows Vista hat sich ja einiges getan was Sicherheit betrifft, besonders auch die Rechtevergabe auf Dateien, die im <em>C:\Windows\Temp </em>Ordner angelegt werden.</p>
<p>Ein Programm  im Rentenalter (es ist gerade mal so um die 16 Jahre alt <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  geschätzt) erzeugte in <em>C:\WINDOWS\TEMP </em>eine Datei, mit der bestimmte Zugriffe abgesichert wurden. Darunter auch wenn mehrere Instanzen des Programms auf einem Rechner liefen. Das funktionierte prima. Die Datei wurde unter einem festen Namen angelegt und nicht entfernt, nachdem das Programm beendet wurde.</p>
<p>Seit <em>Vista</em> gibt es aber nun ein kleines Problem.:<br />
Seit <em>Windows Vista </em>darf in <em>C:\WINDOWS\TEMP </em>immer noch jeder User Dateien erzeugen. Auf diese Dateien hat er auch vollen Zugriff. Aber auf diese Dateien hat kein anderer Nutzer mehr Zugriff&#8230; <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_surprised.gif' alt=':eek:' class='wp-smiley' />  &#8230; und selbst ein Admin muss erst hier erst den Besitz übernehmen, wenn er die Datei nicht erzeugt hat.</p>
<p>Und nun hat diese kleine alte Programm den folgenden Effekt:</p>
<ul>
<li>Benutzer A meldet sich an.</li>
<li>Benutzer A startet das Programm Er arbeitet damit und die temporäre Datei wird in <em>C:\WINDOWS\TEMP </em>angelegt.</li>
<li>Benutzer A meldet sich ab und beendet das Programm.</li>
<li>Benutzer B meldet sich an.</li>
<li>Benutzer B startet das Programm und &#8230; bekommt eine Fehlermeldung mit einem <strong>&#8220;Access denied!&#8221;</strong>.</li>
</ul>
<p>Mit den neuen Rechten, die auf dem <em>C:\WINDOWS\TEMP </em>Verzeichnis liegen, kann der zweite Benutzer auf diese Datei nicht mehr zugreifen auf die eben nur der Erzeuger Zugriff hat, und der ist eben Benutzer A.</p>
<p>PS: Es Frage mich keiner warum <em>C:\WINDOWS\TEMP </em>aus GetWindowsDir und angehängtem Text <em>TEMP </em>zusammengesetzt wurde. Vermutlich um zu umgehen, dass ein privates temporäres Verzeichnis benutzt wird. Tja und <em>CSIDL_APPDATA </em>war dem damaligen Entwickler (evtl. noch unter Windows 3.1) nicht bekannt.</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/01/21/cwindowstemp-und-die-tuecken-von-programme-der-kategorie-es-war-einmal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mein neuer Entwicklungsrechner&#8230;</title>
		<link>http://blog.m-ri.de/index.php/2010/11/12/mein-neuer-entwicklungsrechner/</link>
		<comments>http://blog.m-ri.de/index.php/2010/11/12/mein-neuer-entwicklungsrechner/#comments</comments>
		<pubDate>Fri, 12 Nov 2010 19:35:00 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Dell]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Fujitsu]]></category>
		<category><![CDATA[Fujitsu-Siemens]]></category>
		<category><![CDATA[Siemens]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=697</guid>
		<description><![CDATA[Unsere Abteilung durfte für dieses Jahr (vor Weihnachten) noch Wünsche äußern. Und unser neuer Azubi brauchteinen besseren Rechner. Jetzt bekommt er meinen Fujitsu Siemens Q8200 (Quad Core mit 2, 33 Ghz) mit 3GB RAM, 500GB Platte und Nvidia 9300 GE, das OS bisher war Window 7 Ultimate 32bit. Ich habe schon meinen neuen ausgepackt ein [...]]]></description>
			<content:encoded><![CDATA[<p>Unsere Abteilung durfte für dieses Jahr (vor Weihnachten) noch Wünsche äußern. Und unser neuer Azubi brauchteinen besseren Rechner.<br />
Jetzt bekommt er meinen Fujitsu Siemens Q8200 (Quad Core mit 2, 33 Ghz) mit 3GB RAM, 500GB Platte und Nvidia 9300 GE, das OS bisher war Window 7 Ultimate 32bit.</p>
<p>Ich habe schon meinen neuen ausgepackt ein Dell i7-870 (2,93GHz, 4 Cores, 8 Threads) mit 2x1TB Raid1 und 8GB Hauptspeicher dazu eine Nvidia GTX460 auch mit 1GB. Das Ganze wird dann mit Windows 7 Ultimate 64bit laufen.</p>
<p>Gegenüber meinem Intel Q8200 ist der neue rein gefühlsmässig im ersten Moment nicht schneller. Und von der schnellen Graka habe ich aktuell nichts, denn ich arbeite ziemlich oft nur Remote auf den Maschinen. Aber auf die 8GB Hauptspeicher und auf die 64bit Installation und virtuellen Maschinen, die meinen Rechner nicht mehr in die Knie zwingen, da freue ich mich schon echt drauf.</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/2010/11/12/mein-neuer-entwicklungsrechner/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Warum unter Vista und Windows 7 C:\Programme nicht genau dasselbe ist wie C:\Program Files</title>
		<link>http://blog.m-ri.de/index.php/2010/09/16/warum-unter-vista-und-windows-7-cprogramme-nicht-genau-das-selbe-ist-wie-cprogram-files/</link>
		<comments>http://blog.m-ri.de/index.php/2010/09/16/warum-unter-vista-und-windows-7-cprogramme-nicht-genau-das-selbe-ist-wie-cprogram-files/#comments</comments>
		<pubDate>Thu, 16 Sep 2010 19:03:30 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=651</guid>
		<description><![CDATA[Jeder kennt von Windows Vista und Windows 7 die Junctions &#8220;C:\Programme&#8221; oder &#8220;C:\Dokumente und Einstellungen&#8221;. Diese Verweise erlauben es auch älteren Programmen die evtl. hardcodierte Verzeichnisnamen haben oder auch Programmen, die die alten Verzeichnisstrukturen von Windows 2000 und XP nutzen korrekt zu arbeiten. Jetzt könnte man meinen, dass es vollkommen egal ist ob man nun [...]]]></description>
			<content:encoded><![CDATA[<p>Jeder kennt von <em>Windows Vista </em>und <em>Windows 7 </em>die <em>Junctions</em> <em>&#8220;C:\Programme&#8221;</em> oder <em>&#8220;C:\Dokumente und Einstellungen&#8221;</em>.<br />
Diese Verweise erlauben es auch älteren Programmen die evtl. hardcodierte Verzeichnisnamen haben oder auch Programmen, die die alten Verzeichnisstrukturen von <em>Windows 2000</em> und <em>XP</em> nutzen korrekt zu arbeiten.</p>
<p>Jetzt könnte man meinen, dass es vollkommen egal ist ob man nun <em>&#8220;C:\Programme&#8221;</em> oder <em>&#8220;C:\Program Files&#8221;</em> benutzt.<br />
Aber das ist es nicht <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' />  Es gibt ein paar ganz feine Unterschiede.</p>
<p>Ein simpler <em>DIR</em> auf der Befehlszeile</p>

<div class="wp_syntax"><div class="code"><pre class="cmd" style="font-family:monospace;">C:\&gt;dir C:\Programme
 Datenträger in Laufwerk C: ist C-LAPTOP
 Volumeseriennummer: D483-432C
&nbsp;
 Verzeichnis von C:\Programme
&nbsp;
Datei nicht gefunden</pre></div></div>

<p>macht das Problem offensichtlich!<br />
Und was geht hier ab?</p>
<p>Die Antwort liefert ICACLS für die Junction:</p>

<div class="wp_syntax"><div class="code"><pre class="cmd" style="font-family:monospace;">C:\&gt;icacls C:\Programme
C:\Programme Jeder:(DENY)(S,RD)
             Jeder:(RX)
             NT-AUTORITÄT\SYSTEM:(F)
             ORDEFINIERT\Administratoren:(F)</pre></div></div>

<p>Dagegen zeigt ICACLS für das Verzeichnis selbst</p>

<div class="wp_syntax"><div class="code"><pre class="cmd" style="font-family:monospace;">C:\&gt;icacls &quot;C:\Program Files&quot;
C:\Program Files NT SERVICE\TrustedInstaller:(F)
                 NT SERVICE\TrustedInstaller:(CI)(IO)(F)
                 NT-AUTORITÄT\SYSTEM:(M)
                 NT-AUTORITÄT\SYSTEM:(OI)(CI)(IO)(F)
                 VORDEFINIERT\Administratoren:(M)
                 VORDEFINIERT\Administratoren:(OI)(CI)(IO)(F)
                 VORDEFINIERT\Benutzer:(RX)
                 VORDEFINIERT\Benutzer:(OI)(CI)(IO)(GR,GE)
                 ERSTELLER-BESITZER:(OI)(CI)(IO)(F)</pre></div></div>

<p>Während man auf &#8220;C:\Program Files&#8221; die Rechte sieht, die man auch erwartet, liegt auf der Junction selbst eine Einschränkung:<br />
Die Berechtigung zum &#8220;Ordner Auflisten&#8221; wird verweigert für &#8220;Jeder&#8221; <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /><br />
Jeder der neu eingeführten Junctions hat diese Einschränkung.</p>
<p>Meines Erachtens wurde dies gemacht um beim Durchsuchen von Verzeichnisstrukturen nicht unendliche Rekursionen zu erzeugen oder Verzeichnisse oder Dateien doppelt aufzuführen.<br />
Eine Verzeichnis Rekursion ergäbe sich zum Beispiel durch die Junction <em>Anwendungsdaten</em> im Verzeichnis <em>C:\Users\Username\AppData\Local</em>, der exakt wieder auf das Verzeichnis <em>C:\Users\Username\AppData\Local </em>verweist.</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/2010/09/16/warum-unter-vista-und-windows-7-cprogramme-nicht-genau-das-selbe-ist-wie-cprogram-files/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bug: VC-2010 MFC CFormView zeichnet Buttons beim Rollen falsch, es erscheinen schwarze Blöcke</title>
		<link>http://blog.m-ri.de/index.php/2010/08/28/bug-vc-2010-cformview-zeichnet-buttons-beim-rollen-falsch-es-erscheinen-schwarze-bloecke/</link>
		<comments>http://blog.m-ri.de/index.php/2010/08/28/bug-vc-2010-cformview-zeichnet-buttons-beim-rollen-falsch-es-erscheinen-schwarze-bloecke/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 09:36:27 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[MFC-Next]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[VS-2010]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=662</guid>
		<description><![CDATA[In der MFC 10.0 hat sich ein Bug eingeschlichen, der sich unter Windows Vista und Windows 7  bemerkbar macht. Unter Windows XP tritt der Fehler nicht auf. Das Problem tritt in jedem Stil auf, der DWM verwendet. D.h. nicht wenn Windows klassisch ausgewählt wird. Wenn auf einen CFormView mehrere Buttons liegen und der CFormView gerollt [...]]]></description>
			<content:encoded><![CDATA[<p>In der <em>MFC 10.0 </em>hat sich ein Bug eingeschlichen, der sich unter <em>Windows Vista </em>und <em>Windows 7  </em>bemerkbar macht. Unter Windows XP tritt der Fehler nicht auf. Das Problem tritt in jedem Stil auf, der <em>DWM</em> verwendet. D.h. nicht wenn Windows klassisch ausgewählt wird.</p>
<p>Wenn auf einen <em>CFormView</em> mehrere Buttons liegen und der <em>CFormView</em> gerollt wird, dann kommt es unter Umständen zu Fehlern beim Neuzeichnen von Buttons. Dies schließt alle Button-Formen ein: <em>Check-Buttons</em>, <em>Radio-Buttons </em>und normale <em>Buttons</em>.</p>
<p>Das Ganze sieht nach dem Rollen in etwa so aus:<br />
<a href="http://blog.m-ri.de/wp-content/uploads/2010/08/CScrollView.png"><img class="alignnone size-full wp-image-663" title="CScrollView Bug" src="http://blog.m-ri.de/wp-content/uploads/2010/08/CScrollView.png" alt="" width="319" height="110" /></a></p>
<p>Der Text einiger Buttons erscheint nach dem Rollen als schwarze Blöcke. Es kann auch vorkommen, dass nur Teile der Buttons falsch gezeichnet werden.</p>
<p>Um das Problem gezielt nachzuvollziehen habe ich ein kleines Sample gebaut. Man kann durch zwei Schalter den CScrollView gezielt nach oben oder unten Rollen. Beim Rollen nach unten und bei bestimmten Fenstergrößen tritt dann der Fehler auf. Ich habe das Main-Window entsprechend beim Start in der Größe angepasst.</p>
<p>Das Problem liegt in einer Implementierung von <em>WM_PRINTCLIENT </em>in <em>CScrollView (CScrollView::OnPrintClient)</em>, die ein Double-Buffering verwendet, dass entweder falsch ist oder sich eben mit der Standardimplementierung eines Dialoges beißt. Auf den ersten und zweiten Blick konnte ich in der Implementierung selbst keinen Fehler sehen. Deshalb vermute ich, dass sich dieses Double-Buffering mit dem auch vorhandenen Double-Buffering in den Standardimplementierungen der Dialogklasse beißt bzw. nicht korrekt berücksichtigt, dass auch Child-Windows neu gezeichnet werden müssen.</p>
<p>Die Lösung ist entsprechend einfach:</p>
<ul>
<li>Man fügt einfach einen Handler für <em>WM_PRINTCLIENT </em>in seiner von <em>CFormView</em> abgeleiteten Klasse ein.</li>
<li>Dieser Handler ruft dann nicht die Implementierung der Basisklasse <em>CFormView</em> auf, sondern die Implementierung in <em>CView</em> (<em>CView::OnPrintClient</em>).</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">...
<span style="color: #007788;">ON_MESSAGE</span><span style="color: #008000;">&#40;</span>WM_PRINTCLIENT,<span style="color: #000040;">&amp;</span>CScrollDialogMFCView<span style="color: #008080;">::</span><span style="color: #007788;">OnPrintClient</span><span style="color: #008000;">&#41;</span>
...
&nbsp;
<span style="color: #007788;">LRESULT</span> CScrollDialogMFCView<span style="color: #008080;">::</span><span style="color: #007788;">OnPrintClient</span><span style="color: #008000;">&#40;</span> WPARAM wp, LPARAM lp <span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// Bypass the CScrollView::OnPrintClient implementation</span>
  <span style="color: #0000ff;">return</span> CView<span style="color: #008080;">::</span><span style="color: #007788;">OnPrintClient</span><span style="color: #008000;">&#40;</span>wp,lp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Dieser Fehler ist in keiner der vorhergehenden MFC Versionen vorhanden (auch nicht in <em>MFCNext</em>), weil einfach kein entsprechender Handler vorhanden war..</p>
<p>Es stellt sich wohl bei einigen jetzt die Frage warum dieser Handler eingebaut wurde. Auch die Antwort ist einfach:<br />
Seit <em>Windows Vista</em> wird stark von <em>AnimateWindow</em> Gebrauch gemacht und auch <em>DWM</em> intern scheint des öfteren <em>WM_PRINT</em>/<em>WM_PRINTCLIENT</em> zu verwenden. Entsprechend haben fast alle Klassen in der <em>MFC</em> entsprechende Handler ergänzt bekommen.</p>
<p>Das Sample kann man hier herunterladen: <a href="http://blog.m-ri.de/wp-content/uploads/2010/08/ScrollDialogMFC-VS-2010.zip">ScrollDialogMFC &#8211; VS-2010</a>.<br />
Ich habe in der stdafx.h einen define <em>FIX_CSCROLLVIEW_PROBLEM</em> eingebaut mit dem man den Fix einfach aktivieren und deaktivieren kann.</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/2010/08/28/bug-vc-2010-cformview-zeichnet-buttons-beim-rollen-falsch-es-erscheinen-schwarze-bloecke/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Texte von deutschen Meldungen in Microsoft Produkten auf englisch finden</title>
		<link>http://blog.m-ri.de/index.php/2010/08/21/texte-von-deutschen-meldungen-in-microsoft-produkten-auf-englisch-finden/</link>
		<comments>http://blog.m-ri.de/index.php/2010/08/21/texte-von-deutschen-meldungen-in-microsoft-produkten-auf-englisch-finden/#comments</comments>
		<pubDate>Sat, 21 Aug 2010 09:16:41 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[Office]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Support]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[Vista / Windows 7]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Übersetzung]]></category>
		<category><![CDATA[Glossaries]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=657</guid>
		<description><![CDATA[ Wer kennt das nicht: Da hat man ein deutsches Microsoft-Produkt und bekommt eine Fehlermeldung, auf die Google nichts ausspuckt. Scheinbar ein seltener Fehler. Oder evtl. benutzen viel mehr Anwender die englische Version eines Entwicklerproduktes. Was nun? Ja wenn man genau wüsste wie die selbe Meldung in englisch lautet, besonders wenn man keine Fehlernummer oder keine [...]]]></description>
			<content:encoded><![CDATA[<p> Wer kennt das nicht: Da hat man ein deutsches Microsoft-Produkt und bekommt eine Fehlermeldung, auf die Google nichts ausspuckt. Scheinbar ein seltener Fehler. Oder evtl. benutzen viel mehr Anwender die englische Version eines Entwicklerproduktes.</p>
<p>Was nun? Ja wenn man genau wüsste wie die selbe Meldung in englisch lautet, besonders wenn man keine Fehlernummer oder keine ID aus dem Ereignisprotokoll hat&#8230;</p>
<p>Die Lösung für <em>MSDN</em> Nutzer ist einfacher als man denkt:<br />
Es gibt die Glossaries, d.h. die entsprechenden Übersetzungstabellen komplett zum Download <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </p>
<p><a href="http://blog.m-ri.de/wp-content/uploads/2010/08/TranslationGlossaries.png"><img class="alignnone size-full wp-image-658" title="Translation Glossaries" src="http://blog.m-ri.de/wp-content/uploads/2010/08/TranslationGlossaries.png" alt="" width="974" height="374" /></a></p>
<p>In der entsprechenden <em>ZIP</em>-Datei befinden sich 276 csv Dateien mit allen möglichen Produkten. Das schließt die Windows Server Produkte ein, wie auch <em>VisualStudio</em>.<br />
Alleine die <em>Windows 7 </em>Datei umfasst 56 Megabyte an Texten.</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/2010/08/21/texte-von-deutschen-meldungen-in-microsoft-produkten-auf-englisch-finden/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

