{"id":826,"date":"2011-04-14T10:12:30","date_gmt":"2011-04-14T08:12:30","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=826"},"modified":"2011-04-17T10:42:13","modified_gmt":"2011-04-17T08:42:13","slug":"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","status":"publish","type":"post","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\/","title":{"rendered":"BUG: Schwarzer Patchday f\u00fcr alle OS XP und sp\u00e4ter 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"},"content":{"rendered":"<h3>Betroffen sind:<\/h3>\n<ul>\n<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>\n<li>Alle Betriebssysteme ab <em>Windows XP <\/em>aufw\u00e4rts. 32bit wie 64bit<\/li>\n<li>Alle Programme, die nicht die <em>MFC<\/em> und <em>CRT DLLs <\/em>applikationsnah (d.h. im Programmverzeichnis, siehe dazu auch die Fu\u00dfnote 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>) \u00a0mit ausliefern.<\/li>\n<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>\n<\/ul>\n<h3>Betrifft die folgenden Fixes vom 12.04.2011:<\/h3>\n<p>F\u00fcr 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 \/>\nF\u00fcr 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>\n<h3>Effekt:<\/h3>\n<p>Die MFC Statelite DLLs werden nicht geladen. Teile der Anwendung erscheinen in englischer Sprache.<\/p>\n<h3>Hintergrund:<\/h3>\n<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\u00fcft, 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\u00fchrt.<\/p>\n<p>Der Code der dazu verwendet wird sieht so aus (Leerzeilen entfernt):<\/p>\n<pre lang=\"cpp\">...\r\nTCHAR *pszFilename = ::PathFindFileName(szLangDLL);\r\nACTCTX_SECTION_KEYED_DATA data;\r\nif (FindActCtxSectionString(\r\n    FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX,\r\n    NULL,\r\n    ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION,\r\n    pszFilename,\r\n    &amp;data) )\r\n{\r\n    \/\/ Load using the dll name only...\r\n    hInstance = ::LoadLibraryEx(pszFilename, NULL, 0);\r\n}\r\nelse\r\n{\r\n    \/\/ Load using the full path...\r\n    hInstance = ::LoadLibraryEx(szLangDLL, NULL, 0);\r\n}\r\n...<\/pre>\n<p>Eigentlich sieht der Code prima aus. Und er vertr\u00e4gt 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>\n<pre lang=\"cpp\">BOOL FindActCtxSectionString(\r\n  __in   DWORD dwFlags,\r\n  __in   const GUID *lpExtensionGuid,\r\n  __in   ULONG ulSectionId,\r\n  __in   LPCTSTR lpStringToFind,\r\n  __out  PACTCTX_SECTION_KEYED_DATA ReturnedData\r\n);<\/pre>\n<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>\n<blockquote><p>Callers <strong>should initialize <\/strong>the ACTCTX_SECTION_KEYED_DATA structure as such:<br \/>\n&#8222;ACTCTX_SECTION_KEYED_DATA askd = { sizeof(askd) };&#8220;<br \/>\nwhich initializes all members to zero\/null except the size field which is set correctly.<\/p><\/blockquote>\n<p>(BTW: Auch ein krasser Doku-Bug in meinen Augen)<\/p>\n<p>Und jetzt sieht man was dem Code fehlt: <strong>data.cbSize wird nicht gesetzt<\/strong> \u2757<br \/>\nDaraus ergeben sich nun drei Varianten, da <em>data.cbSize <\/em>nun zuf\u00e4lligen (nicht initialisierten) Inhalt\u00a0hat:<\/p>\n<ol>\n<li><em>data.cbSize <\/em>ist gr\u00f6\u00dfer als \u00a0<em>sizeof(ACTCTX_SECTION_KEYED_DATA):<\/em><br \/>\nIn diesem Fall wird korrekt ermittelt ob ein Activation Context vorhanden ist. Das Programm l\u00e4uft normal. Mit Activation Context ist kein voller Pfadname n\u00f6tig. Die MFC90xxx.DLL wird evtl. aus dem WinSxS (Side by Side) geladen, oder in einem der Suchpfade gefunden.<\/li>\n<li><em>data.cbSize <\/em>ist kleiner als\u00a0 <em>sizeof(ACTCTX_SECTION_KEYED_DATA)<\/em>:<br \/>\nIn 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 \/>\nSollten die private applikationsnahe Assemblies in einem Unterverzeichnis installiert sein, werden diese auch nicht gefunden.<\/li>\n<li>F\u00fcr die Zukunft.<br \/>\nEin zuk\u00fcnftiges OS vergr\u00f6\u00dfert <em>ACTCTX_SECTION_KEYED_DATA <\/em>und <em>data.cbSize <\/em>hat zuf\u00e4lligen Inhalt und ist gr\u00f6\u00dfer als <em>sizeof(&#8230;)<\/em>:<br \/>\nEin Buffer-Overrun!<\/li>\n<\/ol>\n<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\u00fcr <em>VS-2008<\/em> existiert auch \u2757<br \/>\n<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 \/>\n<a title=\"Hotfix f\u00fcr UseMSPrivateAssemblies.h und VC-2008\" href=\"http:\/\/blog.m-ri.de\/index.php\/2008\/05\/06\/hotfix-fuer-usemsprivateassembliesh-und-vc-2008\/\">Hotfix f\u00fcr UseMSPrivateAssemblies.h und VC-2008<\/a><\/strong><\/p>\n<h3>Was ist zu tun?<\/h3>\n<p>Deinstallation aller hier erw\u00e4hnten Sicherheitspatches mit den entsprechenden Arikelnummern:<br \/>\nRuntime-2005: KB2467175, Runtime-2008: KB2467174<br \/>\nVS-2007 SP1: KB2465367, VS-2008 SP1: KB2465361).<\/p>\n<h3>Weitere Anmerkungen:<\/h3>\n<p>Die betroffenen C\/C++ Runtimes des <em>Visual Studio <\/em>haben die folgenden Versionsnummern<br \/>\n&#8211; VC-2005 8.0.50727.5592 (KB2467175)<br \/>\n&#8211; VC-2008 9.0.30729.5570 (KB2467174)<\/p>\n<p>Mein Kommentar dazu:<br \/>\nDas Leben in der DLL-H\u00f6lle war fast angenehmer als das hier. Ohne Worte \ud83d\ude41<\/p>\n<p><strong>Herzlichen Dank auch an meinem Mit-MVP<\/strong><strong> Mike Ryan, der mit mir zusammen auf diese gesamte Problematik gesto\u00dfen ist \u2757<\/strong><\/p>\n<p><strong>Was meine ich mit &#8222;application local&#8220;?<br \/>\n<\/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\u00fcr 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 \/>\nMeine Artikel beschriben wie man eine Anwendung wirklich applikationslokal macht und damit unabh\u00e4ngig von solchen &#8222;kaputten&#8220; Security Patches. Dazu muss der publicKey Token aus den Manifesten entfernt werden. (Lesen Sie meinen Artikel aufCodeproject).<br \/>\n(Danke an Co-MVP David Ching der mich um Kl\u00e4urung gebeten hat)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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\u00e4rts. 32bit wie 64bit Alle Programme, die nicht die MFC und CRT DLLs applikationsnah (d.h. im Programmverzeichnis, siehe dazu auch die Fu\u00dfnote in meinem Artikel) installiert haben. Also alle &hellip; <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\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eBUG: Schwarzer Patchday f\u00fcr alle OS XP und sp\u00e4ter 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\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4,3,17,27],"tags":[99,352,78,136,34,358,36,44,186,284],"class_list":["post-826","post","type-post","status-publish","format-standard","hentry","category-mfc","category-programmieren","category-vista-2","category-vs2008","tag-bug","tag-mfc","tag-mfcnext","tag-qualitaetssicherung","tag-sp","tag-vista","tag-vs-2005","tag-vs-2008","tag-windows-7","tag-windows-xp"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/826","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=826"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/826\/revisions"}],"predecessor-version":[{"id":829,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/826\/revisions\/829"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=826"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=826"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}