<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">IEInternals</title><subtitle type="html">A look at Internet Explorer from the inside out. Note: @EricLaw left Microsoft in October 2012. This blog may be adopted by an IE team member in the future.</subtitle><id>http://blogs.msdn.com/b/ieinternals/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/ieinternals/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2012-07-13T18:00:00Z</updated><entry><title>Braindump: Feature Control Keys and URLActions</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/archive/2012/09/27/internet-explorer-urlactions-and-feature-control-keys.aspx" /><id>http://blogs.msdn.com/b/ieinternals/archive/2012/09/27/internet-explorer-urlactions-and-feature-control-keys.aspx</id><published>2012-09-27T17:57:00Z</published><updated>2012-09-27T17:57:00Z</updated><content type="html">&lt;p&gt;&lt;em&gt;Note: The &amp;ldquo;brain dump&amp;rdquo; series is akin to what the support.microsoft.com team calls &amp;ldquo;Fast Publish&amp;rdquo; articles&amp;mdash;namely, things that are published quickly, without the usual level of polish, triple-checking, etc. I &lt;/em&gt;expect&lt;em&gt; that these posts will contain errors, but I also expect them to be &lt;/em&gt;mostly &lt;em&gt;correct&lt;/em&gt;.&lt;em&gt; I&amp;rsquo;m writing these up this way now because they&amp;rsquo;ve been in my &amp;ldquo;Important things to write about&amp;rdquo; queue for ~5 years. Alas, these topics are so broad and intricate that a proper treatment would take far more time than I have available at the moment.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m frankly amazed that I&amp;rsquo;ve made it to the end of an eight-year run on the IE team without having written a general blog about Feature Control Keys and URLActions. It&amp;rsquo;s time to rectify that oversight, with one day left on the clock before I &lt;a href="http://www.fiddler2.com/fiddler/LetterFromEric.asp"&gt;move along&lt;/a&gt;. Both of these topics are covered at length on MSDN, but some of the philosophy behind how they came to be is lacking in the formal documentation.&lt;/p&gt;
&lt;h2&gt;Feature Control Keys&lt;/h2&gt;
&lt;p&gt;Feature Control Keys were formally introduced in the huge Windows XP Service Pack 2 update to Internet Explorer 6. XPSP2 &lt;em&gt;massively &lt;/em&gt;tightened security for Internet Explorer, but the team faced a big problem&amp;mdash;thousands of applications host the &lt;a href="http://msdn.microsoft.com/en-us/library/aa752040(v=vs.85).aspx"&gt;Web Browser Control&lt;/a&gt; and if the Internet Explorer lockdowns were applied to those applications, they could break, leading users to avoid installing XPSP2 and thus impeding the value of the security push entirely. On the other hand, if the team simply exempted all non-IE applications from the lockdowns, those other applications could be vulnerable to the same attacks forbidden in Internet Explorer, allowing attackers a means to compromise the system by going around Internet Explorer&amp;rsquo;s defenses into an unhardened Web Browser Control host (e.g. Windows Media Player, for one). In some cases, applications would want exactly the same protections as IE (e.g. 3rd party browsers built on the Web Browser Control, which included at that time Maxthon and Avant Browser). On the other hand, some applications would want none of the protections (e.g. Microsoft Money hosted the Web Browser Control, but only loaded fully-trusted content into it).&lt;/p&gt;
&lt;p&gt;Thus were born &lt;a href="http://msdn.microsoft.com/en-us/library/ms537184(v=vs.85).aspx"&gt;Feature Controls&lt;/a&gt;, a mechanism which allowed an application to opt-in or out to individual security defenses (and later &lt;a href="http://blogs.msdn.com/b/ie/archive/2009/03/10/more-ie8-extensibility-improvements.aspx"&gt;compatibility modes&lt;/a&gt;) on a per-process basis. Feature Controls could be set in one of two ways: by manipulating keys in the registry, or by calling the &lt;a href="http://msdn.microsoft.com/en-us/library/ms537168(v=vs.85).aspx"&gt;CoInternetSetFeatureEnabled&lt;/a&gt; API within the running process. Only a limited number of Feature Controls (often abbreviated FCK for Feature Control Key) can be set via the API for two reasons: First, because some settings must be determined at process startup, before the caller could have called the API, and Second, because the API has generally not been updated to support the many dozens of FCKs introduced after the launch of XPSP2. As a consequence, in almost all cases, FCKs are set via the registry.&lt;/p&gt;
&lt;p&gt;You can see the complete list of &lt;a href="http://msdn.microsoft.com/en-us/library/ee330729(v=vs.85).aspx"&gt;public Feature Control Keys&lt;/a&gt; on MSDN. This list explains how to set the FCK for your process&amp;rsquo; name, as well as listing what each FCK does and what its default is. Note: Internet Explorer internally may use some other FCKs that are not documented, but these are not a part of the public API, and can be subject to change in any monthly update.&lt;/p&gt;
&lt;p&gt;One significant shortcoming of the registry-based Feature Control Key system is that process names must be distinctive if you hope to apply different FCK settings across versions of the program. For instance, all versions of Microsoft Word are named &lt;span style="font-family: Courier New;" face="Courier New"&gt;WinWord.exe&lt;/span&gt;, which means that if you have side-by-side versions of Office 2010 and Office 15, the FCKs set for the last-installed version will overwrite whatever FCKs were applied to the previous version. This long-standing limitation is a bit of a hassle, but in practice not a big enough problem to warrant a change since 2003.&lt;/p&gt;
&lt;p&gt;Feature Control Keys are sometimes criticized for sometimes prioritizing compatibility over security for 3rd party applications; this seems non-intuitive to some. The apt metaphor I like to use is: &amp;ldquo;Sports cars go fast because of their brakes.&amp;rdquo; If sports cars didn&amp;rsquo;t have excellent brakes to complement their engines, drivers would be unable and unwilling to push them to their performance limits, because the inability to control the speed would be fatal. Similarly, if Internet Explorer adopted a &amp;ldquo;All security features must be enabled in all contexts at all times&amp;rdquo; stance, users would quickly stop installing patches in order to prevent the compatibility fallout of such a stance. As a result, enhanced security features would bizarrely result in users becoming less secure.&lt;/p&gt;
&lt;h2&gt;URLActions&lt;/h2&gt;
&lt;p&gt;Feature Control keys are applied on a per-process basis, which isn&amp;rsquo;t sufficiently granular for many needs. Some privileges (e.g. the ability to download ActiveX controls or spawn popup windows) can be safe in a trusted context (e.g. an Intranet site) and unsafe in an untrusted context (Internet pages).&lt;/p&gt;
&lt;p&gt;Internet Explorer&amp;rsquo;s Zone-based security architecture is comprised of two parts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A set of rules that map content into one of the five security zones, and&lt;/li&gt;
&lt;li&gt;A set of security policy settings for each zone that control the privileges (called URLActions) granted to that Zone.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are nearly 100 URLActions in the browser today, and a half dozen or more are added in each new version. Most of them can be viewed by opening Internet Explorer and clicking Tools &amp;gt; Internet Options &amp;gt; Security, picking a Zone, and clicking the &lt;strong&gt;Custom Level&lt;/strong&gt;&amp;hellip; button. However, some &amp;ldquo;headless&amp;rdquo; URLActions are not displayed in the UI and can only be controlled programmatically or via the registry.&lt;/p&gt;
&lt;p&gt;Internet Explorer (and other programs) determine what privileges should be granted to content by calling the &lt;a href="http://msdn.microsoft.com/en-us/library/ms537136(v=vs.85).aspx"&gt;ProcessURLAction&lt;/a&gt; API on the &lt;a href="http://msdn.microsoft.com/en-us/library/ms537130(v=vs.85).aspx"&gt;IInternetSecurityManager&lt;/a&gt; for the process. Applications hosting a Web Browser Control can &lt;a href="http://msdn.microsoft.com/en-us/library/ms537182(v=VS.85).aspx"&gt;supply their own security manager&lt;/a&gt; for the control to use (using the IServiceProvider&amp;rsquo;s ProfferService API) but most simply rely on the default security manager. The default security manager gets its settings from four registry nodes: the HKLM and HKCU nodes under \SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones, and the associated policy keys.&lt;/p&gt;
&lt;p&gt;Aaron Margosis&amp;rsquo; excellent &lt;a href="http://blogs.technet.com/b/fdcc/archive/2011/09/22/iezoneanalyzer-v3-5-with-zone-map-viewer.aspx"&gt;Zone Analyzer&lt;/a&gt; tool allows you to view your default URLAction settings, including determining the &amp;ldquo;effective&amp;rdquo; settings which result from the precedence rules for the four registry nodes.&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;Working Together&lt;/h2&gt;
&lt;p&gt;The URLAction architecture predates Feature Control keys, but some security features are controlled using both mechanisms.&lt;/p&gt;
&lt;p&gt;For instance, &lt;a href="http://msdn.microsoft.com/en-us/library/ee330737(v=vs.85).aspx"&gt;FEATURE_ZONE_ELEVATION&lt;/a&gt; controls whether a given process is opted into &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2012/09/24/zone-elevation-security-warning-websites-in-less-privileged-zone-can-navigate-csrf-xss-protection.aspx"&gt;Zone Elevation Restrictions&lt;/a&gt;. If and only if a process has these restrictions enabled does a cross-Zone navigation then consult the target site&amp;rsquo;s &lt;a href="http://msdn.microsoft.com/en-us/library/ms537178(v=vs.85).aspx"&gt;URLACTION_FEATURE_ZONE_ELEVATION&lt;/a&gt; setting to determine whether the cross-Zone navigation should be permitted. If the FCK is Disabled, or if it is Enabled &lt;strong&gt;and&lt;/strong&gt; the target zone&amp;rsquo;s URLAction is Allow, then the navigation is permitted.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This was just a quick summary of these two important subsystems, but I hope you find it useful anyway!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-Eric Lawrence&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10353871" width="1" height="1"&gt;</content><author><name>EricLaw [ex-MSFT]</name><uri>http://blogs.msdn.com/EricLaw/ProfileUrlRedirect.ashx</uri></author><category term="design" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/design/" /><category term="Security" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/Security/" /><category term="hosting" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/hosting/" /><category term="weboc" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/weboc/" /><category term="Zones" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/Zones/" /></entry><entry><title>Braindump: DNS</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/archive/2012/09/26/dns-lookups-caching-failover-in-internet-explorer-and-wininet.aspx" /><id>http://blogs.msdn.com/b/ieinternals/archive/2012/09/26/dns-lookups-caching-failover-in-internet-explorer-and-wininet.aspx</id><published>2012-09-26T18:02:00Z</published><updated>2012-09-26T18:02:00Z</updated><content type="html">&lt;p&gt;&lt;em&gt;Note: The &amp;ldquo;brain dump&amp;rdquo; series is akin to what the support.microsoft.com team calls &amp;ldquo;Fast Publish&amp;rdquo; articles&amp;mdash;namely, things that are published quickly, without the usual level of polish, triple-checking, etc. I &lt;/em&gt;expect&lt;em&gt; that these posts will contain errors, but I also expect them to be &lt;/em&gt;mostly &lt;em&gt;correct&lt;/em&gt;.&lt;em&gt; I&amp;rsquo;m writing these up this way now because they&amp;rsquo;ve been in my &amp;ldquo;Important things to write about&amp;rdquo; queue for ~5 years. Alas, these topics are so broad and intricate that a proper treatment would take far more time than I have available at the moment.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;When you navigate to a web address like &lt;a href="http://www.bing.com/help"&gt;www.bing.com/help&lt;/a&gt; in your browser, in most cases, the browser (or more specifically, WinINET, the network stack below IE) will immediately convert the hostname component of that URL (in this case, &lt;a href="http://www.bing.com"&gt;www.bing.com&lt;/a&gt;) into a numeric IP address like &lt;strong&gt;165.254.26.34&lt;/strong&gt;. It performs this magic by sending a query to a &lt;a href="http://en.wikipedia.org/wiki/Domain_Name_System"&gt;Domain Name System&lt;/a&gt; (DNS) server that then returns one or more address records for the target hostname. &lt;/span&gt;&lt;span style="font-size: small;"&gt;The browser then establishes a TCP/IP connection to the target IP and then uses HTTP (and/or SSL/TLS) to transfer web traffic over that connection.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Address Lists&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;Many people assume that a hostname will only return one target address, but in practice, it will often return several. For instance, on my PC, a DNS query for &lt;a href="http://www.bing.com"&gt;www.bing.com&lt;/a&gt; returns the following:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;2600:1409:1::6010:6119 &lt;br /&gt;2600:1409:1::6010:6123 &lt;br /&gt;165.254.26.34 &lt;br /&gt;165.254.26.43&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;The first two addresses are &lt;a href="http://en.wikipedia.org/wiki/IPv6"&gt;IPv6&lt;/a&gt; addresses, while the latter two are &lt;a href="http://en.wikipedia.org/wiki/IPv4"&gt;IPv4&lt;/a&gt; addresses. Prior to Windows 2000, Windows would randomly select one of the addresses and attempt to use it; after Windows 2000, the first returned address is always returned first. The change was made to support the idea that the DNS resolver will attempt to order the address list by placing &amp;ldquo;preferred&amp;rdquo; addresses first. For instance, the list might be sorted based on the resolver&amp;rsquo;s knowledge of locality or connection throughput to a given server. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;Windows Vista and later always sort the IPv6 addresses to the front of the list.&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;DNS Failover&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;While WinINET will attempt to connect to the first address, if that connection fails, that entry in the address list will be marked as &amp;ldquo;bad&amp;rdquo; and a connection will be attempted to the next returned address. This process repeats until a connection is made, the address list runs out of candidate addresses, or the retry count limit is reached (&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa385328(v=vs.85).aspx"&gt;INTERNET_OPTION_CONNECT_RETRIES&lt;/a&gt; defaults to 5). If a connection is not made, the browser will show a &amp;ldquo;Page could not be displayed&amp;rdquo; error message.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;The linear process of failover can lead to performance problems, if a DNS returns many records which must be tried before a working address is reached. Each connection attempt could take as long as 21 seconds. &lt;/span&gt;&lt;span style="font-size: small;"&gt;The most common case where this problem occurs is when a server returns IPv6 addresses to a client that cannot successfully make IPv6 connections due to network configuration problems. A &lt;a href="http://en.wikipedia.org/wiki/Happy_Eyeballs"&gt;proposal&lt;/a&gt; (oddly named &amp;ldquo;Happy Eyeballs&amp;rdquo;) was made to address such problems by more quickly attempting to contact IPv4 addresses if IPv6 addresses are slow to resolve. As far as I understand it, Firefox and Chrome utilize a variant of this notion. You can read about how Windows 8&amp;nbsp;improved &lt;a href="http://blogs.msdn.com/b/b8/archive/2012/06/05/connecting-with-ipv6-in-windows-8.aspx"&gt;IPv6 resiliency and performance&lt;/a&gt;&amp;nbsp;over on the B8 blog&lt;em&gt;.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Address List Caching&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;For performance reasons, WinINET caches address lists using an in-process memory cache; this cache&amp;nbsp;allows&amp;nbsp;reuse of recently used addresses without resolving them again. DNS resolutions are also cached by Windows' DNS Resolver&amp;nbsp;itself, but retrieving them from the Windows cache requires an RPC call, which, while much faster than issuing a DNS request on the wire, still takes some time. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;In Internet Explorer 9 and earlier, the per-process cache could hold up to 32 entries; in IE10 and later it holds up to 256 entries. The cache ignores any &lt;a href="http://en.wikipedia.org/wiki/Time_to_live#DNS_records"&gt;TTL (time-to-live)&lt;/a&gt; specified by the DNS server&amp;rsquo;s response. Instead each list is stored for 30 minutes by default; the &lt;a href="http://support.microsoft.com/kb/263558"&gt;DnsCacheTimeout registry key&lt;/a&gt; can be used to adjust this value. (WinHTTP, another Windows HTTP stack used primarily by services, has different defaults; it caches up to 32 records for up to 5 minutes).&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;It has been speculated that the WinINET&amp;nbsp;DNS cache was created to attempt to prevent &lt;a href="http://en.wikipedia.org/wiki/DNS_rebinding"&gt;DNS Rebinding&lt;/a&gt; attacks, but this is a fallacy&amp;mdash;the cache exists for performance reasons only, and is trivial to circumvent as a part of a rebinding attack. &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;What about proxies?&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;If the client computer is behind a traditional (&amp;ldquo;CERN-style&amp;rdquo;) proxy server, WinINET skips the DNS lookup for the target site and instead sends the request to the proxy server, allowing the proxy server to perform the DNS lookup on the client&amp;rsquo;s behalf. This is useful in some cases, for instance, the case where the client computer doesn&amp;rsquo;t itself have access to a DNS server that is willing to return records for non-Intranet sites. Of course, the browser may still need to use DNS even in this case&amp;mdash;if your browser is configured to send traffic to CORPPROXY:8080, it will need to use DNS to look up the address of CORPPROXY. It&amp;rsquo;s possible that the DNS lookup for the proxy will return more than one address; if it does, the same pattern described above is used to decide which address to use.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;However, in the unlikely event that you&amp;rsquo;re using a &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2010/10/08/socks-proxy-support-in-internet-explorer-and-wininet.aspx"&gt;SOCKS-style proxy&lt;/a&gt;, WinINET must first perform the DNS lookup locally, sending that address information to the proxy server. That&amp;rsquo;s because IE only supports SOCKSv4, and the ability to rely upon the remote proxy to do DNS lookups wasn&amp;rsquo;t introduced until the SOCKSv4a protocol.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;-Eric Lawrence&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10353516" width="1" height="1"&gt;</content><author><name>EricLaw [ex-MSFT]</name><uri>http://blogs.msdn.com/EricLaw/ProfileUrlRedirect.ashx</uri></author><category term="performance" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/performance/" /><category term="problems" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/problems/" /><category term="proxy" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/proxy/" /><category term="networking" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/networking/" /><category term="wininet" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/wininet/" /><category term="BetterInIE10" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/BetterInIE10/" /></entry><entry><title>Braindump: ActiveX in Windows 8</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/archive/2012/09/26/windows-8-internet-explorer-10-activex-control-changes-and-restrictions.aspx" /><id>http://blogs.msdn.com/b/ieinternals/archive/2012/09/26/windows-8-internet-explorer-10-activex-control-changes-and-restrictions.aspx</id><published>2012-09-26T17:18:00Z</published><updated>2012-09-26T17:18:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;&lt;em&gt;Note: The &amp;ldquo;brain dump&amp;rdquo; series is akin to what the support.microsoft.com team calls &amp;ldquo;Fast Publish&amp;rdquo; articles&amp;mdash;namely, things that are published quickly, without the usual level of polish, triple-checking, etc. I &lt;/em&gt;expect&lt;em&gt; that these posts will contain errors, but I also expect them to be &lt;/em&gt;mostly &lt;em&gt;correct&lt;/em&gt;.&lt;em&gt; I&amp;rsquo;m writing these up this way now because they&amp;rsquo;ve been in my &amp;ldquo;Important things to write about&amp;rdquo; queue for ~5 years. Alas, these topics are so broad and intricate that a proper treatment would take far more time than I have available at the moment.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;There are a few notable changes in Win8/Internet Explorer 10&amp;rsquo;s behavior when it comes to ActiveX controls.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;1. The non-Desktop mode of the browser (let&amp;rsquo;s call it IEPKaM for lack of a better name) only permits instantiation of controls that are considered to be a part of the web platform. The list of permitted objects is hardcoded into Internet Explorer and consists of:&lt;/span&gt;&lt;/p&gt;
&lt;table style="width: 418px; margin-left: 40px;" border="0" cellspacing="0" cellpadding="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML DOMDocument&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{F6D90F11-9C73-11D3-B32E-00C04F990BB4}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML FreeThreadedDOMDocument&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{F6D90F12-9C73-11D3-B32E-00C04F990BB4}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML XMLSchemaCache&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{373984C9-B845-449B-91E7-45AC83036ADE}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML XSLTemplate&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{2933BF94-7B36-11D2-B20E-00C04F983E60}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML XMLHTTP&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{F6D90F16-9C73-11D3-B32E-00C04F990BB4}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML DOMDocument30&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{F5078F32-C551-11D3-89B9-0000F81FE221}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML FreeThreadedDOMDocument30&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{F5078F33-C551-11D3-89B9-0000F81FE221}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML XMLSchemaCache30&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{F5078F34-C551-11D3-89B9-0000F81FE221}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML XSLTemplate30&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{F5078F36-C551-11D3-89B9-0000F81FE221}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML XMLHTTP30&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{F5078F35-C551-11D3-89B9-0000F81FE221}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML DOMDocument60&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{88D96A05-F192-11D4-A65F-0040963251E5}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML FreeThreadedDOMDocument60&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{88D96A06-f192-11D4-A65F-0040963251E5}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML XMLSchemaCache60&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{88D96A07-f192-11D4-A65F-0040963251E5}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML XSLTemplate60&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{88D96A08-f192-11D4-A65F-0040963251E5}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;MSXML XMLHTTP60&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{88D96A0A-f192-11D4-A65F-0040963251E5}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;XMLHTTPRequest&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{ED8C108E-4349-11D2-91A4-00C04F7969E8}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;DOMDocument&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{2933BF90-7B36-11D2-B20E-00C04F983E60}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;Scripting.Dictionary&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{EE09B103-97E0-11CF-978F-00A02463E06F}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;HtmlComponent&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{3050f4f8-98b5-11cf-BB82-00AA00BDCE0B}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;Scriptlet&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{AE24FDAE-03C6-11D1-8B76-0080C744F389}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;IE XMLDocument&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;em&gt;Not registered &amp;ndash; used when hosting XML&lt;/em&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;IE SVGDocument&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;em&gt;Not registered &amp;ndash; used when hosting SVG&lt;/em&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;IE XHTMLDocument&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;em&gt;Not registered - &amp;ndash; used when hosting XHTML&lt;/em&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;Adobe Flash&lt;/span&gt;&lt;/td&gt;
&lt;td width="216" valign="top"&gt;&lt;span style="font-size: xx-small;"&gt;{D27CDB6E-AE6D-11cf-96B8-444553540000}&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;IEPKaM blocks other forms of extensibility outright: toolbars, BHOs, Pluggable Protocols, MIME Filters, and Namespace handlers will not load in IEPKaM.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;2. IEPKaM only permits use of Adobe Flash on sites that are &lt;a href="http://blogs.msdn.com/b/ie/archive/2012/06/22/developer-guidance-for-web-sites-with-flash-content-in-windows-8.aspx"&gt;listed in the IE Compatibility List&lt;/a&gt; or &lt;a href="http://msdn.microsoft.com/en-us/library/ie/jj193557.aspx"&gt;DebugDomain&lt;/a&gt; registry key.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;3. When enabled, IE&amp;rsquo;s &lt;/span&gt;&lt;span style="font-size: small;" size="3"&gt;&lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2011/04/02/activex-control-restrictions-in-ie.aspx"&gt;ActiveX Filter&lt;/a&gt; permits use the controls listed above, &lt;em&gt;except &lt;/em&gt;Adobe Flash, which is still filtered. This enhancement makes ActiveX Filtering far more palatable, as it doesn&amp;rsquo;t block use of legacy objects like the ActiveX version of the XMLHTTPRequest control.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;4. Windows RT devices like the Microsoft Surface cannot download or install ActiveX controls. &lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;Windows RT&amp;rsquo;s ActiveX restrictions are additionally backed by the OS loader, which will refuse to run code that hasn&amp;rsquo;t been signed with a particular code-signing certificate.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;Installed controls that are a part of Windows RT are permitted to run in the Desktop experience. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;In the IEPKaM experience, the list above is still consulted before a control is permitted to load.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;5. When the &lt;a href="http://blogs.msdn.com/b/ie/archive/2012/03/14/enhanced-protected-mode.aspx"&gt;Enhanced Protected Mode&lt;/a&gt; feature is enabled, controls will not load unless they have been compiled for 64bit (when run on 64bit Windows). When running on Windows 8, there is the additional requirement that the controls are listed in the &lt;/span&gt;&lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx"&gt;&lt;span style="font-size: small;" size="3"&gt;CATID_AppContainerCompatible&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: small;" size="3"&gt; component category, indicating that they have been tested to work properly within AppContainers. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;For instance, the controls must not expect to perform a non-brokered read of the local disk or registry; instead, such operations must be conducted on the control&amp;rsquo;s behalf by a registered broker object running at Medium Integrity. In some cases (like writing to a file), the &lt;a href="http://msdn.microsoft.com/en-us/library/ms537319(v=vs.85).aspx"&gt;IE Protected Mode APIs&lt;/a&gt; will suffice, but IE10 does not include any new &lt;em&gt;Read &lt;/em&gt;brokers, so if your control hopes to read an arbitrary file from disk, you&amp;rsquo;ll need to write your own broker.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt; 6. IE10 enables &lt;a href="http://blogs.msdn.com/b/ie/archive/2012/03/12/enhanced-memory-protections-in-ie10.aspx"&gt;Enhanced Memory Protections&lt;/a&gt; like ForceASLR, which opts all loaded modules into address space randomization, regardless of whether the /DynamicBase flag was set. You should continue to set this flag directly, but be aware that your control cannot take dependencies on fixed module load addresses even if you fail to do so.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;-Eric&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10353498" width="1" height="1"&gt;</content><author><name>EricLaw [ex-MSFT]</name><uri>http://blogs.msdn.com/EricLaw/ProfileUrlRedirect.ashx</uri></author><category term="64bit" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/64bit/" /><category term="ActiveX" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/ActiveX/" /><category term="add-ons" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/add_2D00_ons/" /><category term="addons" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/addons/" /><category term="BetterInIE10" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/BetterInIE10/" /><category term="IEPKaM" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/IEPKaM/" /></entry><entry><title>Understanding Zone Elevation</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/archive/2012/09/24/zone-elevation-security-warning-websites-in-less-privileged-zone-can-navigate-csrf-xss-protection.aspx" /><id>http://blogs.msdn.com/b/ieinternals/archive/2012/09/24/zone-elevation-security-warning-websites-in-less-privileged-zone-can-navigate-csrf-xss-protection.aspx</id><published>2012-09-24T16:55:00Z</published><updated>2012-09-24T16:55:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;The security setting &amp;ldquo;Websites in less privileged web content zone can navigate into this zone&amp;rdquo;:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-size: small;" size="3"&gt;&amp;nbsp;&lt;/span&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/1106.image_5F00_02215FFE.png" width="466" height="128" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;... is one that leads to more questions than almost any other. This setting, also known as &lt;a href="http://msdn.microsoft.com/en-us/library/ms537185(v=vs.85).aspx"&gt;Zone Elevation protection&lt;/a&gt;, was originally designed to prevent navigation from untrusted &lt;strong&gt;Internet &lt;/strong&gt;content into the highly-trusted &lt;strong&gt;Local Machine Zone&lt;/strong&gt;. Prior to Internet Explorer 6 on Windows XP SP2, if an attacker could accomplish such a navigation and inject script into the LMZ, they had found a Remote Code Execution vulnerability and could take over the machine. This was a key source of vulnerabilities in that era, and the threat led to the introduction of Zone Elevation protection. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;The Zone Elevation protection feature blocks navigation, either outright (when set to Disable) or via a Prompt:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/7043.image_5F00_62065340.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/3833.image_5F00_thumb_5F00_56DCC8F6.png" width="397" height="221" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;Regardless of your specific&amp;nbsp;security configuration, for the purposes of Zone Elevation checks, the privilege precedence of Zones is: &lt;strong&gt;Local Machine&lt;/strong&gt; &amp;gt; (&lt;strong&gt;Local Intranet&amp;nbsp;&lt;/strong&gt;== &lt;strong&gt;Trusted Sites&lt;/strong&gt;) &amp;gt; &lt;strong&gt;Internet&lt;/strong&gt; &amp;gt; &lt;strong&gt;Restricted Sites&lt;/strong&gt;. There's a special-case exemption in the logic that allows Trusted Sites to navigate to Intranet sites, even though normally Intranet &amp;gt; Trusted. (One reason for that is that the user&amp;nbsp;may&amp;nbsp;configure an Intranet Site&amp;nbsp;to be a Trusted Site.&amp;nbsp;Most people expect this to &lt;em&gt;increase &lt;/em&gt;the site's level of privilege, despite the fact that the opposite is what happens by default, since the Intranet runs at the Medium-Low Security Template while the Trusted Zone defaults to the Medium Security Template. To help match users' expectations, the Trusted Zone is often afforded &lt;em&gt;special exemptions&lt;/em&gt; like this one.)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;You can explore the Zone Elevation prompt's&amp;nbsp;behavior by adjusting the setting for the Intranet zone to Prompt, then visiting this test page: &lt;a href="http://webdbg.com/test/zoneelevation.htm"&gt;http://webdbg.com/test/zoneelevation.htm&lt;/a&gt;. This page&amp;nbsp;attempts to&amp;nbsp;load a frame&amp;nbsp;at &lt;a href="http://localhost"&gt;http://localhost&lt;/a&gt;, and offers various navigation-triggering methods as well.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;In XP SP2, Zone Elevation protection was bolstered by the &lt;/span&gt;&lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2011/03/23/understanding-local-machine-zone-lockdown-restricted-this-webpage-from-running-scripts-or-activex-controls.aspx"&gt;&lt;span style="font-size: small;" size="3"&gt;Local Machine Zone lockdown&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: small;" size="3"&gt;, such that Zone Elevation into the LMZ would be akin to &amp;ldquo;Breaking into Jail.&amp;rdquo; When&amp;nbsp;an attacker&amp;nbsp;Zone Elevates into the Local Machine Lockdown&amp;nbsp;Zone, he&amp;nbsp;ends up with &lt;em&gt;fewer&lt;/em&gt; privileges, not more.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;However, even after the Local Machine Zone lockdown was introduced, Zone Elevation protection still has &lt;i&gt;some &lt;/i&gt;value in that it can prevent Internet Zone content from navigating into Trusted or Intranet Zone content. As such, when set to Prompt or Disable, it serves as a protection against XSS and CSRF attacks against content in those Zones. Without this protection, an attacker with knowledge of your Trusted/Intranet sites and their vulnerabilities could potentially execute a cross-zone attack against those pages from an Internet site. This attack is non-trivial to pull off (since it is, by its very nature, a targeted attack), and it isn&amp;rsquo;t nearly as scary as a pre-XPSP2 attack against LMZ.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;By default, all Zones have their Zone Elevation setting set to &lt;strong&gt;Allow &lt;/strong&gt;except the Local Machine and Restricted Zones, where it is set to &lt;strong&gt;Disable&lt;/strong&gt;. That setting is meaningless for the Restricted Zone because there is no less trusted Zone. It&amp;rsquo;s set that way because Disable is the default for the &lt;strong&gt;High Security &lt;/strong&gt;template which may be used by other zones. &lt;/span&gt;&lt;span style="font-size: small;" size="3"&gt;If a Zone&amp;rsquo;s security level is set to the &lt;strong&gt;Low &lt;/strong&gt;template, then the Zone Elevation URLAction is set to &lt;strong&gt;Prompt&lt;/strong&gt; because this high level of privilege allows download of signed ActiveX controls and one-click access to scripting ActiveX controls that are not marked safe-for-scripting.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;Configuring Zone Elevation to prompt or disable access to your Local Intranet and Trusted Sites zones can help protect against CSRF and XSS. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;In IE10 Metro Mode, the &lt;/span&gt;&lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx"&gt;&lt;span style="font-size: small;" size="3"&gt;Private Network Isolation&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: small;" size="3"&gt; feature more effectively enforces protection of the &amp;ldquo;Intranet,&amp;rdquo; as it prevents circumvention of cross-Zone restrictions using the site&amp;rsquo;s IP address or otherwise causing IE to Zone a &amp;ldquo;private network&amp;rdquo; site into the Internet zone.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;-Eric&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10352748" width="1" height="1"&gt;</content><author><name>EricLaw [ex-MSFT]</name><uri>http://blogs.msdn.com/EricLaw/ProfileUrlRedirect.ashx</uri></author><category term="Security" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/Security/" /><category term="Zones" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/Zones/" /><category term="BetterInIE10" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/BetterInIE10/" /></entry><entry><title>Debugging in IE10 on Windows 8</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/archive/2012/09/05/debugging-local-websites-using-not-metro-immersive-modern-full-screen-internet-explorer-10-desktop-f12.aspx" /><id>http://blogs.msdn.com/b/ieinternals/archive/2012/09/05/debugging-local-websites-using-not-metro-immersive-modern-full-screen-internet-explorer-10-desktop-f12.aspx</id><published>2012-09-05T21:25:00Z</published><updated>2012-09-05T21:25:00Z</updated><content type="html">&lt;h2&gt;Emulating the &amp;ldquo;non-Desktop Experience&amp;rdquo; in the Desktop Experience&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;The new full-screen &amp;ldquo;fast and fluid&amp;rdquo; experience of IE10 on Windows 8 offers many improvements over Internet Explorer 10 on the Desktop (ranging from UX to Security), but one thing it lacks is the F12 Developer Tools, used by web developers to debug web pages.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;While you can use &lt;a href="http://www.microsoft.com/visualstudio/11/en-us/products/express"&gt;Visual Studio&lt;/a&gt; to debug pages, sometimes, debugging with the lightweight F12 Developer Tools on the Desktop can be simpler. However, what if your bug &lt;em&gt;doesn&amp;rsquo;t &lt;/em&gt;repro in the Desktop experience? &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;In many cases, you can emulate the non-Desktop experience on the Desktop by making simple configuration changes: &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;Enable Enhanced Protected Mode by clicking &lt;strong&gt;Tools &amp;gt; Internet Options &amp;gt; Advanced &lt;/strong&gt;and ticking the &lt;strong&gt;Enhanced Protected Mode&lt;/strong&gt; checkbox in the Security section near the bottom of the list.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;Enable ActiveX Filtering (&lt;strong&gt;Tools&lt;/strong&gt; &amp;gt; &lt;strong&gt;ActiveX Filtering&lt;/strong&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;Press F11 to put the IE Window in full-screen mode&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;With these configuration changes in place, you can continue to use the F12 Developer Tools while emulating the non-Desktop experience. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;&lt;em&gt;Note that one limit to the quality of the emulation is that the ActiveX Filtering feature will filter out Adobe Flash content from all sites. Such content is permitted in the non-Desktop experience only when your site is on the &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ie/jj193557(v=vs.85).aspx"&gt;&lt;em&gt;CV List or the DebugDomain&lt;/em&gt;&lt;/a&gt;&lt;em&gt; registry key is set.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Debugging Local Content&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;Web Developers often test pages or sites on their local systems before it is deployed to production. In some cases, there are side-effects to debugging local content that developers should be aware of.&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;When debugging against a dotless hostname (e.g. http://localhost) the content will typically be in the &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2012/06/05/the-local-intranet-security-zone.aspx"&gt;Local Intranet zone&lt;/a&gt;. By default, this means:&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;Security settings (e.g. File download, ActiveX behavior, &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2010/06/05/understanding-internet-explorer-cookie-controls.aspx"&gt;cookie controls&lt;/a&gt;, popup blocker) will be different. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;The site will run outside of Protected Mode or &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx"&gt;Enhanced Protected Mode&lt;/a&gt;, which means that extensions will run with fewer restrictions and cookies and other storage will be &amp;ldquo;&lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2011/03/10/internet-explorer-beware-cookie-sharing-in-cross-zone-scenarios.aspx"&gt;partitioned&lt;/a&gt;&amp;rdquo; from Internet Zone storage.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;If the hostname is &lt;a href="http://blogs.msdn.com/b/ie/archive/2009/06/17/compatibility-view-and-smart-defaults.aspx"&gt;merely dotless and isn&amp;rsquo;t localhost&lt;/a&gt;, the page will run in Compatibility View by default&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;When debugging against 127.0.0.1 or any other hostname which points to the local computer but is &lt;em&gt;not &lt;/em&gt;mapped to the Intranet zone:&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;Requests from "Windows 8 Apps&amp;rdquo; and IE running in Enhanced Protected will be blocked due to &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx"&gt;AppContainer&lt;/a&gt; Network Isolation&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;When debugging content loaded from a file:// URL, other restrictions include:&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;The content will typically be subject to the Local Machine Lockdown&lt;/span&gt;&lt;span style="font-size: small;" size="3"&gt;&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;&lt;!--EndFragment--&gt;&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;The IE8/IE9 &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2009/07/23/the-ie8-native-xmlhttprequest-object.aspx"&gt;XMLHTTPRequest&lt;/a&gt; object is not able to send requests (fixed in IE10)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;The IE8+ &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx"&gt;XDomainRequest &lt;/a&gt;object is not able to send requests&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;Storage with domain-based security policy (e.g., &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2009/09/16/bugs-in-ie8-support-for-html5-postmessage-sessionstorage-and-localstorage.aspx"&gt;HTML5 Storage&lt;/a&gt;, IndexedDB) is disabled&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;If the content runs inside Enhanced Protected Mode, &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2012/06/20/loading-local-files-in-enhanced-protected-mode-in-internet-explorer-10.aspx"&gt;subdownloads may fail&lt;/a&gt; if they lack a Mark-of-the-Web.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;For scenario #1, you can disable the Local Intranet Zone by clicking &lt;strong&gt;Tools &amp;gt; Internet Options &amp;gt; Security &amp;gt; Local Intranet &amp;gt; Sites&lt;/strong&gt; and unchecking all of the boxes. Of course, this will also mean that your content runs inside Enhanced Protected Mode, which can cause the problems listed in scenario #2.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;To help address scenario #2, &lt;a href="http://getfiddler.com"&gt;Fiddler4&lt;/a&gt; includes a tool called the &lt;a href="http://blogs.msdn.com/b/fiddler/archive/2011/12/10/fiddler-windows-8-apps-enable-loopback-network-isolation-exemption.aspx"&gt;EnableLoopback Utility&lt;/a&gt; which can be used even when Fiddler isn&amp;rsquo;t running. It&amp;rsquo;s simply a gra&lt;/span&gt;&lt;span style="font-size: small;" size="3"&gt;phical version of the &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx"&gt;&lt;span style="font-size: small;" size="3"&gt;CheckNetIsolation.exe&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: small;" size="3"&gt; command line tool which is used to exempt specific AppContainers from loopback restrictions. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;If you&amp;rsquo;re having issues in scenario #3, you can consider using IIS Express or Fiddler&amp;rsquo;s &lt;strong&gt;AutoResponder&lt;/strong&gt; tab to serve your local pages from a local web server.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;I hope that this post is useful. If you encounter any other &amp;ldquo;gotchas&amp;rdquo; or have other tips for local debugging, please sound off in the comments below!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;-Eric&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10346720" width="1" height="1"&gt;</content><author><name>EricLaw [ex-MSFT]</name><uri>http://blogs.msdn.com/EricLaw/ProfileUrlRedirect.ashx</uri></author><category term="limitations" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/limitations/" /><category term="problems" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/problems/" /><category term="Zones" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/Zones/" /><category term="troubleshooting" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/troubleshooting/" /><category term="BetterInIE10" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/BetterInIE10/" /><category term="IEPKaM" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/IEPKaM/" /></entry><entry><title>Downloading ZIP-Based Formats</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/archive/2012/08/28/custom-file-type-formats-renamed-to-zip-on-download-in-internet-explorer-when-application-octet-stream-is-used.aspx" /><id>http://blogs.msdn.com/b/ieinternals/archive/2012/08/28/custom-file-type-formats-renamed-to-zip-on-download-in-internet-explorer-when-application-octet-stream-is-used.aspx</id><published>2012-08-27T23:03:00Z</published><updated>2012-08-27T23:03:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;More and more file formats are based on the &lt;a href="http://en.wikipedia.org/wiki/ZIP_(file_format)"&gt;ZIP format&lt;/a&gt;. The &lt;a href="http://en.wikipedia.org/wiki/Open_Packaging_Conventions"&gt;Open Packaging Conventions&lt;/a&gt; use ZIP as a base format, and that means frameworks like .NET&amp;rsquo;s &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.packaging.aspx"&gt;System.IO.Packaging&lt;/a&gt; also generate files that are valid ZIP files. The Office 2007+ formats are ZIP-based, and more personally, &lt;a href="http://getfiddler.com"&gt;Fiddler&lt;/a&gt;&amp;rsquo;s &lt;a href="http://fiddler.wikidot.com/saz-files"&gt;SAZ Format&lt;/a&gt; is ZIP-based.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;Unfortunately, this trend toward ZIP-based packaging incurs a problem when dealing with file types that are not registered in the server&amp;rsquo;s configuration. When sending unknown types, a simple server will typically send a &lt;strong&gt;Content-Type: application/octet-stream&lt;/strong&gt; header, indicating very generically that the download in question is of a binary type without providing specific information. &lt;/span&gt;&lt;span style="font-size: small;" size="3"&gt;Internet Explorer&amp;rsquo;s &lt;a href="http://blogs.msdn.com/b/ie/archive/2010/10/26/mime-handling-changes-in-internet-explorer.aspx"&gt;MIME-sniffing code&lt;/a&gt; kicks in and says, &lt;em&gt;hey, I see that you&amp;rsquo;ve provided a generic type. Lemme check that content and see if I know what it is. &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;Now, the sniff for ZIP formats is dead-simple: &lt;em&gt;Does the file start with &lt;span style="font-family: Courier New;" face="Courier New"&gt;0x50 x4B&lt;/span&gt; (aka &amp;lsquo;PK&amp;rsquo;)?&lt;/em&gt; If so, then it&amp;rsquo;s probably a ZIP file. And in the case of ZIP-based formats, the browser&amp;rsquo;s &lt;em&gt;technically&lt;/em&gt; right, but &lt;em&gt;behaviorally&lt;/em&gt; wrong. If the server didn&amp;rsquo;t specify a &lt;strong&gt;&lt;span style="font-family: Courier New;" face="Courier New"&gt;Filename&lt;/span&gt; &lt;/strong&gt;in a &lt;strong&gt;&lt;span style="font-family: Courier New;" face="Courier New"&gt;Content-Disposition: attachment&lt;/span&gt;&lt;/strong&gt; header, Internet Explorer will promptly rename the file away from its original extension to &lt;span style="font-family: Courier New;" face="Courier New"&gt;&lt;strong&gt;.ZIP&lt;/strong&gt;&lt;/span&gt;. The browser will then consult with Windows and determine that the .ZIP file should be opened by a MIME Handler. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;For instance, downloading from &lt;a href="http://webdbg.com/dl/saz.saz"&gt;http://webdbg.com/dl/saz.saz&lt;/a&gt; results in the following modal prompt:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/6136.image_5F00_64E770B1.png" width="450" height="379" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;If you choose &lt;strong&gt;Open&lt;/strong&gt;, the MIME Handler is invoked and shows the guts of the ZIP file:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/5531.image_5F00_44CC63F4.png" width="536" height="171" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;If you choose &lt;strong&gt;Save&lt;/strong&gt;, the file will be saved to your downloads folder as a .ZIP. This is generally not what you want.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;As a mitigation for this problem, Internet Explorer 9 included an exemption list for the most popular ZIP-based formats of 2010; downloads whose URLs bore the following extensions are not renamed:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-family: Courier New; font-size: small;" face="Courier New" size="2"&gt;.accdt; .crtx; .docm; .docx; .dotm; .dotx; .gcsx; .glox; .gqsx; .potm; .potx; .ppam; .ppsm; .ppsx; .pptm; .pptx; .sldx; .thmx; .vdw; .xlam; .xlsb; .xlsm; .xlsx; .xltm; .xltx; .zipx&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;To avoid this problem for all ZIP-based types, servers have two options:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;Send a specific MIME-type identifying the file&amp;rsquo;s type&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size: small;" size="3"&gt;Use a Content-Disposition header to specify the filename&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;For instance, when the server is reconfigured to send a &lt;strong&gt;&lt;span style="font-family: Courier New;" face="Courier New"&gt;Content-Type: application/x-fiddler-session-archive&lt;/span&gt;&lt;/strong&gt; MIME, the user gets the expected Download Manager notification, and the file extension is untouched:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/0763.image_5F00_39A2D9AA.png" width="401" height="79" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;The changing web suggests that it probably makes sense to get out of the business of sniffing ZIP files, as such sniffing is likely now causing more problems than it solves.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;" size="3"&gt;-Eric&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10343981" width="1" height="1"&gt;</content><author><name>EricLaw [ex-MSFT]</name><uri>http://blogs.msdn.com/EricLaw/ProfileUrlRedirect.ashx</uri></author><category term="problems" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/problems/" /><category term="BetterInIE9" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/BetterInIE9/" /><category term="downloads" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/downloads/" /></entry><entry><title>Proxy-Authentication breaks many applications</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/archive/2012/08/03/manual-proxy-authentication-requiring-basic-or-digest-breaks-many-applications.aspx" /><id>http://blogs.msdn.com/b/ieinternals/archive/2012/08/03/manual-proxy-authentication-requiring-basic-or-digest-breaks-many-applications.aspx</id><published>2012-08-03T18:21:00Z</published><updated>2012-08-03T18:21:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="3"&gt;When I first joined Office, I worked on the team responsible for delivering Help, Templates, and ClipArt into the client applications. As we were testing our work in various simulated customer environments, we found a big problem. At least one big customer (tens of thousands of licenses) had a network environment in which their users were forced to enter a username and password in order to authenticate to the proxy server. Without authenticating to the proxy, all HTTP/HTTPS requests were blocked.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="3"&gt;Now, this was a fairly uncommon architecture, even then, and is perhaps more so now. In most environments, either the proxy server doesn&amp;rsquo;t require authentication, or the proxy relies upon the &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2011/07/06/integrated-windows-authentication-kerberos-ntlm-http-400-error-for-16kb-authorization-header.aspx"&gt;NTLM/Kerberos&lt;/a&gt; authentication schemes which permit users&amp;rsquo; Windows logon credentials to be automatically used to respond to challenges from the proxy server. Environments that relied upon BASIC or DIGEST authentication require that the user explicitly submit their credentials, typically once per process (because most networking components, e.g. WinINET would cache these credentials for the lifetime of the process).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="3"&gt;The problem with my features in Office was that they all passed the &lt;strong&gt;INTERNET_FLAG_NO_UI&lt;/strong&gt; flag to WinINET, or ran atop WinHTTP, which explicitly doesn&amp;rsquo;t include any user-interface, including dialogs. The result of this was that in an environment with a BASIC/DIGEST proxy, all requests failed. In order to work properly in such environments, the application must itself supply the needed credentials to the network stack (e.g. for WinINET, call &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa385114(v=vs.85).aspx"&gt;InternetSetOption&lt;/a&gt;, passing the INTERNET_OPTION_PROXY_PASSWORD and INTERNET_OPTION_PROXY_USERNAME option flags) to avoid the need to prompt the user.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I added a new rule to &lt;a href="http://www.getfiddler.com/"&gt;Fiddler&lt;/a&gt; that made it simple to test products for this problem:&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/7127.image_5F00_43F5B378.png" width="281" height="152" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When the &lt;strong&gt;Require Proxy Authentication &lt;/strong&gt;box is checked, Fiddler automatically responds to any request lacking a &lt;strong&gt;Proxy-Authorization &lt;/strong&gt;header with a HTTP/407 response containing a &lt;strong&gt;Proxy-Authenticate &lt;/strong&gt;header specifying the authentication scheme required:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;GET /ua.aspx HTTP/1.1 &lt;br /&gt;Accept: text/html, application/xhtml+xml, */* &lt;br /&gt;User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) &lt;br /&gt;Host: www.enhanceie.com&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #008000;" color="#008000"&gt;HTTP/1.1 407 Proxy Auth Required &lt;br /&gt;Connection: close &lt;br /&gt;&lt;strong&gt;Proxy-Authenticate: Basic realm="FiddlerProxy (username: 1, password: 1)" &lt;br /&gt;&lt;/strong&gt;Content-Type: text/html &lt;br /&gt; &lt;br /&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;[Fiddler] Proxy Authentication Required.&amp;lt;BR&amp;gt; &amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A client that supports manual proxy authentication will then prompt the user for the username and password:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/4426.image_5F00_0EE92448.png" width="456" height="329" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The client will then reissue the same request, supplying the provided credentials (base64-encoded) in the Proxy-Authorization header:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;GET /ua.aspx HTTP/1.1 &lt;br /&gt;Accept: text/html, application/xhtml+xml, */* &lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: #ffff00;"&gt;Proxy-Authorization: Basic MTox&lt;/span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt; &lt;br /&gt;User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) &lt;br /&gt;Host: www.enhanceie.com&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If the client fails to collect the credentials, it will typically treat the HTTP/407 response as fatal and will show an error message or fail silently.&lt;/p&gt;
&lt;p&gt;When you try this, you can find broken scenarios all over. For instance, when I tried to post this blog using Windows Live Writer, the following error message was shown:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/5086.image_5F00_1CBB6A43.png" width="487" height="279" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Afterward, I was prompted to re-enter my credentials for the &lt;strong&gt;web&lt;/strong&gt;&amp;nbsp;&lt;strong&gt;server&lt;/strong&gt;&amp;mdash;there was no way to supply the credentials required by the &lt;strong&gt;proxy&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Sometimes, an otherwise failing scenario may pass depending on what happens &lt;em&gt;earlier &lt;/em&gt;in a process. For instance, if you enable the Fiddler rule, then launch IE to &lt;strong&gt;about:blank &lt;/strong&gt;you will find that Search Suggestions from the Address bar don&amp;rsquo;t work, showing &amp;ldquo;&lt;strong&gt;An error occurred&lt;/strong&gt;.&amp;rdquo;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/6567.image_5F00_7CA05D85.png" width="411" height="210" /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Notably, if you subsequently navigate the tab to a web page, IE will prompt you for proxy credentials using the CredUI dialog box shown above. After you supply those credentials, the Search Suggestions feature starts working&amp;mdash;that&amp;rsquo;s because the proxy credentials are cached for the lifetime of the process.&lt;/p&gt;
&lt;p&gt;In other cases, failure are silent and there&amp;rsquo;s no notice to the user. For instance, many background updaters are based on BITS/WinHTTP and will fail silently when a HTTP/407 is encountered. Similarly, Windows&amp;rsquo; CAPI component&amp;rsquo;s &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2011/04/07/enabling-certificate-revocation-check-failure-warnings-in-internet-explorer.aspx"&gt;Certificate Revocation Checks&lt;/a&gt; will &lt;a href="http://support.microsoft.com/kb/915787"&gt;fail&lt;/a&gt; because the svchost.exe process doesn&amp;rsquo;t have the required proxy credentials.&lt;/p&gt;
&lt;p&gt;If you need to sell your software into an enterprise that uses proxies, or just want to make your software robust against even uncommon network configurations, be sure to test manual proxy authentication scenarios!&lt;/p&gt;
&lt;p&gt;-Eric&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10336696" width="1" height="1"&gt;</content><author><name>EricLaw [ex-MSFT]</name><uri>http://blogs.msdn.com/EricLaw/ProfileUrlRedirect.ashx</uri></author><category term="errors" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/errors/" /><category term="proxy" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/proxy/" /><category term="networking" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/networking/" /><category term="bugs" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/bugs/" /><category term="wininet" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/wininet/" /><category term="certificate" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/certificate/" /></entry><entry><title>Brain Dump: Shims, Detours, and other “magic”</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/archive/2012/07/31/internet-explorer-compatibility-detours-shims-virtualization-for-toolbars-activex-bhos-and-other-native-extensions.aspx" /><id>http://blogs.msdn.com/b/ieinternals/archive/2012/07/31/internet-explorer-compatibility-detours-shims-virtualization-for-toolbars-activex-bhos-and-other-native-extensions.aspx</id><published>2012-07-31T02:05:00Z</published><updated>2012-07-31T02:05:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;&lt;span style="font-size: small;" size="3"&gt;&lt;em&gt;Note: The &amp;ldquo;brain dump&amp;rdquo; series is akin to what the support.microsoft.com team calls &amp;ldquo;Fast Publish&amp;rdquo; articles&amp;mdash;namely, things that are published quickly, without the usual level of polish, triple-checking, etc. I &lt;/em&gt;expect&lt;em&gt; that these posts will contain errors, but I also expect them to be &lt;/em&gt;mostly &lt;em&gt;correct&lt;/em&gt;.&lt;em&gt; I&amp;rsquo;m writing these up this way now because they&amp;rsquo;ve been in my &amp;ldquo;Important things to write about&amp;rdquo; queue for ~5 years. Alas, these topics are so broad and intricate that a proper treatment would take far more time than I have available at the moment.&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;Since IE6, Internet Explorer has implemented major architectural changes without accompanying breaking changes to its binary extension model. While new extension features have been introduced (e.g. &lt;a href="http://blogs.msdn.com/b/ie/archive/2008/09/15/what-s-new-for-ie8-search.aspx"&gt;Search Providers&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/ie/archive/2008/03/06/activities-and-webslices-in-internet-explorer-8.aspx"&gt;Web Slices&lt;/a&gt;, and &lt;a href="http://blogs.msdn.com/b/ie/archive/2009/03/27/accelerator-spotlight.aspx"&gt;Accelerators&lt;/a&gt;), they are all based on markup rather than code and have been relatively straightforward to keep working from version to version.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;In contrast, Internet Explorer&amp;rsquo;s binary extension models: ActiveX, Browser Helper Objects (BHOs), Toolbars, etc, are all architected such that 3rd-party COM code runs within the Internet Explorer process. In many cases, extensions originally designed for IE6 (and earlier) continue to run without modification even in IE9 and IE10 on the Desktop. That&amp;rsquo;s despite the fact that virtually everything else around these extensions has changed: &lt;a href="http://blogs.msdn.com/b/ie/archive/2005/05/26/422103.aspx"&gt;tabbed browsing&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/b/ie/archive/2006/02/09/528963.aspx"&gt;Protected Mode&lt;/a&gt; were introduced for IE7, &lt;a href="http://blogs.msdn.com/b/ie/archive/2008/03/11/ie8-and-loosely-coupled-ie-lcie.aspx"&gt;Loosely-Coupled IE&lt;/a&gt; was added in IE8, &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/04/19/hang-resistance-in-ie9.aspx"&gt;Hang Resistance&lt;/a&gt; was introduced in IE9, and IE10 introduced &lt;a href="http://blogs.msdn.com/b/ie/archive/2012/03/14/enhanced-protected-mode.aspx"&gt;Enhanced Protected Mode&lt;/a&gt; and other major changes throughout Windows. Each of these architectural shifts would break the majority of the binary extensions if not for a corresponding set of investments in compatibility features undertaken in each release of the browser.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;Windows Vista&amp;rsquo;s introduction of the Integrity Level system was accompanied by the &lt;a href="http://technet.microsoft.com/en-us/magazine/2007.06.uac.aspx"&gt;UAC Virtualization&lt;/a&gt; system, designed to help accommodate applications that expected to be running with Administrative privileges. &lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;If a 32-bit executable&amp;rsquo;s &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb756929.aspx"&gt;manifest&lt;/a&gt; lacks a &lt;strong&gt;requestedExecutionLevel&lt;/strong&gt; element (e.g. &lt;span style="font-family: Courier New; font-size: small;" face="Courier New" size="3"&gt;iexplore.exe&lt;/span&gt;&amp;rsquo;s embedded manifest&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt; doesn&amp;rsquo;t have one), then UAC Virtualization will be applied for file and registry operations. &lt;/span&gt;Browser extensions running in Internet Explorer benefit from this virtualization, enabling legacy add-ons that expect to be able to read or write to protected locations to continue working. Virtualization works by redirecting write operations from read-only areas to a per-user &amp;ldquo;virtualized&amp;rdquo; location. For instance, attempting to write a file to the Desktop from Low Integrity would ordinarily fail, but virtualization permits the operation to succeed by writing the file to a hidden folder elsewhere in the file system. (IE&amp;rsquo;s &lt;a href="http://msdn.microsoft.com/en-us/library/bb250462(v=vs.85).aspx#upm_undpm"&gt;Low Integrity virtualization&lt;/a&gt; uses a shim to redirect writes to %USERPROFILE%\AppData\Local\Microsoft\Windows\Temporary Internet Files\Virtualized\, while UAC virtualization writes to %USERPROFILE%\AppData\Local\VirtualStore).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;However, virtualization alone isn&amp;rsquo;t enough to ensure compatibility. For instance, when tabbed browsing was introduced in IE7 and Hang Resistance was introduced in IE9, the behavior of windows and dialogs needed to be updated to be compatible with these features. For instance, when an extension in a background tab attempts to show a prompt, this prompt must be suppressed until that tab is activated (otherwise, a confusing experience would result). To accommodate that behavior, a system of shims and detours is used. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;These two technologies are similar:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;&lt;a href="http://technet.microsoft.com/en-us/library/dd837644(v=ws.10).aspx"&gt;Shims&lt;/a&gt; work by rewriting a module&amp;rsquo;s import address table at runtime to point to a different target function&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;&lt;a href="http://research.microsoft.com/en-us/projects/detours/"&gt;MSR&lt;/a&gt;&amp;rsquo;s &lt;a href="http://research.microsoft.com/apps/pubs/default.aspx?id=68568"&gt;Detours&lt;/a&gt; work by rewriting the start of one or more target functions at runtime to point to a wrapper function&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;These technologies allow Internet Explorer to intercept calls to important functions (e.g. CreateProcess, CoCreateInstance, CreateWindow, etc) and modify the behavior of those calls to improve compatibility with the restrictions and desired behaviors of the tab/content process in which HTML and add-ons run. For instance, the CreateProcess and CoCreateInstance APIs are wrapped such that the &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2009/12/01/understanding-internet-explorer-security-protected-mode-elevation-dialog.aspx"&gt;Protected Mode Elevation Policies&lt;/a&gt; can be applied. Similarly, CreateWindow is designed to accommodate the creation of new windows by background tabs, and to properly parent those windows to the correct window handle even though the window hierarchy was changed due to the &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/04/19/hang-resistance-in-ie9.aspx"&gt;hang resistance&lt;/a&gt; feature.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;In IE10, we&amp;rsquo;ve moved most functionality away from Detours to Shims for enhanced compatibility and because we&amp;rsquo;re shipping to a new platform (Windows RT) to which we otherwise would have had to port the IE version of Detours. In most cases, this was a seamless change, but we recently ran into one ancient toolbar that was impacted by the change.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;The toolbar in question was a simple one that offered a standard search box, a few notification icons, and a short set of menus that would launch dialog boxes to configure the toolbar and show information about it. Our compatibility testing team noticed that in IE10, the dialog boxes from the toolbar would never come up. Debugging native code extensions without source or symbols is never fun, but I decided to take a look anyway. I ran the installer and verified that the dialog boxes didn&amp;rsquo;t come up. Knowing nothing about the technology (e.g. maybe the dialogs were written in HTML), I took a quick look at the installation folder. &lt;/span&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;I got an idea of how old the code was when I saw that the installation folder contained &lt;span style="font-family: Courier New; font-size: small;" face="Courier New" size="3"&gt;unicows.dll&lt;/span&gt;, an ancient library designed to help enable compatibility with pre-Unicode versions of Windows (e.g. 95/98). &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;I next ran through the repro with IE10 running under the debugger and found a nested function deep inside a call to &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms632679(v=vs.85).aspx"&gt;CreateWindow&lt;/a&gt;() was returning Access Denied. I then ran the same repro in IE9 under the debugger and found that CreateWindow succeeded, but observed that in IE9, there were detoured compatibility wrappers in the stack trace, but those wrappers were not present in the scenario in IE10. &lt;/span&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;I spent several hours pondering this question and aimlessly touring around in the debugger. I was whining about this scenario to a colleague, complaining about code so ancient that it was shipping with &lt;span style="font-family: Courier New; font-size: small;" face="Courier New" size="3"&gt;unicows.dll&lt;/span&gt;, when I realized that I&amp;rsquo;d never used this library myself, and in fact I&amp;rsquo;d never seen a toolbar use it before. When trying to explain what it did to the colleague, I decided that I&amp;rsquo;d probably stop hand-waving and pulled up &lt;a href="http://en.wikipedia.org/wiki/Unicows"&gt;unicows&lt;/a&gt; up on Wikipedia. And bam, there it was, plain as day:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-family: Courier New; font-size: small;" face="Courier New" size="2"&gt;By adding the UNICOWS.LIB to the link command-line [ ... ] the linker will resolve referenced symbols with the one provided by UNICOWS.LIB instead. When a wide-character function is called for the first time at runtime, the function stub in UNICOWS.LIB first receives control and [ ... ] if the OS natively supports the &lt;i&gt;W&lt;/i&gt; version (i.e. Windows NT/2000/XP/2003), then the function stub updates the in-memory import table so that future calls will directly invoke the native &lt;i&gt;W&lt;/i&gt; version without any more overhead.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;&amp;hellip;and there&amp;rsquo;s the problem! &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;When IE first loads a toolbar, the shims run against the module and wrap all calls to CreateWindow with a call to the compatibility wrapper function. But when IE loaded this toolbar, it didn&amp;rsquo;t find any calls to CreateWindow, because those calls&amp;nbsp;had been pointed at a function inside &lt;span style="font-family: Courier New; font-size: small;" face="Courier New" size="3"&gt;unicows.dll&lt;/span&gt; instead of at the original function in &lt;span style="font-family: Courier New; font-size: small;" face="Courier New" size="3"&gt;user32.dll&lt;/span&gt;. As a result, the compatibility shim wasn&amp;rsquo;t applied, and the function call failed. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;Now, this wouldn&amp;rsquo;t have happened if unicows did its import-table fixup the &amp;ldquo;normal&amp;rdquo; way, using the &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms683212(v=vs.85).aspx"&gt;GetProcAddress&lt;/a&gt; function. That's&amp;nbsp;because the compatibility shims are applied to GetProcAddress as well, and the fixup would have been applied properly at the time that unicows did the update of the import table. However, for reasons&lt;em&gt;&amp;nbsp;that I&amp;nbsp;thought were&lt;/em&gt;&amp;nbsp;lost to the mists of time (see below)&lt;strong&gt;,&lt;/strong&gt; the implementers of unicows instead copied the source code of GetProcAddress from user32 into their own DLL, so the shims had no way to recognize it. &lt;/span&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;While we &lt;em&gt;could &lt;/em&gt;add a new shim to handle &lt;span style="font-family: Courier New; font-size: small;" face="Courier New" size="3"&gt;unicows.dll&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;, the obscurity and low priority of this scenario mean that we instead decided to outreach to the vendor and request that they update their build process to remove the long-defunct support for Windows &amp;lsquo;9x.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;-Eric&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;Update: &lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Calibri; font-size: medium;" face="Calibri" size="4"&gt;Over on his blog, &lt;a href="http://blogs.msdn.com/b/michkap/archive/2012/08/01/10335466.aspx"&gt;Michael Kaplan&lt;/a&gt;&amp;nbsp;provided a history of why&amp;nbsp;&lt;span style="font-family: courier new,courier; font-size: small;"&gt;unicows.dll&lt;/span&gt; works the way it does.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;PS: This &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc301805.aspx"&gt;MSDN article&lt;/a&gt;&amp;nbsp;is a great resource that explains the PE file format and how linking and delay loading features work.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10335011" width="1" height="1"&gt;</content><author><name>EricLaw [ex-MSFT]</name><uri>http://blogs.msdn.com/EricLaw/ProfileUrlRedirect.ashx</uri></author><category term="ActiveX" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/ActiveX/" /><category term="UAC" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/UAC/" /><category term="add-ons" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/add_2D00_ons/" /><category term="interop" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/interop/" /></entry><entry><title>Content-Length and Transfer-Encoding Validation in the IE10 Download Manager</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/archive/2012/07/16/content-length-and-transfer-encoding-validation-in-ie10-download-manager-couldnt-be-downloaded-retry-cancel.aspx" /><id>http://blogs.msdn.com/b/ieinternals/archive/2012/07/16/content-length-and-transfer-encoding-validation-in-ie10-download-manager-couldnt-be-downloaded-retry-cancel.aspx</id><published>2012-07-16T19:12:00Z</published><updated>2012-07-16T19:12:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;Back in &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2011/03/09/browsers-accommodate-incorrect-http-content-length-and-sites-depressingly-depend-on-it.aspx"&gt;March of 2011&lt;/a&gt;, I mentioned that we had encountered some sites and servers that were not sending proper Content-Length headers for their HTTP responses. As a result, we disabled our attempt to verify &lt;span style="font-family: Courier New;" face="Courier New"&gt;Content-Length&lt;/span&gt; for IE9.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;Unfortunately, by April, we&amp;rsquo;d found that this accommodation had led to some confusing error experiences. Incomplete executable files were &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2011/04/02/not-commonly-downloaded-warnings-will-be-shown-when-running-corrupt-or-incomplete-files.aspx"&gt;not recognized by SmartScreen&amp;rsquo;s Application Reputation&lt;/a&gt; feature, and other signed filetypes would show &amp;ldquo;&lt;strong&gt;xxxx was reported as unsafe&lt;/strong&gt;&amp;rdquo; because WinVerifyTrust would report that the incomplete file&amp;rsquo;s signature was corrupt. This problem was very commonly reported for large files (e.g. 50mb installers) by users in locations with spotty network access (e.g. where such connections are often interrupted).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;With IE10, we&amp;rsquo;ve reenabled the Content-Length / Transfer-Encoding checks in IE&amp;rsquo;s Download Manager. If the Download Manager encounters a transfer that does include the number of bytes specified by the &lt;span style="font-family: Courier New;" face="Courier New"&gt;Content-Length&lt;/span&gt; header, or the transfer fails to include the proper 0-sized chunk (when using &lt;span style="font-family: Courier New;" face="Courier New"&gt;Transfer-Encoding: chunked&lt;/span&gt;), the following message will be shown:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="IncompleteFile" border="0" alt="IncompleteFile" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/5165.IncompleteFile_5F00_5F6B5D3C.png" width="590" height="50" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;If the user clicks &lt;strong&gt;Retry&lt;/strong&gt;, IE will attempt to resume (or restart the download). In many cases of network interruption, this feature helps ensure that the user is able to download the complete file. A&lt;/span&gt;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;s a compatibility accommodation, if the retried transfer again does not provide the expected number of bytes, Internet Explorer will permit the download to be treated as &amp;ldquo;finished&amp;rdquo; anyway, so that users are not blocked from interacting with buggy servers. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;For instance, one buggy pattern we've seen is a server which delivers the HTTP response body as a single chunk, then calls &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpresponse.close.aspx"&gt;HttpResponse.Close()&lt;/a&gt;&amp;nbsp;instead of the &lt;a href="http://blogs.msdn.com/b/aspnetue/archive/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation.aspx"&gt;proper HttpApplication.CompleteRequest&lt;/a&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp; // Add Excel as content type and attachment&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;Response.ContentType = "application/vnd.ms-excel";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;Response.AddHeader("Content-Disposition", "attachment; filename=" + binTarget);&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;mStream.Position = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;mStream.WriteTo(Response.OutputStream);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;Response.Flush();&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp; // BAD PATTERN: DO NOT USE.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;// See &lt;a href="http://blogs.msdn.com/b/aspnetue/archive/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation.aspx"&gt;http://blogs.msdn.com/b/aspnetue/archive/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation.aspx&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; background-color: #ff0000;"&gt;&amp;nbsp;&amp;nbsp;Response.Close();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;Calling Close() like this omits the final chunk, and would cause the server's output to fail in the Download Manager if not for the compatibility accommodation.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;You can test how browser&amp;rsquo;s handle incorrect transfer sizes using these two &lt;a href="http://fiddler2.com/meddler/"&gt;Meddler&lt;/a&gt; scripts:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;&lt;a href="https://www.fiddler2.com/test/ContentLenIncorrectOnDownload.ms"&gt;Bad Content-Length&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;&lt;a href="https://www.fiddler2.com/test/FileDownloadWithIncorrectChunking.ms"&gt;Missing Final Chunk&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;span style="font-family: Calibri; font-size: small;" size="3" face="Calibri"&gt;-Eric&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10330274" width="1" height="1"&gt;</content><author><name>EricLaw [ex-MSFT]</name><uri>http://blogs.msdn.com/EricLaw/ProfileUrlRedirect.ashx</uri></author><category term="networking" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/networking/" /><category term="downloads" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/downloads/" /><category term="BetterInIE10" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/BetterInIE10/" /></entry><entry><title>Brain Dump: International Text</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ieinternals/archive/2012/07/13/internet-explorer-and-international-text-encoding-unicode-punycode-ansi-oh-my.aspx" /><id>http://blogs.msdn.com/b/ieinternals/archive/2012/07/13/internet-explorer-and-international-text-encoding-unicode-punycode-ansi-oh-my.aspx</id><published>2012-07-13T17:00:00Z</published><updated>2012-07-13T17:00:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;&lt;em&gt;Note: The &amp;ldquo;brain dump&amp;rdquo; series is akin to what the support.microsoft.com team calls &amp;ldquo;Fast Publish&amp;rdquo; articles&amp;mdash;namely, things that are published quickly, without the usual level of polish, triple-checking, etc. I &lt;/em&gt;expect&lt;em&gt; that these posts will contain errors, but I also expect them to be &lt;/em&gt;mostly &lt;em&gt;correct&lt;/em&gt;.&lt;em&gt; I&amp;rsquo;m writing these up this way now because they&amp;rsquo;ve been in my &amp;ldquo;Important things to write about&amp;rdquo; queue for ~5 years. Alas, these topics are so broad and intricate that a proper treatment would take far more time than I have available at the moment.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;Handling of non-ASCII text is a common source of compatibility and interoperability problems. This post covers a variety of tidbits related to this topic, and it will be expanded (and likely corrected) over time.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;&lt;a href="http://www.ietf.org/rfc/rfc2616.txt"&gt;RFC2616 defining HTTP/1.1&lt;/a&gt; suggests that non-ISO-8859-1 text in HTTP headers must be encoded according to the rules of &lt;a href="http://www.ietf.org/rfc/rfc2047.txt"&gt;RFC2047&lt;/a&gt;, an approach that was not commonly implemented by many web clients. Many clients will instead send or accept raw UTF-8 or bytes encoded using the current system&amp;rsquo;s ANSI codepage instead. Character-set mismatches often result in interoperability problems.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;Internet Explorer&amp;rsquo;s handling of non-ASCII text is partially controlled by these checkboxes in the Advanced tab:&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/2251.image_5F00_2CAC61CC.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/1273.image_5F00_thumb_5F00_4C5B3B94.png" width="421" height="205" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;&lt;strong&gt;Always show encoded addresses &lt;/strong&gt;is disabled by default will force IE to show the raw Punycode in the address bar at all times when viewing an IDN site, even if that site&amp;rsquo;s IDN URL is following the non-spoofability rules.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;&lt;strong&gt;Send IDN server names &lt;/strong&gt;is enabled by default and will force IE to encode hostnames in URLs following the rules of &lt;strong&gt;&lt;a href="http://www.ietf.org/rfc/rfc3491.txt"&gt;RFC3491&lt;/a&gt; &lt;/strong&gt;and &lt;a href="http://www.ietf.org/rfc/rfc3492.txt"&gt;RFC3492&lt;/a&gt;. The user will be shown the URL in the address bar in Unicode form if and only if the URL is deemed non-spoofable. Please see this IEBlog post on the &lt;a href="http://blogs.msdn.com/b/ie/archive/2006/07/31/684337.aspx"&gt;rules of IDN Non-spoofability&lt;/a&gt;.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;&lt;strong&gt;Send IDN server names for Intranet addresses &lt;/strong&gt;is disabled by default for compatibility with legacy Windows networks that were using UTF-8 to support non-ASCII hostnames. Other browsers, to the best of my knowledge, do not have special handling for Intranet sites, and I believe that &lt;em&gt;current &lt;/em&gt;versions of Active Directory and the Windows DNS server support punycoded hostname registration and lookup.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;&lt;strong&gt;Send UTF-8 URLs &lt;/strong&gt;is checked by default, but doesn&amp;rsquo;t behave as broadly as its name implies. This option controls whether &lt;em&gt;certain &lt;/em&gt;URL components and headers are sent and interpreted using UTF-8 or the system&amp;rsquo;s ANSI codepage, but it does not apply to the entire URL.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;&lt;strong&gt;Show Notification bar for encoded addresses &lt;/strong&gt;checked by default, informs the user that they are seeing punycoded text in the address bar only because the non-spoofability rules have determined that the current site&amp;rsquo;s address follows the rules for IDN non-spoofability &lt;em&gt;except &lt;/em&gt;that the address uses characters outside of the current user&amp;rsquo;s configured Accept-Languages. The notification bar allows the user to adjust the configured Accept-Languages using the Internet Control Panel.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;&lt;strong&gt;Use UTF-8 for mailto links&lt;/strong&gt; is unchecked by default, but is checked when installing current versions of Outlook. You can learn a lot more about this option in this &lt;a href="http://blogs.msdn.com/b/ie/archive/2007/02/12/international-mailto-uris-in-ie7.aspx"&gt;IEBlog post&lt;/a&gt;. The option has been removed for Windows 8 / Internet Explorer 10, and mailto links are always passed to the client application using %-encoded UTF-8. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;" face="Calibri" size="2"&gt;Submission of text in HTML forms in Internet Explorer is a fascinating and complex topic. &lt;/span&gt;&lt;span style="font-family: Calibri;" face="Calibri" size="2"&gt;The design of form encoding in IE8 and earlier was to submit forms using the encoding of the submitting page by default. If the FORM element on the page declared the &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ie/ms533061(v=vs.85).aspx"&gt;&lt;span style="font-family: Calibri;" face="Calibri" size="2"&gt;Accept-Charset&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Calibri;" face="Calibri" size="2"&gt; attribute equal to &lt;strong&gt;UTF-8&amp;nbsp;&lt;/strong&gt;(which is the only supported value)&amp;nbsp;&lt;span style="text-decoration: underline;"&gt;and&lt;/span&gt; if the form results contained data that could not be encoding in the page's encoding, then the form results would be sent as UTF-8. In IE9 standards-mode and later, IE will always encode form results as UTF-8 if the accept-charset="UTF-8" attribute is present.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;If your web form contains an &lt;strong&gt;INPUT TYPE=HIDDEN &lt;/strong&gt;element with the name &lt;strong&gt;_charset_&lt;/strong&gt; this field will be automatically filled with the name of the character set used to encode the form when it is submitted. This helps permit your server to decode the form using the proper encoding.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;In contrast, it&amp;rsquo;s not &lt;em&gt;always&lt;/em&gt; possible to reliably reconstruct querystrings at the server (no, that was not a typo!), because IE does not pass any state information to the server which would indicate what encoding was used. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;URLs in IE may use up to three (!!) different encodings at once: punycode in the hostname, %-escaped UTF-8 for the path, and raw codepaged-ANSI for the query and fragment components. This is clearly a mess, but fixing it to match the IRI specification incurs compatibility costs. (Trust me, we&amp;rsquo;ve tried!)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;Internet Explorer&amp;rsquo;s XMLHTTPRequest object will not automatically encode your URIs for you (e.g. %-escaping UTF8 characters). If you want to send such characters to the server following the rules of IRI, you should encode them before passing them to the &lt;strong&gt;open() &lt;/strong&gt;method, using the &lt;a href="http://msdn.microsoft.com/en-us/library/aeh9cef7(v=vs.94).aspx"&gt;encodeURIComponent&lt;/a&gt; JavaScript API.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;" face="Calibri" size="2"&gt;If you&amp;rsquo;re downloading files to &lt;strong&gt;IE9+ &lt;/strong&gt;or other modern browsers, you should use RFC5987 encoding for the Content-Disposition header. If you need to support old versions of IE, the story is more complicated. This &lt;/span&gt;&lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2010/06/07/content-disposition-attachment-and-international-unicode-characters.aspx"&gt;&lt;span style="font-family: Calibri;" face="Calibri" size="2"&gt;IEInternals post&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Calibri;" face="Calibri" size="2"&gt; explores that topic.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;In WordPad (and most RichEdit controls in Windows) you can simply type a four-digit hexadecimal number, (e.g. &lt;strong&gt;&lt;span style="font-family: Courier New;" face="Courier New"&gt;30C4&lt;/span&gt;&lt;/strong&gt;) and then hit &lt;strong&gt;ALT+X&lt;/strong&gt; to convert that sequence to the corresponding Unicode character (i.e. &lt;strong&gt;ツ&lt;/strong&gt;). Similarly, you can paste a Unicode character into WordPad and hit ALT+X to convert it back to its Unicode value.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;In Windows, encoding of non-ASCII characters in File-scheme URIs (e.g. &lt;span style="font-family: Courier New;" face="Courier New"&gt;file://server/path/file.txt&lt;/span&gt;) is different than in other schemes. %-encoded octets in a FILE uri are always interpreted using the system&amp;rsquo;s ANSI codepage, not UTF-8. Learn more about this and File URIs in general &lt;a href="http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri; font-size: small;" face="Calibri" size="2"&gt;-Eric&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10329696" width="1" height="1"&gt;</content><author><name>EricLaw [ex-MSFT]</name><uri>http://blogs.msdn.com/EricLaw/ProfileUrlRedirect.ashx</uri></author><category term="standards" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/standards/" /><category term="networking" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/networking/" /><category term="interop" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/interop/" /><category term="international" scheme="http://blogs.msdn.com/b/ieinternals/archive/tags/international/" /></entry></feed>