<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Windows Core Networking : WinINet</title><link>http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx</link><description>Tags: WinINet</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Why didn’t my cached content revalidate to the web server? (IE8 edition)</title><link>http://blogs.msdn.com/wndp/archive/2009/07/06/why-didn-t-my-cached-content-revalidate-to-the-web-server-ie8-edition.aspx</link><pubDate>Mon, 06 Jul 2009 23:33:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9820584</guid><dc:creator>AriPernick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/wndp/comments/9820584.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=9820584</wfw:commentRss><description>&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 5px; display: inline; border-top: 0px; border-right: 0px" title="&amp;quot;Check for newer versions of stored pages&amp;quot; settings" border="0" alt="&amp;quot;Check for newer versions of stored pages&amp;quot; settings" align="right" src="http://blogs.msdn.com/blogfiles/wndp/WindowsLiveWriter/Whydidntmycachedcontentrevalidatetothewe_BEBB/WinINetCacheSettings-Automatic-Mini_6.png" width="244" height="126" /&gt; For the super eagle eyed developer or Web Server admin, you might have noticed that cache entry validation happens slightly less frequently in IE8. I’m talking about the check to the Web Server (via &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25"&gt;If-Modified-Since&lt;/a&gt;) to see if the &lt;a href="http://en.wikipedia.org/wiki/Temporary_Internet_Files"&gt;cached version&lt;/a&gt; of content needs updating or is still current. The short version of why this happens is the way that IE uses WinINet sessions changed to accommodate &lt;a href="http://blogs.msdn.com/ie/archive/2008/03/11/ie8-and-loosely-coupled-ie-lcie.aspx"&gt;Loosely Coupled IE&lt;/a&gt; and session’s start time is an important factor in evaluating if WinINet needs to issue an If-Modified-Since request. &lt;/p&gt;  &lt;p&gt;Digging deeper, we can look at a couple of the factors in the logic IE/WinINet is using to decide to issue an If-Modified-Since request. First is the the Cache Setting: “Check for newer versions of stored pages” in the “Temporary Internet Files and History Settings” as described in &lt;a href="http://support.microsoft.com/kb/263070"&gt;KB article 263070&lt;/a&gt; and pictured with this blog entry. These are settings that apply to cached content missing the &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21"&gt;Expires&lt;/a&gt; headers. “Every time I visit the webpage” and “Never” are pretty straightforward. “Every time I start Internet Explorer” and “Automatically” have logic dependant on the the session’s start time. Another factor to note that we have different behavior when using the Back and Forward browser buttons compared to what we do in hyperlink navigation. The Back and Forward behavior also depends on the session’s start time when content is expired or is missing the Expires header.&lt;/p&gt;  &lt;p&gt;How does Loosely Coupled IE in IE8 change the session start time? Previously any IE window got a single session in WinINet by the fact it only uses a single process and sharing of the session handle across tabs, with Loosely Coupled IE we had to do work to let multiple processes share session state. This means that new IE8 windows share the same session compared to new IE7 windows which get a new session. Eric Lawrence on the IEBlog &lt;a href="http://blogs.msdn.com/ie/archive/2009/05/06/session-cookies-sessionstorage-and-ie8.aspx"&gt;talks a bit more about this session sharing behavior&lt;/a&gt;. The effect on WinINet is that IE8 sessions last longer on average then they used to and that means potentially less often revalidation of content from the Web Server.&lt;/p&gt;  &lt;p&gt; -- Ari Pernick&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9820584" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category></item><item><title>HTTP Connection Management</title><link>http://blogs.msdn.com/wndp/archive/2009/05/08/http-connection-management.aspx</link><pubDate>Fri, 08 May 2009 19:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9597273</guid><dc:creator>AriPernick</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/wndp/comments/9597273.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=9597273</wfw:commentRss><description>&lt;p&gt;HTTP is a request/response protocol. You request some resource like the HTML of a webpage and the response comes back with the HTML attached.&amp;#160; As each request is sent on a connection, the complete response must be read from the connection before the next response can be read. (There is an optimization where you make more requests on a connection before receiving the full response to the previous requests known as pipelining. However it doesn’t change the need to receive all the data from the previous requests first.)&lt;/p&gt;  &lt;p&gt;So if an application is asking for another request to a server while the current one is in progress, what’s a HTTP Client API to do? Well, it can either wait till the connection is available or start a new connection. This decision is mostly controlled by a configurable maximum number of simultaneous connections to a server.&lt;/p&gt;  &lt;p&gt;With that in mind, how should the following customer question get answered?&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;My client application’s performance is getting impacted by WinInet opening new SSL connections to my server rather than reusing the existing connection. How do I fix this?&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9597273" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category><category domain="http://blogs.msdn.com/wndp/archive/tags/WinHttp/default.aspx">WinHttp</category></item><item><title>Ask Perf explains how winInet is used</title><link>http://blogs.msdn.com/wndp/archive/2007/08/21/ask-perf-explains-how-wininet-is-used.aspx</link><pubDate>Tue, 21 Aug 2007 20:37:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4496765</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/wndp/comments/4496765.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=4496765</wfw:commentRss><description>&lt;p&gt;Ask Perf, the blog of the Enterprise Platforms Windows Server Performance Team, is spending some time explaining a bit of how WinInet/WinHTTP and their surrounding components work with each other. &lt;a href="http://blogs.technet.com/askperf/archive/2007/08/21/under-the-hood-wininet.aspx"&gt;Go check it out&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;&amp;nbsp; -- Ari&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4496765" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category><category domain="http://blogs.msdn.com/wndp/archive/tags/WinHttp/default.aspx">WinHttp</category></item><item><title>WinInet ETW Logs: Part 1 - Reading Logs</title><link>http://blogs.msdn.com/wndp/archive/2007/02/05/WinInet-ETW-Logs-Part-1-Reading-Logs.aspx</link><pubDate>Mon, 05 Feb 2007 19:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1509884</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/wndp/comments/1509884.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=1509884</wfw:commentRss><description>&lt;P&gt;Hello, my name is Marcus Frazier. I am a developer on the WinInet team and I am here to talk about reading and understanding WinInet ETW logs. If you need to know how to capture these logs, check out &lt;A href="http://blogs.msdn.com/wndp/archive/2006/03/28/563642.aspx" mce_href="http://blogs.msdn.com/wndp/archive/2006/03/28/563642.aspx"&gt;Jonathan’s post&lt;/A&gt;. Keep in mind that WinInet ETW tracing is only available on Vista.&lt;BR&gt;
&lt;H3&gt;Events&lt;/H3&gt;
&lt;P&gt;ETW logs are event based. When an event occurs an entry is placed in the log. These events are based on protocol behavior and decision points. 
&lt;P&gt;WinInet currently has seven event categories: 
&lt;P&gt;1) Handle Events – Events dealing with the creation and destruction of HINTERNET handles. 
&lt;P&gt;2) HTTP Events – Events dealing with the processing of HTTP requests and responses. 
&lt;P&gt;3) Connection Events – Events dealing with underlying network operations (TCP, DNS). 
&lt;P&gt;4) Authentication Events – Events dealing with authentication. 
&lt;P&gt;5) HTTPS Events – Events dealing with the HTTPS protocol. 
&lt;P&gt;6) Autoproxy Events – Events dealing with Autoproxy. 
&lt;P&gt;7) Cookie Events – Events dealing with cookies. 
&lt;P&gt;WinInet currently uses three event levels. Each event can be one of these levels: 
&lt;P&gt;1) Error – These events are raised when an error condition is reached. 
&lt;P&gt;2) Information – These events provide additional information regarding protocol handling. 
&lt;P&gt;3) Verbose – These events provide extra information that can help in diagnosing certain situations but are not required for all cases. 
&lt;H3&gt;&lt;BR&gt;XML Logs&lt;/H3&gt;
&lt;P&gt;Let’s look at a single event entry in a log highlighting relevant information. This log was converted from ETL to XML format using the tracerpt as described in &lt;A href="http://blogs.msdn.com/wndp/archive/2006/03/28/563642.aspx" mce_href="http://blogs.msdn.com/wndp/archive/2006/03/28/563642.aspx"&gt;Jonathan’s post&lt;/A&gt;. 
&lt;BLOCKQUOTE&gt;&lt;CODE&gt;
&lt;P&gt;&amp;lt;Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"&amp;gt; 
&lt;P&gt;&amp;lt;System&amp;gt; 
&lt;P&gt;&amp;lt;EventID&amp;gt;&lt;B&gt;103&lt;/B&gt;&amp;lt;/EventID&amp;gt; 
&lt;P&gt;&amp;lt;Level&amp;gt;4&amp;lt;/Level&amp;gt; 
&lt;P&gt;&amp;lt;TimeCreated SystemTime="2006-08-21T13:00:35.614957600Z" /&amp;gt; 
&lt;P&gt;&amp;lt;Execution ProcessID="2480" ThreadID="3396" ProcessorID="1” KernelTime="30" UserTime="0" /&amp;gt; 
&lt;P&gt;&amp;lt;/System&amp;gt; 
&lt;P&gt;&amp;lt;RenderingInfo Culture="en-US"&amp;gt; 
&lt;P&gt;&amp;lt;Level&amp;gt;&lt;B&gt;Information&lt;/B&gt;&amp;lt;/Level&amp;gt; 
&lt;P&gt;&amp;lt;Keywords&amp;gt; 
&lt;P&gt;&amp;lt;Keyword&amp;gt;Flagged on all WinINet events dealing with creation or destruction of INTERNET handles&amp;lt;/Keyword&amp;gt; 
&lt;P&gt;&amp;lt;/Keywords&amp;gt; 
&lt;P&gt;&amp;lt;Message&amp;gt;Handle &lt;B&gt;0xCC0010 created by InternetConnect: SessionHandle=0xCC0004, Server=www.live.com:80, HTTP, Flags=0x0&lt;/B&gt; 
&lt;P&gt;&amp;lt;/Message&amp;gt; 
&lt;P&gt;&amp;lt;Channel&amp;gt;Microsoft-Windows-WinINet/Analytic&amp;lt;/Channel&amp;gt; 
&lt;P&gt;&amp;lt;/RenderingInfo&amp;gt; 
&lt;P&gt;&amp;lt;/Event&amp;gt; &lt;/CODE&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;When reading a log in XML format, there is a lot of information about every event. The first thing to look for is the open &lt;CODE&gt;&amp;lt;event&amp;gt;&lt;/CODE&gt; tag. All the information from this tag to the &lt;CODE&gt;&amp;lt;/event&amp;gt;&lt;/CODE&gt; tag is about a single event. When quickly scanning through these logs I find the easiest thing to look for is the &lt;CODE&gt;&amp;lt;message&amp;gt;&lt;/CODE&gt; tag within each event block. This is the English version of what has actually happened. Some other useful information is the SystemTime in the &lt;CODE&gt;&amp;lt;TimeCreated&amp;gt;&lt;/CODE&gt; tag, which tells you when this event happened, and the &lt;CODE&gt;&amp;lt;Execution&amp;gt;&lt;/CODE&gt; tag which shows the ProcessID and ThreadID. 
&lt;H3&gt;&lt;BR&gt;Text Logs&lt;/H3&gt;
&lt;P&gt;In addition to XML format, ETW logs can also be converted to an easier-to-read text format using the following command (Vista only): 
&lt;BLOCKQUOTE&gt;&lt;CODE&gt;
&lt;P&gt;wevtutil qe &amp;lt;etl file path&amp;gt; /lf:True /f:Text &amp;gt; &amp;lt;output path&amp;gt; &lt;/CODE&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;An example of the full sequence of commands would look like this: 
&lt;BLOCKQUOTE&gt;&lt;CODE&gt;
&lt;P&gt;logman start "test1" -p "Microsoft-Windows-WinInet" -o "test1.etl" -ets 
&lt;P&gt;&amp;lt;Run scenario&amp;gt; 
&lt;P&gt;logman stop "test1" -ets 
&lt;P&gt;wevtutil qe c:\logs\test1.etl /lf:True /f:Text &amp;gt; c:\logs\test1.txt 
&lt;P&gt;notepad test1.txt &lt;/CODE&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Entries in the text formatted log appear in a concise format: 
&lt;BLOCKQUOTE&gt;&lt;CODE&gt;
&lt;P&gt;Event[21]: 
&lt;P&gt;Log Name: N/A 
&lt;P&gt;Source: Microsoft-Windows-WinINet 
&lt;P&gt;Date: 2007-01-22T12:43:55.735 
&lt;P&gt;Event ID: 301 
&lt;P&gt;Task: N/A 
&lt;P&gt;Level: Information 
&lt;P&gt;Opcode: Info 
&lt;P&gt;Keyword: Flagged on all WinINet events dealing with network operations (TCP, DNS) 
&lt;P&gt;User: N/A 
&lt;P&gt;User Name: N/A 
&lt;P&gt;Computer: mfrazier2-test 
&lt;P&gt;Description: 
&lt;P&gt;TCP connection to server www.live.com established: ConnectionHandle=0xcc0014, SocketHandle=0x944, LocalPort=49779 &lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/CODE&gt;
&lt;P&gt;These text files can be read with notepad. The “Description” is the same text as contained in the &lt;CODE&gt;&amp;lt;message&amp;gt;&lt;/CODE&gt; tag from the XML log and describes what has happened. 
&lt;P&gt;Diagnosing problems with an ETW log can prove to be difficult at times. ETW logs will not always produce an error level event when a problem occurs. It takes some practice to recognize an “incorrect” sequence of events when there is no explicit error level event in the log. It is helpful to understand the normal flow of the protocol, and to understand what a “correct” series of events looks like. We suggest capturing the log of a working scenario and keeping it for reference. 
&lt;P&gt;The best way to get better at reading these logs is to see the difference between good and bad logs. Subsequent blog entries will give examples of diagnosing common problems using ETW logs. These examples will help you diagnose real ETW logs. The next post will deal with a simple case: No Internet Connectivity. 
&lt;P&gt;- Marcus&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1509884" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category></item><item><title>A Tale of 20 Cookies</title><link>http://blogs.msdn.com/wndp/archive/2006/08/28/a-tale-of-20-cookies.aspx</link><pubDate>Mon, 28 Aug 2006 15:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:703558</guid><dc:creator>wndpteam</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/wndp/comments/703558.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=703558</wfw:commentRss><description>&lt;P&gt;As more applications move to leveraging the web, either through desktop-integration or complete migration to a web model, maintaining user state on the web becomes critical. For many web sites and applications this means the use of in-memory and persistent cookies. 
&lt;P&gt;Netscape originally defined HTTP cookies in a &lt;A href="http://wp.netscape.com/newsref/std/cookie_spec.html"&gt;preliminary document&lt;/A&gt; and later the IETF standardized cookies in RFC’s &lt;A href="http://tools.ietf.org/html/rfc2109"&gt;2109&lt;/A&gt; and &lt;A href="http://tools.ietf.org/html/rfc2965"&gt;2965&lt;/A&gt;. Interestingly, the WinINet cookie implementation is still (mostly) modeled after the early Netscape document, which specifies that browsers should: 
&lt;UL&gt;
&lt;LI&gt;Maintain at least 300 cookies total, 
&lt;LI&gt;Support cookies up to 4KB in size each, 
&lt;LI&gt;Support no fewer than 20 cookies per unique host or domain&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;User-agents, such as mobile phones, have more relaxed recommendations. Internet Explorer 7.0 and WinINet support up to 20 cookies of 5KB each per domain with no set limits on the total number of cookies overall on a system. Even with these totals, some web applications may need more. 
&lt;P&gt;A follow-on question might be to ask what happens when a web application sends more than 20 cookies for a domain (21 cookies perhaps). The answer is that we maintain the 20 most recent cookies. &lt;I&gt;Recent&lt;/I&gt; is based on the order in which we received the cookies. That means if your web server sends 21 cookies named Cookie1, Cookie2 thru Cookie21 to WinINet (via Internet Explorer or otherwise), your web server would only receive Cookie2, Cookie3 thru Cookie21 on the next request from WinINet.&amp;nbsp; We simply maintain the 20 most recent and quietly discard the other cookies for that host/domain. 
&lt;P&gt;Next, what happens when a web application exceeds the other maximum and sends a cookie with a size over 5120 bytes (&amp;gt;5KB)?&amp;nbsp; Instead of truncating the values of oversized cookies, we simply discard these cookies. We chose to discard instead of truncate in order to avoid any type of cookie data corruption.&amp;nbsp; I think you would agree that a cookie with a value of $10000 is very different from a truncated one with a value of $100. In addition, it is easier for the server application to check for the existence of a cookie and react if it is missing versus detecting if the value is correct. 
&lt;P&gt;There are ways to work-around&amp;nbsp;our current&amp;nbsp;20x cookie limit.&amp;nbsp;&amp;nbsp;In my opinion, the&amp;nbsp;best work-around is to leverage a durable back-end store for user information and use cookies for user tracking&amp;nbsp;and lightweight values.&amp;nbsp; This keeps the request/response more streamlined. 
&lt;P&gt;Another work-around, in cases where you absolutely need&amp;nbsp;more&amp;nbsp;data sent back-and-forth within the 20-cookie limit, is to pack more data into fewer cookies. This means that instead of: 
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Set-Cookie: FirstName=Billy 
&lt;P&gt;Set-Cookie: LastName=Anders&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;You can combine into something&amp;nbsp;like: 
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Set-Cookie: FullName=Billy~Anders&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Then, in your web application, you split&amp;nbsp;the &lt;I&gt;FullName&lt;/I&gt; cookie.&amp;nbsp; Here is a rough (&lt;I&gt;rough&lt;/I&gt; meaning no error handling)&amp;nbsp;ASP.NET&amp;nbsp;example in C#: 
&lt;BLOCKQUOTE&gt;
&lt;P&gt;string[] Names = Request.Cookies[“FullName”].Split(‘~’); 
&lt;P&gt;if (Names.Length == 2) { 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string FirstName = Names[0]; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string LastName = Names[1]; 
&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Admittedly, this is not as straight-forward as the&amp;nbsp;standard ASP.NET approach of: 
&lt;BLOCKQUOTE&gt;
&lt;P&gt;string FirstName = Request.Cookies["FirstName"]; 
&lt;P&gt;string LastName = Request.Cookies["LastName"];&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;However, this may prove helpful if you ever need to get around&amp;nbsp;the 20x limit that we currently have.&amp;nbsp; 
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;EM&gt;Update: The sample above is to demonstrate the concept of packing more data into fewer cookies for any web development platform. ASP.NET natively supports&amp;nbsp;subkeys which already allow you to&amp;nbsp;store multiple values within cookies.&amp;nbsp;&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&lt;EM&gt;s&lt;/EM&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#000000&gt;&lt;EM&gt;tring FirstName = Request.Cookies["Name"]["First"];&lt;BR&gt;string LastName&amp;nbsp; = Request.Cookies["Name"]["Last"];&lt;/EM&gt;&lt;/FONT&gt; &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The current limits seem reasonable,&amp;nbsp;but we would like to hear from you on whether that is case or not. Are you writing web applications that would like to use the browser’s cookie store beyond the 20x and 5KB limits that we have? Do you need 25, 50, 100,&amp;nbsp;250&amp;nbsp;cookies for your application? 
&lt;P&gt;
&lt;P&gt;-&amp;nbsp;Billy Anders&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=703558" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category><category domain="http://blogs.msdn.com/wndp/archive/tags/Post+Vista+HTTP+Client/default.aspx">Post Vista HTTP Client</category></item><item><title>Content-Encoding != Content-Type</title><link>http://blogs.msdn.com/wndp/archive/2006/08/21/Content-Encoding-not-equal-Content-Type.aspx</link><pubDate>Mon, 21 Aug 2006 18:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:699741</guid><dc:creator>wndpteam</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/wndp/comments/699741.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=699741</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://www.ietf.org/rfc/rfc2616.txt"&gt;RFC 2616&lt;/A&gt; for HTTP 1.1 specifies how web servers must indicate encoding transformations using the &lt;EM&gt;Content-Encoding&lt;/EM&gt; header. Although on the surface, &lt;EM&gt;Content-Encoding&lt;/EM&gt; (e.g., gzip, deflate, compress) and &lt;EM&gt;Content-Type&lt;/EM&gt; (e.g., x-application/x-gzip) sound similar, they are, in fact, two distinct pieces of information. Whereas servers use &lt;EM&gt;Content-Type&lt;/EM&gt; to specify the data type of the entity body, which can be useful for client applications that want to open the content with the appropriate application, &lt;EM&gt;Content-Encoding&lt;/EM&gt; is used solely to specify any additional encoding done by the server before the content was transmitted to the client. Although the HTTP RFC outlines these rules pretty clearly, some web sites respond with "gzip" as the Content-Encoding even though the server has not gzipped the content. &lt;/P&gt;
&lt;P&gt;Our testing has shown this problem to be limited to some sites that serve Unix/Linux style "tarball" files. Tarballs are gzip compressed archives files. By setting the Content-Encoding header to "gzip" on a tarball, the server is specifying that it has additionally gzipped the gzipped file. This, of course, is unlikely but not impossible or non-compliant. &lt;/P&gt;
&lt;P&gt;Therein lies the problem. A server responding with content-encoding, such as "gzip," is specifying the necessary mechanism that the client needs in order to decompress the content. If the server did not actually encode the content as specified, then the client's decompression would fail. &lt;/P&gt;
&lt;P&gt;Here is a potentially over-simplified example: &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Windows Vista Networking Rocks! 
&lt;LI&gt;Jvaqbjf Ivfgn Argjbexvat Ebpxf! &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;If I mistakenly claim that string a) has been encoded using the simple &lt;A href="http://en.wikipedia.org/wiki/ROT13"&gt;ROT-13&lt;/A&gt; obfuscation scheme when in actuality it has not, then the decoded message b) will be very different than the intended message. &lt;/P&gt;
&lt;P&gt;Since the &lt;A href="http://en.wikipedia.org/wiki/Artificial_intelligence"&gt;AI&lt;/A&gt; engine for WinINet isn't yet ready for production (joke), we try and work-around these non-compliant server responses but that isn't the right long-term approach. The fix and the ask, is for web server, extension and application authors to test their servers to see if they exhibit this behavior and if so fix their implementations before we remove our client-side &lt;EM&gt;hacks&lt;/EM&gt;. &lt;/P&gt;
&lt;P&gt;To test your server for compliance, issue a simple HTTP 1.1 request, including the "Accept-Encoding: gzip" for a .gz file and inspect the headers. If you see Content-Encoding: x-gzip or gzip, then the server is either gzip-encoding the already gzipped file or it is misstating that the content has been encoded by the server before transmission and therefore perpetuating client HTTP stacks, such as WinINet, having to absorb and hide this bad server behavior. &lt;/P&gt;
&lt;P&gt;-Billy Anders&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=699741" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category><category domain="http://blogs.msdn.com/wndp/archive/tags/WinHttp/default.aspx">WinHttp</category><category domain="http://blogs.msdn.com/wndp/archive/tags/Http.sys/default.aspx">Http.sys</category><category domain="http://blogs.msdn.com/wndp/archive/tags/Post+Vista+HTTP+Client/default.aspx">Post Vista HTTP Client</category></item><item><title>A WinINet Chunked-Encoding Story</title><link>http://blogs.msdn.com/wndp/archive/2006/08/14/a-chunked-encoding-story.aspx</link><pubDate>Mon, 14 Aug 2006 18:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:695821</guid><dc:creator>wndpteam</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/wndp/comments/695821.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=695821</wfw:commentRss><description>&lt;P&gt;A couple of months back, Nick Bradbury of Homesite and FeedDemon fame posted a blog entitled, "&lt;A href="http://nick.typepad.com/blog/2006/06/microsoft_pleas.html"&gt;Microsoft, Please fix this WinINet bug!&lt;/A&gt;" where he mentioned some users of &lt;A href="http://www.newsgator.com/NGOLProduct.aspx?ProdId=FeedDemon"&gt;FeedDemon 2.0&lt;/A&gt; were experiencing a significant CPU spike when downloading RSS feeds. Nick discovered that the spike occurred when downloading feeds from particular sites via WinINet &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/internetreadfile.asp"&gt;InternetReadFile&lt;/A&gt;. The problem turned out to be a combination of issues; first, a handful of servers have non-compliant chunked-encoding transfer implementations and secondly, WinINet was poorly handling these situations. &lt;/P&gt;
&lt;P&gt;At a basic level, chunked-encoding allows servers to begin sending responses without first having to determine the overall size of the content. When the server knows the size of the content beforehand, as the case with static content, this is less of a big deal. Things become more difficult and time-consuming when the server is responding with dynamic data, such as from a database or a live multimedia event. &lt;/P&gt;
&lt;P&gt;With chunked-encoding, the web server responds with chunked in the Transfer-Encoding header instead of using the Content-Length header. Clients receiving chunked know that each chunk is only a piece of the overall content response. Each chunk is preceded by the size of the chunk (in hexadecimal) before being sent by the server: &lt;/P&gt;
&lt;P&gt;Transfer-Encoding: chunked&lt;BR&gt;5DC&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;…1500 bytes of chunked data&amp;gt;&lt;BR&gt;57D&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;…1405 bytes of chunked data&amp;gt; &lt;/P&gt;
&lt;P&gt;There is no set limit to the number of chunks that can be returned from the server. Clients simply process the chunks as they arrive depending on the type of content and the scenario. A live multimedia stream may begin playback as soon as enough buffered content has arrived, while a downloaded ISO file may write the bytes directly to a local file until the last chunk is received. The server indicates the end of content by returning a chunk indicator of 0 (zero): &lt;/P&gt;
&lt;P&gt;Server: Microsoft-IIS/6.0&lt;BR&gt;Date: Wed, 02 Jul 2006 08:15:00 GMT&lt;BR&gt;Transfer-Encoding: chunked&lt;BR&gt;Content-Type: text/xml&lt;BR&gt;5DC&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;…1500 bytes of chunked data&amp;gt;&lt;BR&gt;57D&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;…1405 bytes of chunked data&amp;gt;&lt;BR&gt;0 &lt;/P&gt;
&lt;P&gt;This final zero-length chunk is where the problematic servers were breaking from &lt;A href="http://www.w3.org/Protocols/rfc2616/rfc2616.html"&gt;RFC 2616&lt;/A&gt;, and where WinINet was failing not so gracefully. &lt;/P&gt;
&lt;P&gt;The problematic servers were not ending their chunked responses with the zero-length chunk and instead were simply terminating the TCP connection. The WinINet routine that processed these chunks was overlooking the possibility of an abrupt termination and was steadfastly waiting for the illusive zero-length chunk. Of course, this &lt;A href="http://connect.microsoft.com/WNDP/feedback/ViewFeedback.aspx?FeedbackID=133241"&gt;issue has been fixed in WinINet&lt;/A&gt; and is now publicly available with &lt;A href="http://www.microsoft.com/windows/ie/default.mspx"&gt;IE 7&lt;/A&gt; Beta 3 builds and newer. We have also engaged with the owners of the known sites, so that they could update their servers to be compliant. I recommend testing your web servers so that you are certain that your site is properly ending the chunked transfer. &lt;/P&gt;
&lt;P&gt;As always, I encourage everyone to continue to report potential bugs with Windows Core Networking technologies. The easiest and most direct way to submit bugs is via the Microsoft Networking Connect site at &lt;A href="http://connect.microsoft.com/networking"&gt;http://connect.microsoft.com/networking&lt;/A&gt;. Issues submitted via Microsoft Connect make it directly to our use in minutes. Nick Bradbury, thank you for bringing this issue to our attention. &lt;/P&gt;
&lt;P&gt;- Billy Anders&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=695821" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category></item><item><title>A bit about WinInet’s Index.dat – Q&amp;A</title><link>http://blogs.msdn.com/wndp/archive/2006/08/07/WinInet-Index-dat-Q-and-A.aspx</link><pubDate>Tue, 08 Aug 2006 02:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:691547</guid><dc:creator>wndpteam</dc:creator><slash:comments>10</slash:comments><comments>http://blogs.msdn.com/wndp/comments/691547.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=691547</wfw:commentRss><description>&lt;P&gt;In my &lt;A href="http://blogs.msdn.com/wndp/archive/2006/08/04/WinInet_Index_dat.aspx"&gt;previous post&lt;/A&gt; I tried to explain a bit about what the index.dat files are and what has changed in IE7/Windows Vista timeframe. The post got a couple questions that I'll attempt to answer here. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1) Mike: The real problem behind index.dat is that whether or not the indexes inside are still relevant or not, it keeps named urls forever. … As a user, I want to be able to turn on an hypothetical "auto-delete" of everything either anytime the web browser is restarted, or windows is restarted, or even on a schedule basis.&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;In IE7 and Windows Vista, deleted entries are actually zeroed out instead of just marked free till overwritten. There shouldn't be any residual URL names lying around if the entry was deleted. &lt;/P&gt;
&lt;P&gt;As for "Auto-Delete" we have very limited support to do this right now. I believe there is an option to delete the content cache on IE exit, but nothing that allows cleaning up all the stuff. I suggest that you vote for this &lt;A href="http://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=58023"&gt;suggestion&lt;/A&gt; and this &lt;A href="http://connect.microsoft.com/WNDP/feedback/ViewFeedback.aspx?FeedbackID=165237"&gt;suggestion&lt;/A&gt; and if they don't cover what you are looking for you can file your own on the &lt;A href="http://connect.microsoft.com/IE"&gt;IE feedback site&lt;/A&gt; and/or the &lt;A href="http://connect.microsoft.com/WNDP"&gt;WNDP Feedback site&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2) Jorrit: Why is the directory still called IE5? &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The cache directory is called Content.IE5 because we haven't changed the file format since IE5. The same is true for a lot of the registry settings. We have been tempted to change the file format a couple times, but there is always the cost of having to upgrade and potentially downgrade (on uninstall) and the benefits of changing the file format hasn't been worth the cost. So why not update the name but leave the file format alone? It is a smaller cost (yes, there is a cost, we would have to move the files on upgrade and downgrade) but there is no apparent benefit and the point of the AppData directory is to not be user facing. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3) Nicholas: Also, I remember there being issues with the index.dat becoming corrupted or full. This is what leads to the "right click-&amp;gt; view source -&amp;gt; nothing happens." bug, right?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Full is correct. Another manifestation of the same issue was the "Save Image" wanting to save a .bmp file. There are a number of features of IE and other programs that expect a file behind the cache entry, when the file isn't there they have to try something else. In the image case they give you the in memory bitmap version. With view source, they just give up. The root cause is that there are only so many entries that the index.dat file format can hold, and when this limited resource ran out of space, we weren't firing off the scavenger code to try to clear up some space. This has been fixed in IE7 and Windows Vista and maybe even on IE6, but you'll have to ask the IE team about that (lazy Ari…). &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; -- Ari Pernick&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=691547" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category></item><item><title>A bit about WinInet's Index.dat</title><link>http://blogs.msdn.com/wndp/archive/2006/08/04/WinInet-Index-dat.aspx</link><pubDate>Sat, 05 Aug 2006 01:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:688995</guid><dc:creator>wndpteam</dc:creator><slash:comments>19</slash:comments><comments>http://blogs.msdn.com/wndp/comments/688995.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=688995</wfw:commentRss><description>&lt;P&gt;Since a recent &lt;A href="http://digg.com/software/Microsoft_s_secret_record_of_every_website_visited_on_your_PC"&gt;digg article&lt;/A&gt; and its &lt;A href="http://en.wikipedia.org/wiki/Index.dat"&gt;underlying Wikipedia entry&lt;/A&gt; seems a little confused about index.dat, I’d like to give some more detail about what it is and what we have changed with it in IE7/Vista’s version of WinInet. As Jeffdav explained a &lt;A href="http://blogs.msdn.com/jeffdav/archive/2004/11/18/266027.aspx"&gt;while&lt;/A&gt; &lt;A href="http://blogs.msdn.com/jeffdav/archive/2004/11/18/266045.aspx"&gt;back&lt;/A&gt;, the index.dat file is a store for web related things; the URL content cache, cookies, RSS feeds, and visited links. Each of these collections, called a &lt;STRONG&gt;container&lt;/STRONG&gt;, has their own index.dat file that lives in the user profile. &lt;/P&gt;
&lt;P&gt;First, let’s talk a bit about these containers a bit more: &lt;/P&gt;
&lt;P&gt;On most machines the biggest and most important container is the URL content cache index.dat. It lives (on vista) at \Users\&amp;lt;user&amp;gt;\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\index.dat. Content such as pages and images that we fetch from the web and that are cacheable get placed into this cache until they expire. The rules for if it is cacheable and when the entries expire from the cache are complex enough to warrant its own blog posting, but the common reasons that content doesn’t go in the cache is due to the server telling us not to via response headers, or the user telling us to not save any SSL resources to disk via the “Do not save encrypted pages to disk” option in Internet Options-&amp;gt;Security-&amp;gt;Advanced. Each cache entry has the URL and a file name to allow us to quickly find previously retrieved URLs and serve that content out of the content container. If a user just deletes all the files in the directory, the index.dat file will still contain all the URLs and paths until we realize that the cache entry is missing the file, and should be deleted from the index.dat. &lt;/P&gt;
&lt;P&gt;The visited container is a listing of the URLs that you click on when web browsing, which is how IE can do URL auto completion and mark the links that you have visited a different color. This container is located on my vista box in \Users\&amp;lt;user&amp;gt;\AppData\Local\Microsoft\Windows\History\History.IE5\index.dat. Visited only needs to know about each URL once, since you have either visited the site or you haven’t. &lt;/P&gt;
&lt;P&gt;The history containers are a set of containers for the different date ranges that IE displays, like today, yesterday, last week, etc. These containers are in \Users\&amp;lt;user&amp;gt;\AppData\Local\Microsoft\Windows\History\History.IE5\MShist01&amp;lt;date&amp;gt;&amp;lt;date&amp;gt;\index.dat. Again top level links that you visit are stored in these containers. When the date shifts, IE does the bookkeeping often through merging these buckets. &lt;/P&gt;
&lt;P&gt;The cookie container maps the cookie URLs to individual cookie files. It is stored in \Users\&amp;lt;user&amp;gt;\AppData\Roaming\Microsoft\Windows\Cookies\index.dat. The index.dat contains the associated URL, path to the cookie data and other cookie metadata information. You might notice that unlike the other containers this container is under a path called Roaming. This has to do with a domain feature that copy around your preferences from machine to machine on a domain. Cookies are one of those types of settings. &lt;/P&gt;
&lt;P&gt;You might have also seen that starting in Vista almost all the containers have a Low\ directory with another index.dat. That is because these are specially marked directories that IE in &lt;A href="http://blogs.msdn.com/ie/archive/2006/02/09/528963.aspx"&gt;protected mode&lt;/A&gt; can access. We completely partition off IE between the protected mode and normal modes. By design, normal only accesses the normal cache, cookies, etc. and by design and OS protection, protected mode only accesses the Low\ versions. The “how” of this partitioning is talked about on &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ProtectedMode.asp"&gt;MSDN&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;It’s important to note that pretty much all modern web browsers has to store these types of data stores. Firefox (1.5.0.6 at least) uses different types of file formats for each of its index.dat equivalents but they are there. The equivalent of the cache container index.dat is in Users\&amp;lt;user&amp;gt;\AppData\Local\Mozilla\Firefox\Profiles\59kuzm1n.default\Cache with the _CACHE_* files. The other containers are in the Roaming version of the directory over in Users\&amp;lt;user&amp;gt;\AppData\Local\Mozilla\Firefox\Profiles\59kuzm1n.default\. The history and visited are probably combined into one container; history.dat and the cookies container is cookies.txt. &lt;/P&gt;
&lt;P&gt;There is one thing pretty special about WinInet and hence the index.dat files; they are OS components that many applications use, including explorer. That means that they were highly optimized for sharing data between processes. Each application’s copy of WinInet opens up the file for sharing read and write, but not for delete. As long as any program is using WinInet, the index.dat file can’t be deleted. If you could delete it, the applications actively using the file would probably crash or start corrupting data in memory. This also means that many applications leave their own footprints in the different containers. For Example: when Windows Music Player downloads an mp3 from the web from an URL, that file can end up in WinInet’s content cache. &lt;/P&gt;
&lt;P&gt;So what’s new in IE7? Well the first thing is that IE made the interface for clearing up these files much simpler with “&lt;A href="http://blogs.msdn.com/ie/archive/2006/01/12/512232.aspx"&gt;Cover My Tracks&lt;/A&gt;”. Under this idea WinInet made a bunch of improvements. The first improvement was in entry deletion. Those of you who remember the FAT file system on DOS might find the concepts behind this problem familiar. In DOS when you delete a file, the file is still around and special tools can undelete them &lt;STRONG&gt;unless&lt;/STRONG&gt; some new files have already written over the old files. The way we use to delete entries in the index.dat file was pretty similar, the old URL data was marked free, but was still there, at least until it was overwritten by a new entry. In IE7 we now zero out the entry. Another problem was that some applications (cough Outlook Express cough) would write temporary files, like attachments, into the cache file directory to allow other applications to open them. If the index.dat file didn’t know about the file, we wouldn’t clean it up. Now when you use the “Delete Files…” button we delete everything in the directory regardless of if it’s in index.dat or not. There is one more feature in this area that I should mention even though it is not new. When we attempt to delete an entry from the cache, but can’t delete the actual storage file, we will still remove the entry from index.dat and stick the file on a list of things to periodically try to clean up. &lt;/P&gt;
&lt;P&gt;Any Questions? &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-- Ari Pernick &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=688995" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category></item><item><title>WinINet and WinHTTP IPv6 Support in Web Proxy Auto-Discovery (WPAD) scripts enabled in Windows Vista</title><link>http://blogs.msdn.com/wndp/archive/2006/07/18/IPV6-WPAD-for-WinHttp-and-WinInet.aspx</link><pubDate>Wed, 19 Jul 2006 01:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:670242</guid><dc:creator>wndpteam</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/wndp/comments/670242.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=670242</wfw:commentRss><description>Hi, my name is Jonathan Silvera and I am the WinINet and WinHTTP Program Manager. Today I would like to talk to you about changes we have made to add IPv6 support in the WinINet and WinHTTP WPAD helper functions. 
&lt;P&gt;The explosion of the Internet in the late 1990’s has caused an unexpected scarcity of IPv4 addresses, with the pool depleting on a daily basis. IPv6 provides a solution to this problem and although it is currently not widely deployed, its use will definitely become more prevalent in the future. &lt;A href="http://www3.ietf.org/proceedings/99jul/I-D/draft-ietf-wrec-wpad-00.txt" mce_href="http://www3.ietf.org/proceedings/99jul/I-D/draft-ietf-wrec-wpad-00.txt"&gt;WPAD&lt;/A&gt; is a protocol that allows web clients to automatically detect what the correct proxy configuration should be for their outgoing traffic. This is very useful for corporate deployments because it allows IT administrators to setup complex scripts that can route traffic for all clients to specific proxies based on the target server the clients are attempting to connect to. WinINet and WinHTTP support WPAD helper functions as defined by the &lt;A href="http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html" mce_href="http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html"&gt;Navigator Proxy Auto-Config (PAC) File Format specification&lt;/A&gt;, which has become a defacto standard. Unfortunately this specification was written in 1996 and does not define what the function behaviors should be when a WPAD script is deployed in an IPv6 capable network. 
&lt;P&gt;Here at Microsoft we are aware that IPv6 is the wave of the future and as part of a Windows wide push, we have required that all of our components support dual stack (IPv4 and IPv6) and IPv6 only networks. The first customer to approach us asking for IPv6 support in WPAD was our internal IT department after encountering issues with the IPv4 script dependency of their current deployment. When designing a solution to enable this scenario for Windows Vista, our team recognized the importance of providing a backwards compatible solution for IT administrators in order to avoid breaking the large number of existing corporate deployments with IPv4 script dependencies. 
&lt;P&gt;In order to meet our customer’s needs and support IPv6 without affecting existing deployment, we have added 6 new helper class functions as an &lt;A href="http://blogs.msdn.com/wndp/articles/IPV6_PAC_Extensions_v0_9.aspx" mce_href="http://blogs.msdn.com/wndp/articles/IPV6_PAC_Extensions_v0_9.aspx"&gt;extension to the Navigator Proxy Auto-Config (PAC) File Format specification&lt;/A&gt; and also added a new IPv6 capable function called FindProxyForURLEx that administrators can implement in the WPAD script. 
&lt;H3&gt;New Proxy Helper API Definitons:&lt;/H3&gt;In order to take advantage of the IPv6 enabled functions, IT administrators must define within their WPAD script a function called FindProxyForURLEx (url, host) which will replace the legacy FindProxyForUrl (url, host) function. Only from the new FindProxyForURLEx function will administrators be able to execute the new functions. 
&lt;P&gt;We also attempted to simplify work for developers, by aligning our functions to return different types of IP addresses in the same order of preference as other networking components, specifically IPv6 addresses followed by IPv4 addresses (i.e. current behavior for Winsock’s getaddrinfo(..) function). 
&lt;P&gt;The following tables explain the differences between the new WPAD helper functions and the legacy WPAD helper functions. The new functions are marked with a * &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" width=461 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;&lt;B&gt;&lt;FONT size=2&gt;Functions&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;&lt;B&gt;&lt;FONT size=2&gt;Input&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;&lt;B&gt;&lt;FONT size=2&gt;Output&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=132&gt;&lt;B&gt;&lt;FONT size=2&gt;Reason for Change&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;
&lt;P&gt;&lt;FONT size=2&gt;dnsResolve&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;Host&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;IPv4 address&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=132 rowSpan=2&gt;
&lt;P&gt;&lt;FONT size=2&gt;Ex function will return a list of IPv6/IPv4. Necessary since IPv6 or IPv4 addresses can have multiple unicast addresses for a single interface&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;
&lt;P&gt;&lt;FONT size=2&gt;dnsResolveEx*&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;Host&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;List of IPv6/IPv4 addresses&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" width=461 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" width=149 112.1pt;&gt;&lt;B&gt;&lt;FONT size=2&gt;Functions&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;&lt;B&gt;&lt;FONT size=2&gt;Input&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;&lt;B&gt;&lt;FONT size=2&gt;Output&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=132&gt;&lt;B&gt;&lt;B&gt;&lt;FONT size=2&gt;Reason for change&lt;/FONT&gt;&lt;/B&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;
&lt;P&gt;&lt;FONT size=2&gt;isResolvable&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;IPv4 host&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;TRUE / FALSE&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=132 rowSpan=2&gt;
&lt;P&gt;&lt;FONT size=2&gt;The Ex function will return TRUE if a host can resolve to an IPv6 or IPv4 address. The legacy function only returns TRUE if the host resolves to an IPv4 address&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;
&lt;P&gt;&lt;FONT size=2&gt;isResolvableEx*&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;IPv6/IPv4 host&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;TRUE / FALSE&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" width=461 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;&lt;B&gt;&lt;FONT size=2&gt;Functions&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;&lt;B&gt;&lt;FONT size=2&gt;Input&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;&lt;B&gt;&lt;FONT size=2&gt;Output&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=132&gt;&lt;B&gt;&lt;B&gt;&lt;FONT size=2&gt;Reason for change&lt;/FONT&gt;&lt;/B&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;
&lt;P&gt;&lt;FONT size=2&gt;myIPAddress&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;none&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;IPv4 address&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=132 rowSpan=2&gt;
&lt;P&gt;&lt;FONT size=2&gt;Ex function will return a list of IPv6/IPv4. Necessary since IPv6 or IPv4 addresses can have multiple unicast addresses for a single interface&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;
&lt;P&gt;&lt;FONT size=2&gt;myIPAddressEx*&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;none&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;List of IPv6/IPv4 addresses&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" width=461 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;&lt;B&gt;&lt;FONT size=2&gt;Functions&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;&lt;B&gt;&lt;FONT size=2&gt;Input&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;&lt;B&gt;&lt;FONT size=2&gt;Output&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=132&gt;&lt;B&gt;&lt;FONT size=2&gt;Reason for change&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;
&lt;P&gt;&lt;FONT size=2&gt;isInNet&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;Host, &lt;BR&gt;Dot separated IP address pattern, &lt;BR&gt;IP address Mask&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;TRUE / FALSE&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=132 rowSpan=2&gt;
&lt;P&gt;&lt;FONT size=2&gt;Provide an IP version agnostic way to find if an IP address is in a given subnet. Also, the mask notation in IPv4 is deprecated.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;
&lt;P&gt;&lt;FONT size=2&gt;isInNetEx*&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;IP Address&lt;BR&gt;IP Prefix&lt;B&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;TRUE / FALSE&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" width=461 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" width=149 112.1pt;&gt;&lt;B&gt;&lt;FONT size=2&gt;Functions&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;&lt;B&gt;&lt;FONT size=2&gt;Input&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;&lt;B&gt;&lt;FONT size=2&gt;Output&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=132&gt;&lt;B&gt;&lt;B&gt;&lt;FONT size=2&gt;Reason for change&lt;/FONT&gt;&lt;/B&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;
&lt;P&gt;&lt;FONT size=2&gt;sortIPAddressList*&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;List of IPv6/IPv4 addresses&lt;B&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=90&gt;
&lt;P&gt;&lt;FONT size=2&gt;Sorted List of IPv6/IPv4 addresseslist of IPv6/IPv4 addresses&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=132&gt;
&lt;P&gt;&lt;FONT size=2&gt;There is no counterpart legacy function because legacy functions only returned a single IPv4 address, therefore there was no need to sort&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;
&lt;TABLE class="" width=462 border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;&lt;B&gt;&lt;FONT size=2&gt;Functions&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=91&gt;&lt;B&gt;&lt;FONT size=2&gt;Input&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=89&gt;&lt;B&gt;&lt;FONT size=2&gt;Output&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;
&lt;TD class="" width=133&gt;&lt;B&gt;&lt;FONT size=2&gt;Reason for change&lt;/FONT&gt;&lt;/B&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" width=149&gt;
&lt;P&gt;&lt;FONT size=2&gt;getClientVersion*&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=91&gt;
&lt;P&gt;&lt;FONT size=2&gt;None&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=89&gt;
&lt;P&gt;&lt;FONT size=2&gt;WPAD engine version number&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD class="" width=133&gt;
&lt;P&gt;&lt;FONT size=2&gt;Currently this function returns version 1.0. We added this function to allow IT administrators to update their WPAD to work with different versions of the WPAD engine without causing breaks to their existent deployment.&lt;B&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;Again, see the &lt;A href="http://blogs.msdn.com/wndp/articles/IPV6_PAC_Extensions_v0_9.aspx" mce_href="http://blogs.msdn.com/wndp/articles/IPV6_PAC_Extensions_v0_9.aspx"&gt;extension spec&lt;/A&gt; for more details.&lt;/P&gt;
&lt;P&gt;We are truly proud of our work extending the Navigator Proxy Auto-Config (PAC) File Format specification to work with IPv6 addresses while ensuring backwards compatibility, as we believe these changes will prove useful current and future IPv6 users. These changes are available for WinINet/WinHTTP in Windows Vista starting in Beta 2, for WinINet on XP and Windows 2003 through IE7 starting in Beta 2 and will be available in a future release of the .Net Framework’s system.net. We would love to hear feedback from the community regarding these changes and if you are planning to deploy a WPAD script in an IPv6 network please let us know about your experience. &lt;/P&gt;
&lt;P&gt;Thanks&lt;BR&gt;-Jonathan Silvera &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=670242" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category><category domain="http://blogs.msdn.com/wndp/archive/tags/WinHttp/default.aspx">WinHttp</category><category domain="http://blogs.msdn.com/wndp/archive/tags/IPV6/default.aspx">IPV6</category></item><item><title>Calling WinInet Asynchronously from managed code</title><link>http://blogs.msdn.com/wndp/archive/2006/07/18/Calling-WinInet-Async-from-Managed-Code.aspx</link><pubDate>Tue, 18 Jul 2006 23:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:670122</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/wndp/comments/670122.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=670122</wfw:commentRss><description>Hi, I’m Reymarx Gereda, SDET at the Networking Development Platform in the Windows team. Recently I saw a question in one of the MSDN forums about calling WinInet API from managed functions; this is something we did for testing the component, and here I want to share something we found when calling some of the WinInet APIs in an asynchronous fashion. I’ll talk about specifically of the use of InternetReadFile in this mode. I assume you understand the asynchronous behavior of WinInet and a basic knowledge of interacting with native components using PInvoke. 
&lt;P&gt;When calling functions in WinInet from managed code using PInvoke, you can map the buffer arguments to managed byte arrays (byte[]) and pass them to the functions without having to pin the memory used by those buffers. For example, for InternetReadFile, the native signature is as follows: &lt;/P&gt;&lt;PRE&gt;BOOL InternetReadFile(
  HINTERNET hFile,
  LPVOID lpBuffer,
  DWORD dwNumberOfBytesToRead,
  LPDWORD lpdwNumberOfBytesRead
);
 &lt;/PRE&gt;
&lt;P&gt;And the PInvoke declaration could look like this: 
&lt;P&gt;&lt;PRE&gt;[DllImport("WinInet", SetLastError = true, ExactSpelling = true)]
internal extern static bool InternetReadFile(
    IntPtr hFile, 
    byte[] buffer, 
    Int32 numberOfBytesToRead, 
    ref Int32 numberOfBytesRead
);
 &lt;/PRE&gt;
&lt;P&gt;This signature works really well in the synchronous case, since the marshaler takes care of pinning the memory used by the buffer for the duration of the function call. 
&lt;P&gt;For the asynchronous case, when the function returns ERROR_IO_PENDING, WinInet requires access, at the completion of the call, to the buffer passed in the function call; and it could happen that the memory location for buffer used in the function call, has changed due to the work of the garbage collector. In this case, you’re responsible for pinning the memory used by the buffer until the asynchronous call completes. In the case of InternetReadFile, WinInet needs to update the information inside the buffer and numberOfBytesRead parameters, hence the PInvoke declarations needs to be changed to: 
&lt;P&gt;&lt;PRE&gt;[DllImport("WinInet", SetLastError = true, ExactSpelling = true)]
internal extern static bool InternetReadFile(
    IntPtr hFile, 
    IntPtr buffer, 
    Int32 numberOfBytesToRead, 
    IntPtr numberOfBytesRead
);
 &lt;/PRE&gt;
&lt;P&gt;The change on the parameters type to IntPtr requires an additional overhead of pinning the memory used by this two variables and keeping them until the asynchronous call to the native API completes. To pin the memory, use the methods provided by the &lt;A href="http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices.marshal(VS.80).aspx"&gt;Marshal&lt;/A&gt; class; it also provides methods for dumping the content of the memory in a byte array, string or instance of a class/structure. 
&lt;P&gt;To use the Marshall class with the buffer passed to InternetReadFile, you can use something similar to this: 
&lt;P&gt;Remarks: To help illustrate the point, this code omits exception handling 
&lt;P&gt;&lt;PRE&gt;...
//At this point a request has been sent to the server 
//and we’re going to read the response’s entity body
Int32 buffsize = 1024;
Int32 bytes2Read = 1024;

//Pointers to use with the WinInet call
IntPtr bytesRead = Marshal.AllocHGlobal(sizeof(Int32));
IntPtr buff = Marshal.AllocHGlobal(buffsize);

//Variables to copy the data returned from WinInet
Int32 totalBytesRead = 0;
Int32 bytesNum = 0;
byte[] tempByteArray = new byte[buffsize];

//We’ll allocate the response in a MemoryStream object
MemoryStream memStream = new MemoryStream();

InternetReadFile(this.Handle, buff, bytes2Read, bytesRead);
//Verify if the call completed asynchronously 
// Marshal.GetLastWin32Error()==ERROR_IO_PENDING (997)
//And wait for the completion of the call
... //Perform some other operations while the call completes

//At the completion of the call 
//Extract the information from the buffer
bytesNum = Marshal.ReadInt32(bytesRead);
totalBytesRead += bytesNum;
Marshal.Copy(buff, tempByteArray, 0, bytesNum);
memStream.Write(tempByteArray, 0, bytesNum);

//Repeat the call to InternetReadFile until bytesNum==0

//At the end of the process, release the memory allocated
Marshal.FreeHGlobal(bytesRead);
Marshal.FreeHGlobal(buff);
 &lt;/PRE&gt;
&lt;P&gt;Using this approach you’ll ensure the appropriate behavior of the code, otherwise you could end with access violations or incomplete data inside the buffer. 
&lt;P&gt;For more information about the PInvoke wrappers, look at &lt;A href="http://www.PInvoke.net"&gt;http://www.PInvoke.net&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; -- Reymarx Gereda&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=670122" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category></item><item><title>Wanted: Developer feedback for our "Next Generation" client HTTP stack</title><link>http://blogs.msdn.com/wndp/archive/2006/06/06/619376.aspx</link><pubDate>Tue, 06 Jun 2006 22:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:619376</guid><dc:creator>wndpteam</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/wndp/comments/619376.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=619376</wfw:commentRss><description>As we&amp;nbsp;begin the&amp;nbsp;planning phase for our &lt;A HREF="/wndp/archive/2006/03/23/559468.aspx"&gt;"Next Generation" client&amp;nbsp;HTTP stack&lt;/A&gt;, we would love to hear from developers using our existing APIs (WinINet and WinHTTP). Please help us understand what your experience has been so far and what you would like to see in any future releases by filling out &lt;A href="https://connect.microsoft.com/WNDP/Survey/Survey.aspx?SurveyID=1188"&gt;this survey&lt;/FONT&gt;&lt;/A&gt;. 
&lt;P&gt;Thanks&lt;/P&gt;
&lt;P&gt;&amp;nbsp;-Jonathan Silvera&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=619376" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category><category domain="http://blogs.msdn.com/wndp/archive/tags/WinHttp/default.aspx">WinHttp</category><category domain="http://blogs.msdn.com/wndp/archive/tags/Post+Vista+HTTP+Client/default.aspx">Post Vista HTTP Client</category></item><item><title>WNDP Connect Site gets an upgrade!</title><link>http://blogs.msdn.com/wndp/archive/2006/06/06/619215.aspx</link><pubDate>Tue, 06 Jun 2006 19:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:619215</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/wndp/comments/619215.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=619215</wfw:commentRss><description>&lt;P&gt;Last year we &lt;A href="/wndp/archive/2005/10/30/487124.aspx"&gt;setup&lt;/A&gt; a &lt;A href="/wndp/archive/2005/09/27/474679.aspx"&gt;small site&lt;/A&gt; on connect.microsoft.com in order to let our blog&amp;nbsp;readers, developers and users file bugs, make suggestions and get some conntent like whitepapers and samples early. The downside to the site was that you couldn't easily deep link and it required a Windows Live (aka Passport) login. Well the folks at connect.microsoft.com have launched a new version of connect that enables access to much of the site without a login including &lt;A href="https://connect.microsoft.com/WNDP/Feedback"&gt;readonly access to the bugs&lt;/A&gt; filled there much like the popular &lt;A href="http://lab.msdn.microsoft.com/productfeedback/"&gt;MSDN Product Feedback Center&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Check it out: &lt;A href="http://connect.microsoft.com/WNDP"&gt;http://connect.microsoft.com/WNDP&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Ari Pernick&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=619215" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/Winsock/default.aspx">Winsock</category><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category><category domain="http://blogs.msdn.com/wndp/archive/tags/WinHttp/default.aspx">WinHttp</category><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category><category domain="http://blogs.msdn.com/wndp/archive/tags/Http.sys/default.aspx">Http.sys</category></item><item><title>TLS enabled by default in IE 7.0 and WinINet</title><link>http://blogs.msdn.com/wndp/archive/2006/04/12/tls-enabled-by-default.aspx</link><pubDate>Wed, 12 Apr 2006 22:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:575148</guid><dc:creator>wndpteam</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/wndp/comments/575148.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=575148</wfw:commentRss><description>&lt;FONT size=2&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;Transport Layer Security (“TLS”) and Secure Sockets Layer (“SSL”) are transport-layer protocols for server and client authentication, data encryption, and data integrity of application layer protocols such as HTTP, SMTP, and FTP.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In order to provide a more secure experience, Microsoft is enabling TLS and extensions by default in Internet Explorer 7.0 and WinINet.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Starting with Windows Vista, Schannel - the Security Support Provider (SSP), which implements TLS 1.0, will send “Extensions” during SSL/TLS protocol negotiation.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The negotiation of the best common protocol occurs automatically between hosts.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;However, if needed, users can toggle TLS and Extensions in the “Advanced” tab of the “Internet Options” dialog.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;We do not supply a mechanism for toggling Extensions independently of TLS.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;The reason that we have enabled TLS Extensions (aka SSLv3.1) in Windows Vista by default is that TLS provides a number of enhancements beyond SSLv3.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Some of the benefits of TLS include:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l2 level1 lfo3; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;TLS is an IETF standard.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l2 level1 lfo3; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;TLS provides more secure hashes through its use of the HMAC algorithm instead of the SSL MAC algorithm.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l2 level1 lfo3; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;TLS adds a number of new alert messages.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l2 level1 lfo3; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;TLS allows the use of an intermediary authority.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l2 level1 lfo3; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;TLS support “extensions”, an RFC-specified mechanism for extending the protocol with additional functionality.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l2 level1 lfo3; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;TLS supports AES and Elliptic Curve Cryptography-based (ECC) cipher suites&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;Although the SSLv3 and TLSv1 protocols differ only slightly, they are not interchangeable.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Client and server must agree on which protocol, version, and extensions to use during the protocol negotiation phase.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;This negotiation happens transparently between the client and server – with TLS backing-off to SSLv3 when both parties do not claim support for TLS. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;Over the years, the IETF has expanded TLS beyond its original RFC &lt;A href="http://www.ietf.org/rfc/rfc2246.txt"&gt;2246&lt;/A&gt; to include support for Extensions and additional cipher suites such as AES, Kerberos and ECC.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The extensions to TLS 1.0, defined in RFC &lt;A href="http://www.ietf.org/rfc/rfc3546.txt"&gt;3546&lt;/A&gt;, provide additional behaviors beyond what the original drafters of RFC 2246 envisioned, such as:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;IETF has added cipher suites that rely on algorithms beyond the original RC2, RC4, IDEA, DES and 3DES to the TLS protocol.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;IETF has added support for virtual hosting of HTTPS websites on a single IP address/port with the “server_name” extension.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;With “server_name”, the client sends the hostname during its “extended” Client Hello to the server.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;This allows the TLS server to select the appropriate server certificate for the client. This is similar in capabilities brought on by the host-header requirement of HTTP/1.1. (server_name extension)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;IETF has added support for client certificate URLs.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Client Certificate URLs allow the client to tell the server to “go” to a particular URL for the client’s certificate, which helps in network-constrained environments, e.g. mobile phone. (client_certificate_url extension)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;IETF allows for MAC truncation which helps in bandwidth constrained environments by allowing the use of an 80-bit (10 byte) truncated HMAC. (truncated_hmac extension)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;RFC 3546 also added support for the certificate status extension (e.g. via OCSP) which allows the server to send revocation state of the server certificate to the client.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;Although the vast majority of modern web servers behave correctly when receiving a handshake containing TLS 1.0 extensions, some web servers do not respond in the RFC required manner when support does not exist for extensions.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;RFCs for TLS require that servers simply ignore extensions that appear in the “client hello” message that they do not support, which effectively disables those extensions for the session.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;During our testing using tools like Microsoft Network Monitor (“netmon”), we learned that servers that do not understand TLS + extensions may respond incorrectly in one of three ways:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL style="MARGIN-TOP: 0in" type=1&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l3 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;The server replies with a message that specifies that there was an invalid handshake;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l3 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;The server unexpectedly resets the TCP connection; or&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l3 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;The server ignores the request and does not respond, which keeps the connection open past the WinINet 30 second connection timeout&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;TLS requires that a server ignore unsupported or unfamiliar extension requests.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The client will know that the server does not support the particular extensions when it receives the “server hello” without the extensions it requested in the response. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;With an invalid handshake response (#1), we back-off and try SSLv3.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Helping the problematic servers in cases of a TCP RST or timeout is not possible because these responses (or lack of) are not clear indicators of a problem with TLS extensions. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;We want to be sure that help the TLS ecosystem and encourage web server creators and site owners to take advantage of the benefits offered by TLS extensions.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Masking of these problems does little to help with adoption, in addition:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL style="MARGIN-TOP: 0in" type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo4; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;Interpreting a TCP reset from the server as a faulty TLS extension server is unacceptable because TCP resets can occur for other, non-TLS related, reasons such as an overloaded web server, proxy server, or firewall;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo4; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;Interpreting a lack of response as an issue with TLS extensions is also not the answer.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Network congestion anywhere along the route could be the real issue.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;We decided that the best solution is to combine smart engineering with proactive communications.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;This means that IE7 and WinINet will simply scale-back and attempt to use SSLv3 when enabled in Internet Options whenever we receive an invalid handshake message from a server.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;For proactive communications, the Internet Explorer team is working with the known web servers and site owners to ensure that their site properly handles the TLS 1.0 extensions.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-bidi-font-family: Tahoma"&gt;- &lt;?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /&gt;&lt;st1:PersonName w:st="on"&gt;Billy Anders&lt;/st1:PersonName&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=575148" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category></item><item><title>WinINet ETW Tracing Support in Windows Vista</title><link>http://blogs.msdn.com/wndp/archive/2006/03/28/wininet-etw-tracing-support-in-windows-vista.aspx</link><pubDate>Wed, 29 Mar 2006 06:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:563642</guid><dc:creator>wndpteam</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/wndp/comments/563642.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=563642</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Tahoma&gt;&lt;FONT size=2&gt;In order to enhance debugging of wininet.dll for application developers, Microsoft has added ETW tracing support for this component. The feature will be available beginning with Windows Vista Beta 2 builds. &lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT face=Tahoma&gt;&lt;FONT size=2&gt;To use the feature, wininet.dll users should open a command prompt window with elevated privileges: &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-LEFT: 1in; TEXT-INDENT: -0.5in; mso-list: l0 level1 lfo1; tab-stops: 9.0pt"&gt;&lt;FONT face=Tahoma&gt;&lt;FONT size=2&gt;&lt;SPAN style="mso-list: Ignore"&gt;1.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&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;/SPAN&gt;&lt;/SPAN&gt;Click the Start button, point to All Programs, and then click Accessories.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-LEFT: 1in; TEXT-INDENT: -0.5in; mso-list: l0 level1 lfo1; tab-stops: 9.0pt"&gt;&lt;FONT face=Tahoma&gt;&lt;FONT size=2&gt;&lt;SPAN style="mso-list: Ignore"&gt;2.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&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;/SPAN&gt;&lt;/SPAN&gt;Right-click Command Prompt, and then click Run Elevated or Run as administrator &lt;SPAN style="mso-bidi-font-weight: bold"&gt;(depending on what &lt;?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /&gt;&lt;st1:place w:st="on"&gt;Vista&lt;/st1:place&gt; build you are running)&lt;/SPAN&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;FONT face=Tahoma size=2&gt;Initialize WinINet tracing:&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style="COLOR: black"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma&gt;&lt;I&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-bidi-font-weight: bold"&gt;&lt;FONT face=Tahoma&gt;logman start "wininettrace”&amp;nbsp; -p “microsoft-windows-wininet” –o “wininettrace.etl” –ets&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;FONT face=Tahoma&gt;This command will initialize the ETW framework for WinINet tracing, using wininettrace.etl as the output file for trace data.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 12pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;FONT face=Tahoma size=2&gt;Log Events:&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 12pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto"&gt;&lt;SPAN&gt;&lt;FONT face=Tahoma&gt;&lt;FONT size=2&gt;Run IE or an application that exercises the WinINet APIs&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN&gt;Stop tracing: &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;I&gt;&lt;SPAN style="COLOR: black; mso-bidi-font-weight: bold"&gt;&lt;FONT face=Tahoma size=2&gt;logman stop “wininettrace” -ets&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;I&gt;&lt;SPAN style="COLOR: black; mso-bidi-font-weight: bold"&gt;&lt;/SPAN&gt;&lt;/I&gt;&lt;SPAN style="COLOR: black"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;FONT face=Tahoma size=2&gt;&lt;SPAN&gt;Create a human readable (xml) log file: &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;FONT face=Tahoma size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;FONT face=Tahoma&gt;&lt;FONT size=2&gt;&lt;I&gt;&lt;SPAN style="COLOR: black; mso-bidi-font-weight: bold"&gt;tracerpt “wininettrace.etl” –y –o “wininetracelog.xml” –of xml&lt;/SPAN&gt;&lt;/I&gt;&lt;SPAN style="COLOR: black"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;FONT face=Tahoma size=2&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"&gt;&lt;FONT face=Tahoma color=#000000&gt;This command will generate an XML log file called&amp;nbsp;wininetracelog.xml that contains the WinINet events logged.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: 14.4pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;o:p&gt;&lt;FONT face=Tahoma color=#000000 size=2&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;FONT face=Tahoma color=#000000&gt;&amp;nbsp;--Jonathan Silvera&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=563642" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/WinINet/default.aspx">WinINet</category></item></channel></rss>