<?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</title><link>http://blogs.msdn.com/b/wndp/</link><description>Windows Core Networking APIs and technologies such as Winsock, TCP/IP stack, WFP, IPsec, IPv6, WSK, WinINet, Http.sys, WinHttp, QoS, and System.Net

</description><dc:language>en-US</dc:language><generator>Telligent Community 5.6.583.20496 (Build: 5.6.583.20496)</generator><item><title>Final version of Windows Web Services API for Windows XP, Vista, Server 2003 and Server 2008 is now available!</title><link>http://blogs.msdn.com/b/wndp/archive/2009/10/09/final-version-of-windows-web-services-api-for-windows-xp-vista-server-2003-and-server-2008-is-now-available.aspx</link><pubDate>Fri, 09 Oct 2009 23:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9905600</guid><dc:creator>Ari B. Pernick</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=9905600</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2009/10/09/final-version-of-windows-web-services-api-for-windows-xp-vista-server-2003-and-server-2008-is-now-available.aspx#comments</comments><description>&lt;P&gt;The final version of the Windows Web Services API for Windows XP, Windows Vista, Windows Server 2003 and Windows Server 2008 is now available. This version corresponds to the final version of the WWSAPI released as part of Windows 7 and Windows Server 2008 R2. To develop for this version of the runtime, you need to install &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505&amp;amp;displaylang=en"&gt;Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1&lt;/A&gt;. Please make sure to regenerate all code using the new version of wsutil.exe tool. You will also need to rebuild all source code that used any of the pre-released versions of this API. &lt;/P&gt;
&lt;P&gt;This release is available in 25 languages: Arabic, Chinese - Hongkong, Chinese - Simplified, Chinese - Traditional, Czech, Danish, Dutch, English, Finnish, French, German, Greek, Hebrew, Hungarian, Italian, Japanese, Korean, Norwegian , Polish, Portuguese (Brazil), Portuguese (Portugal), Russian, Spanish, Swedish, Turkish. The table below summarizes CPU architectures and the minimal level of Service Packs supported by this release. Make sure to deploy the latest service pack and all critical updates for the version of Windows to computers on which you plan to install this release. To find recent security updates, visit &lt;A href="http://windowsupdate.microsoft.com/" mce_href="http://windowsupdate.microsoft.com/"&gt;Windows Update&lt;/A&gt;. &lt;/P&gt;
&lt;DIV style="TEXT-ALIGN: center"&gt;
&lt;TABLE style="BORDER-COLLAPSE: collapse" border=0&gt;
&lt;COLGROUP&gt;
&lt;COL style="WIDTH: 159px"&gt;
&lt;COL style="WIDTH: 108px"&gt;
&lt;COL style="WIDTH: 96px"&gt;
&lt;COL style="WIDTH: 90px"&gt;
&lt;COL style="WIDTH: 102px"&gt;&lt;/COLGROUP&gt;
&lt;TBODY vAlign=top&gt;
&lt;TR style="BACKGROUND: #daeef3; HEIGHT: 20px"&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: #a5a5a5 1pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: #a5a5a5 1pt solid; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;STRONG&gt;&amp;nbsp;Windows Version&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: #a5a5a5 1pt solid; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;STRONG&gt;Service Pack&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: #a5a5a5 1pt solid; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;STRONG&gt;x86&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: #a5a5a5 1pt solid; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;STRONG&gt;x64&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: #a5a5a5 1pt solid; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;&lt;STRONG&gt;ia64&lt;/STRONG&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="HEIGHT: 31px"&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: #a5a5a5 1pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P&gt;&lt;SPAN style="COLOR: black"&gt;Windows XP &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P&gt;&lt;SPAN style="COLOR: black"&gt;SP3 &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d7e4bc; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;Yes &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d6e3bc; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;Yes &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d99594; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;No &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="HEIGHT: 31px"&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: #a5a5a5 1pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P&gt;&lt;SPAN style="COLOR: black"&gt;Windows Server 2003 &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P&gt;&lt;SPAN style="COLOR: black"&gt;SP2, R2 SP2 &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d7e4bc; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;Yes &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d7e4bc; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;Yes &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d7e4bc; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;Yes &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="HEIGHT: 28px"&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: #a5a5a5 1pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P&gt;&lt;SPAN style="COLOR: black"&gt;Windows Vista &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P&gt;&lt;SPAN style="COLOR: black"&gt;SP1 &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d7e4bc; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;Yes &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d7e4bc; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;Yes &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d99594; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;No &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR style="HEIGHT: 31px"&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: #a5a5a5 1pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P&gt;&lt;SPAN style="COLOR: black"&gt;Windows Server 2008 &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P&gt;&lt;SPAN style="COLOR: black"&gt;SP1 &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d7e4bc; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;Yes &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d7e4bc; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;Yes &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: #a5a5a5 1pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BACKGROUND: #d7e4bc; BORDER-TOP: medium none; BORDER-RIGHT: #a5a5a5 1pt solid"&gt;
&lt;P style="TEXT-ALIGN: center"&gt;&lt;SPAN style="COLOR: black"&gt;Yes &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P&gt;In contrast to the past pre-released version of this API, this final version release can be used in production code and redistributed with the final versions of the product. Because of this, the final version is only available to companies who agree to terms of Windows Master Redistribution License Agreement (MRLA). To acquire the redistributable installers for this release and a copy of the Windows MRLA for review, please email a formal request to &lt;A href="mailto:wwsredst@microsoft.com" mce_href="mailto:wwsredst@microsoft.com"&gt;wwsredst@microsoft.com&lt;/A&gt;. In your email, please include a brief description of your plans for using this release and the business contact information for your company using which you can be reached at later on. If you have questions about this release, please email them to &lt;A href="mailto:wwsredst@microsoft.com" mce_href="mailto:wwsredst@microsoft.com"&gt;wwsredst@microsoft.com&lt;/A&gt;. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9905600" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/WebServices/">WebServices</category></item><item><title>Why didn’t my cached content revalidate to the web server? (IE8 edition)</title><link>http://blogs.msdn.com/b/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>Ari B. Pernick</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=9820584</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2009/07/06/why-didn-t-my-cached-content-revalidate-to-the-web-server-ie8-edition.aspx#comments</comments><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/b/wndp/archive/tags/WinINet/">WinINet</category></item><item><title>HTTP Connection Management</title><link>http://blogs.msdn.com/b/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>Ari B. Pernick</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=9597273</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2009/05/08/http-connection-management.aspx#comments</comments><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/b/wndp/archive/tags/WinINet/">WinINet</category><category domain="http://blogs.msdn.com/b/wndp/archive/tags/WinHttp/">WinHttp</category></item><item><title>QoS Traffic Generator Example Usage</title><link>http://blogs.msdn.com/b/wndp/archive/2009/05/07/qos-traffic-generator-example-usage.aspx</link><pubDate>Fri, 08 May 2009 02:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9595311</guid><dc:creator>Ari B. Pernick</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=9595311</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2009/05/07/qos-traffic-generator-example-usage.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update: This tool is no longer available on Microsoft Connect and there is no replacement download site.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;In my &lt;a href="http://blogs.msdn.com/wndp/archive/2009/04/30/qos-traffic-generator-is-now-available-on-connect.aspx"&gt;last post&lt;/a&gt;, I announced the availability of QoS Traffic Generator on Microsoft Connect. In order to help you understand the usage of this tool, I have provided some examples of what it can do.&lt;/p&gt;
&lt;p&gt;One of the most common tasks is to send traffic from one computer to another. The following example sends UDP traffic at 5 Mbps for 10 seconds.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Source&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -source -udp -dest 192.168.1.100 -throttle 5000000 &lt;br /&gt;                      -duration 10
Parsing command line...
WSAStartup successful.
Time between each packet (microsec): 2400
Size of each packet: 1472
Statistics sampling interval (msec): 1000
Sending traffic at 5.00 Mbps to 192.168.1.100:9999
Date, Time, Packets received, Bytes received (headers included), Elapsed time (msec), Throughput (Kbps), Bottleneck BW, Available BW, RTT, BBSet, ABSet, RTTSet, ErrorCode
05/07/2009, 23:06:54, 421, 631500, 1014, 4982.249,,,,,,,
05/07/2009, 23:06:55, 422, 633000, 1014, 4994.083,,,,,,,
05/07/2009, 23:06:56, 423, 634500, 1014, 5005.917,,,,,,,
05/07/2009, 23:06:57, 422, 633000, 1014, 4994.083,,,,,,,
05/07/2009, 23:06:58, 423, 634500, 1014, 5005.917,,,,,,,
05/07/2009, 23:06:59, 422, 633000, 1014, 4994.083,,,,,,,
05/07/2009, 23:07:00, 423, 634500, 1014, 5005.917,,,,,,,
05/07/2009, 23:07:01, 422, 633000, 1014, 4994.083,,,,,,,
05/07/2009, 23:07:02, 423, 634500, 1014, 5005.917,,,,,,,
Time has elapsed, or CTRL+C has been pressed.
Stopping Source traffic, waiting 5 sec.
SenderThread is exiting...
SenderThread exited successfully.
WSACleanup successful.&lt;/pre&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Sink&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -sink -udp
Parsing command line...
Listening on all IP addresses.
WSAStartup successful.
Waiting for UDP traffic on port 9999, hit CTRL+C to exit...
WSARecvFrom completed.
Date, Time, Packets received, Bytes received (headers included), Elapsed time (msec), Throughput (Kbps), Message
05/07/2009, 23:06:54, 421, 631500, 1014, 4982.249,
05/07/2009, 23:06:55, 422, 633000, 1014, 4994.083,
05/07/2009, 23:06:56, 423, 634500, 1014, 5005.917,
05/07/2009, 23:06:57, 422, 633000, 1014, 4994.083,
05/07/2009, 23:06:58, 423, 634500, 1014, 5005.917,
05/07/2009, 23:06:59, 422, 633000, 1014, 4994.083,
05/07/2009, 23:07:00, 423, 634500, 1014, 5005.917,
05/07/2009, 23:07:01, 422, 633000, 1014, 4994.083,
05/07/2009, 23:07:02, 423, 634500, 1014, 5005.917,&lt;/pre&gt;
&lt;p&gt;You can see the throughput in Kbps from the last column, along with other information such as timestamp and bytes received. The QoS Traffic Generator can also support multiple TCP connections from one sink. The next example shows two TCP flows, one using qWave and one using TC (used to throttle traffic) sending to the same destination.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Source 1&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -source -tcp -dest 192.168.1.100 -throttle 1000000 -qwave
Parsing command line...
qWave traffic type: Best effort
qWave flow type: non-adaptive.
qWave LLTD option: system choice.
qWave flow fundamentals: do not display
WSAStartup successful.
qWave started up successfully.
Send interval: not used, packets will be sent as fast as possible
Packets to send per interval: 1
Size of each packet: 1000
Statistics sampling interval (msec): 1000
Sending traffic at 1.00 Mbps to 192.168.1.100:9999
Date, Time, Packets received, Bytes received, Elapsed time (msec), Throughput (Kbps), Bottleneck BW, Available BW, RTT, BBSet, ABSet, RTTSet, ErrorCode
05/07/2009, 23:02:04, 129, 125000, 1014, 986.193,,,,,,,
05/07/2009, 23:02:05, 126, 126000, 1014, 994.083,,,,,,,
05/07/2009, 23:02:06, 125, 125000, 1014, 986.193,,,,,,,
05/07/2009, 23:02:07, 126, 126000, 1014, 994.083,,,,,,,
05/07/2009, 23:02:08, 124, 124000, 1014, 978.304,,,,,,,
05/07/2009, 23:02:09, 127, 127000, 1015, 1000.985,,,,,,,
05/07/2009, 23:02:10, 125, 125000, 1014, 986.193,,,,,,,
05/07/2009, 23:02:11, 126, 126000, 1014, 994.083,,,,,,,
05/07/2009, 23:02:12, 125, 125000, 1014, 986.193,,,,,,,
05/07/2009, 23:02:14, 124, 124000, 1014, 978.304,,,,,,,
05/07/2009, 23:02:15, 126, 126000, 1014, 994.083,,,,,,,
05/07/2009, 23:02:16, 127, 127000, 1014, 1001.972,,,,,,,
05/07/2009, 23:02:17, 125, 125000, 1014, 986.193,,,,,,,
05/07/2009, 23:02:18, 124, 124000, 1014, 978.304,,,,,,,
ERROR: 64 in GetQueuedCompletionStatus: The specified network name is no longer &lt;br /&gt;available.
SenderThread is exiting...
SenderThread exited successfully.
Stopping Source traffic, waiting 5 sec.
SenderThread exited successfully.
WSACleanup successful.&lt;/pre&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Source 2&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -source -tcp -dest 192.168.1.100 -throttle 2000000 -tc 40,4
Parsing command line...
WSAStartup successful.
Send interval: not used, packets will be sent as fast as possible
Packets to send per interval: 1
Size of each packet: 1000
Statistics sampling interval (msec): 1000
Sending traffic at 2.00 Mbps to 192.168.1.100:9999
Date, Time, Packets received, Bytes received, Elapsed time (msec), Throughput (Kbps), Bottleneck BW, Available BW, RTT, BBSet, ABSet, RTTSet, ErrorCode
05/07/2009, 23:01:59, 498, 498000, 1014, 3928.994,,,,,,,
05/07/2009, 23:02:00, 248, 248000, 1014, 1956.607,,,,,,,
05/07/2009, 23:02:01, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:02, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:03, 252, 252000, 1014, 1988.166,,,,,,,
05/07/2009, 23:02:04, 247, 247000, 1014, 1948.718,,,,,,,
05/07/2009, 23:02:05, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:07, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:08, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:09, 247, 247000, 1014, 1948.718,,,,,,,
05/07/2009, 23:02:10, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:11, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:12, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:13, 252, 252000, 1014, 1988.166,,,,,,,
05/07/2009, 23:02:14, 250, 250000, 1014, 1972.387,,,,,,,
05/07/2009, 23:02:15, 252, 252000, 1014, 1988.166,,,,,,,
05/07/2009, 23:02:16, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:17, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:18, 247, 247000, 1014, 1948.718,,,,,,,
ERROR: 64 in GetQueuedCompletionStatus: The specified network name is no longer &lt;br /&gt;available.
SenderThread is exiting...
SenderThread exited successfully.
Stopping Source traffic, waiting 5 sec.
SenderThread exited successfully.
WSACleanup successful.&lt;/pre&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Sink&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -sink -tcp
Parsing command line...
Listening on all IP addresses.
WSAStartup successful.
Waiting for TCP traffic on port 9999, hit CTRL+C to exit...
AcceptEx has successfully completed.
Overlapped AcceptEx signaled.
Connection received: ::ffff:157.59.28.243:56677 --&amp;gt; ::ffff:192.168.1.100:9999
Date, Time, Packets received, Bytes received, Elapsed time (msec), Throughput (Kbps), Message
05/07/2009, 23:01:59, 498, 498000, 1014, 3928.994,
05/07/2009, 23:02:00, 248, 248000, 1014, 1956.607,
05/07/2009, 23:02:01, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:02, 251, 251000, 1014, 1980.276,
Overlapped AcceptEx signaled.
Connection received: ::ffff:157.59.28.243:56678 --&amp;gt; ::ffff:192.168.1.100:9999
Date, Time, Packets received, Bytes received, Elapsed time (msec), Throughput (Kbps), Message
AcceptEx has successfully completed.
05/07/2009, 23:02:03, 252, 252000, 1014, 1988.166,
05/07/2009, 23:02:04, 129, 125000, 1014, 986.193,
05/07/2009, 23:02:04, 247, 247000, 1014, 1948.718,
05/07/2009, 23:02:05, 126, 126000, 1014, 994.083,
05/07/2009, 23:02:05, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:06, 125, 125000, 1014, 986.193,
05/07/2009, 23:02:07, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:07, 126, 126000, 1014, 994.083,
05/07/2009, 23:02:08, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:08, 124, 124000, 1014, 978.304,
05/07/2009, 23:02:09, 247, 247000, 1014, 1948.718,
05/07/2009, 23:02:09, 127, 127000, 1015, 1000.985,
05/07/2009, 23:02:10, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:10, 125, 125000, 1014, 986.193,
05/07/2009, 23:02:11, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:11, 126, 126000, 1014, 994.083,
05/07/2009, 23:02:12, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:12, 125, 125000, 1014, 986.193,
05/07/2009, 23:02:13, 252, 252000, 1014, 1988.166,
05/07/2009, 23:02:14, 124, 124000, 1014, 978.304,
05/07/2009, 23:02:14, 250, 250000, 1014, 1972.387,
05/07/2009, 23:02:15, 126, 126000, 1014, 994.083,
05/07/2009, 23:02:15, 252, 252000, 1014, 1988.166,
05/07/2009, 23:02:16, 127, 127000, 1014, 1001.972,
05/07/2009, 23:02:16, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:17, 125, 125000, 1014, 986.193,
05/07/2009, 23:02:17, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:18, 124, 124000, 1014, 978.304,
05/07/2009, 23:02:18, 247, 247000, 1014, 1948.718,
Event set, thread exiting.
Receive thread exiting.
ReceiverThread exited successfully.
Control Event or Stop() called. TCP receive thread is exiting.
Main receive thread exited successfully.
WSACleanup successful.&lt;/pre&gt;
&lt;p&gt;The sink prints out statistics from both sources and was stopped using CTRL+C after about 20 seconds. Both traffic sources then exit gracefully. A full list of options is shown below.&lt;/p&gt;
&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -?
Parsing command line...
Need to specify -source or -sink flag.

QoS Traffic Generator (Daytona), v. 1.0

Usage:

Sink: qostraffic -sink -tcp/-udp/-tcp_a &lt;br /&gt;                 [-dest destIP,destPort -local localIP,localPort] ...
Source: qostraffic -source -tcp/-udp/-tcp_a -dest destIP,destPort &lt;br /&gt;                   -throttle rate&lt;br /&gt;                   [-local localIP,localPort -duration sec] ...

Sink flags:
-tcp/-udp       Listens for TCP/UDP traffic
                default: listens on all addresses, port 9999
-tcp_a          Connects to source and then begins receiving traffic
                Source must also specify -tcp_a flag
                Note: start the source first, then the sink
-dest           OPTIONAL
                Destination address to connect to for -tcp_a
                Ignored for -tcp/-udp cases
-local          OPTIONAL
                Listens on specific local address/port
                default port: 9999
                Note: Can specify different port to listen on with,&lt;br /&gt;                      localPort only.
-qwave          OPTIONAL
                Starts up qWave service.
                Used for adaptive flows from the source.
-noconsole      OPTIONAL
                Suppresses console output
                default is not suppressed
Source flags:
-tcp/-udp       Listens for TCP/UDP traffic
-tcp_a          Accepts connection from sink then sends traffic
                Sink must also specify -tcp_a flag
                Note: start the source first, then the sink
-dest           Send traffic to destination address/port
                default port: 9999
                Note: ignored for -tcp_a case
-throttle       Throttles traffic at specified rate (bits/sec)
-pull           OPTIONAL
                Operates the source in pull mode.
                Note: supported for TCP traffic only.
-local          OPTIONAL
                Send traffic from specified local address/port
                default port: 9999
                Note: for -tcp_a case, this is the local address to &lt;br /&gt;                      listen on
-duration       OPTIONAL
                Send traffic for specified time (sec)
                default: infinite
-stats          OPTIONAL
                Prints out statistics for specified time (msec)
                default: 1000 msec
                minimum: 200 msec
-qwave          OPTIONAL
                Uses qWave with the specified options (all optional)
                &lt;traffictype&gt;,&lt;adaptive&gt;,&lt;lltd&gt; trafficType: traffic type defined by QoS subsystem BE - best effort (default) BCK - background EE - excellent effort AV - audio/video VO - voice CTRL - control adaptive: force use adaptive flow default is nonadaptive lltd: force use LLTD packets default lets system choose LLTD or not flowfund: prints out QueryFlowFundamentals prints bandwidth estimations every 25 ms only supported when using adaptive flows EXAMPLE: -qwave AV,LLTD -server Optional, when used with qWave will prevent doing &lt;br /&gt; QOSStartTracking/QOSStopTracking Note: conflicts with -tc flag. -tc OPTIONAL Uses TC with the specified options (all optional) &lt;dscp&gt;,&amp;lt;1p&amp;gt; dscp: DSCP value ranging from 0 to 63 default lets system choose 1p: 802.1p tag ranging from 0 to 7 default lets system choose Specifying -1 for either value is equivalent to &lt;br /&gt; default. EXAMPLE: -tc 40,4 Note: conflicts with -qwave flag. Must be run as &lt;br /&gt; admin. -packet OPTIONAL Performs packet experiments with given options (all &lt;br /&gt; required) &lt;size&gt;,&lt;num&gt;,&lt;interval&gt; size - size of each packet in bytes num - number of packets to send interval - time between each send in ms EXAMPLE: -packet 59,50,100 This will send a 59 byte packet every 100 ms, 50 &lt;br /&gt; times total. Note: packets can be tagged by using -tc options. -log OPTIONAL Logs to the specified file default filename: is "daytona_&lt;timestamp&gt;.txt" -noconsole OPTIONAL Suppresses console output default is not suppressed -localstats OPTIONAL Prints statistics from source default is sink side stats Note: conflicts with packet option, results will be &lt;br /&gt; undefined -tolerance OPTIONAL Specify tolerance If no tolerance will assume 2%&lt;/timestamp&gt;&lt;/interval&gt;&lt;/num&gt;&lt;/size&gt;&lt;/dscp&gt;&lt;/lltd&gt;&lt;/adaptive&gt;&lt;/traffictype&gt;&lt;/pre&gt;
&lt;p&gt;Hopefully this post has been helpful in understanding what the QoS Traffic Generator can do. Please send us any comments you have!&lt;/p&gt;
&lt;p&gt;&amp;nbsp; -- Jim Liu&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9595311" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/QoS/">QoS</category></item><item><title>WWSAPI security examples setup</title><link>http://blogs.msdn.com/b/wndp/archive/2009/05/06/wwsapi-security-examples-setup.aspx</link><pubDate>Wed, 06 May 2009 20:44:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9591686</guid><dc:creator>Ari B. Pernick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=9591686</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2009/05/06/wwsapi-security-examples-setup.aspx#comments</comments><description>&lt;p&gt;Just a quick note that over on on haoxu’ s “Lost in History” blog is a posting about &lt;a href="http://blogs.msdn.com/haoxu/archive/2009/04/30/one-time-set-up-for-wwsapi-security-examples.aspx"&gt;how to create and register test SSL certs in http.sys for the Windows Web Services API Security Sample code&lt;/a&gt;. This might also be useful for developers using the http.sys apis.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9591686" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/WebServices/">WebServices</category></item><item><title>QoS Traffic Generator is now available on Connect</title><link>http://blogs.msdn.com/b/wndp/archive/2009/04/30/qos-traffic-generator-is-now-available-on-connect.aspx</link><pubDate>Fri, 01 May 2009 02:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9581533</guid><dc:creator>Ari B. Pernick</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=9581533</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2009/04/30/qos-traffic-generator-is-now-available-on-connect.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update: This tool is no longer available on Microsoft Connect and there is no replacement download site.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I&amp;rsquo;m posting on behalf of Jim Liu who is a SDET in Windows Core Networking. -- Ari&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The QoS team is pleased to announce the availability of the QoS Traffic Generator on Microsoft Connect. This tool was developed during the Windows 7 development process and has been used extensively to aid in the testing of our QoS technologies. It is a command-line based tool that generates network traffic and utilizes TC/qWave to throttle and mark packets as desired. Some notable features include:&lt;/p&gt;
&lt;p&gt;&amp;middot; Ability to send traffic at a specified throughput using Winsock from one machine to another&lt;/p&gt;
&lt;p&gt;&amp;middot; Throttling is performed by the application itself or through QoS APIs (Traffic Control or qWave)&lt;/p&gt;
&lt;p&gt;&amp;middot; Support TCP and UDP dual-mode sockets&lt;/p&gt;
&lt;p&gt;&amp;middot; Provide traffic statistics from either the source machine or destination machine&lt;/p&gt;
&lt;p&gt;&amp;middot; Can be built as a static library for use in other applications&lt;/p&gt;
&lt;p&gt;We are providing this tool as a demonstration of QoS technologies and how they may be used to produce a novel application. Both 32 and 64-bit binaries are provided along with the source code and instructions for building the static library and the accompanying executable. The application itself has usage information on the available usage options.&lt;/p&gt;
&lt;p&gt;To download the package, go to the &lt;a href="http://connect.microsoft.com/wndp"&gt;WNDP site&lt;/a&gt; on Microsoft Connect and select Downloads from the left-hand menu. Select QoS Traffic Generator. Please send us any feedback you have about the tool!&lt;/p&gt;
&lt;p&gt;&amp;nbsp; -- Jim Liu&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9581533" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/QoS/">QoS</category></item><item><title>Beta versions of Windows Web Services API available</title><link>http://blogs.msdn.com/b/wndp/archive/2009/02/24/beta-versions-of-windows-web-services-api-available.aspx</link><pubDate>Tue, 24 Feb 2009 20:40:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9442926</guid><dc:creator>Ari B. Pernick</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=9442926</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2009/02/24/beta-versions-of-windows-web-services-api-available.aspx#comments</comments><description>&lt;p&gt;Windows Web Services API team has just release the Beta version of the API for Windows XP, Windows Vista, Windows Server 2003 and Windows Server 2008. It is available now on &lt;a href="http://connect.microsoft.com/wndp/"&gt;the Connect site for Windows Networking&lt;/a&gt;. This release contains the same version of the runtime as in Windows 7 Beta. You may find the table that summarizes level of Service Packs and CPU architectures supported by this release and direct links to download pages in &lt;a href="http://connect.microsoft.com/WNDP/content/content.aspx?ContentID=11205"&gt;this announcement&lt;/a&gt;. Please try it out and report any installation and runtime issues by submitting the feedback using the &lt;a href="http://connect.microsoft.com/WNDP/Feedback"&gt;WNDP Connect&lt;/a&gt; site. The reference documentation for the API is available from &lt;a href="http://msdn.microsoft.com/en-us/library/dd430435(VS.85).aspx"&gt;MSDN&lt;/a&gt;. Please use &lt;a href="http://social.msdn.microsoft.com/Forums/en-us/wwsapi/threads/"&gt;this forum&lt;/a&gt; to ask WWSAPI team questions about the API and just released installers.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9442926" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/WebServices/">WebServices</category></item><item><title>QoS in Windows 7</title><link>http://blogs.msdn.com/b/wndp/archive/2009/01/28/qos-in-windows-7.aspx</link><pubDate>Wed, 28 Jan 2009 03:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9379293</guid><dc:creator>charwen</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=9379293</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2009/01/28/qos-in-windows-7.aspx#comments</comments><description>&lt;P&gt;Hello all. My name is Charley. I’m the new QoS program manager for Windows Core Networking. &lt;/P&gt;
&lt;P&gt;It has been a while since we posted our last article about QoS. We want to assure you that we’re still committed to improving this technology and building new QoS features in Windows. We received many questions and suggestions from you in the past. We hope you continue doing so because they are important to us.&lt;/P&gt;
&lt;P&gt;You probably all know that Windows 7 beta is live and available for you to download. You may wonder what is new in Windows 7 regarding QoS. But before getting to that, I’d like to refresh our memory as to what was new in Windows Vista. In Vista, we introduced two major QoS features: qWAVE and Policy based QoS. qWAVE, or Quality Windows Audio Video Experience, is designed to estimate the network bandwidth, intelligently mark the application packets (with proper DSCP values), and interact with the application in the event of network congestion or fluctuations of available bandwidth (so that the application can take appropriate actions). qWAVE APIs aim to simplify the work of application developers developing QoS-enabled applications for a home network. The APIs are documented in the Windows SDK. In contrast, Policy based QoS has a different target audience. It is intended to enable IT administrators to apply QoS to applications (which don’t need to have native supports of QoS), computers, and users in their enterprise network. It is especially beneficial to an organization with branch offices, where the WAN link capacity is limited and users tend to experience unpredictable network delays when accessing files or applications hosted on the main campus (or a different branch office). If you’d like to know more about these features, we’d suggest you read an excellent article written by Joseph Davies for TechNet magazine. Click &lt;A href="http://technet.microsoft.com/en-us/magazine/2007.02.cableguy.aspx"&gt;&lt;FONT color=#4271d6&gt;here&lt;/FONT&gt;&lt;/A&gt; to check it out.&lt;/P&gt;
&lt;P&gt;So what’s new in Windows 7? The enhancement we’ve made is called URL based QoS. If you’re familiar with Policy based QoS you know that in Vista an IT administrator can create a policy based on the application name, source and/or destination IP addresses, source and/or destination ports, and the protocol (TCP, UDP, or both). We’ve learned since then that many enterprise applications have been, or will be, hosted on web servers and accessed from a browser, so the IT administrators would love to be able to prioritize or control the network traffic &lt;I&gt;from&lt;/I&gt; those web-based applications, provided that a convenient configuration is available. To answer their request, we’ve added a new configuration option: you can create a policy based on the URL of an HTTP server. Say, you host all the training videos of your company on an IIS server running Windows 7 (or more precisely, Windows Server 2008 R2). You can then use a URL based QoS policy to throttle the video traffic (to prevent it from overwhelming your corporate network). Or, you host your company’s CRM or ERP applications on an HTTP application server running Windows 7. You can similarly use a URL based QoS policy to prioritize these applications traffic so that even users at a remote branch office always get prompt replies and have smooth UI experience.&lt;/P&gt;
&lt;P&gt;Does this sound interesting to you? Please let us know what you think. In the next blog, we’ll detail the configuration and the rules.&lt;/P&gt;
&lt;P&gt;Charley&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9379293" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/QoS/">QoS</category></item><item><title>Come See Windows 7 DirectAccess and BranchCache @PDC08 Pavillion</title><link>http://blogs.msdn.com/b/wndp/archive/2008/10/29/come-see-windows-7-directaccess-and-branchcache-pdc08-pavillion.aspx</link><pubDate>Wed, 29 Oct 2008 21:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9022729</guid><dc:creator>wndpteam</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=9022729</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2008/10/29/come-see-windows-7-directaccess-and-branchcache-pdc08-pavillion.aspx#comments</comments><description>&lt;P&gt;We are demoing &lt;A href="http://www.microsoft.com/windows/products/windowsvista/enterprise/windows7.mspx?Tab=DirectAccess" mce_href="http://www.microsoft.com/windows/products/windowsvista/enterprise/windows7.mspx?Tab=DirectAccess"&gt;Windows 7 Direct Access&lt;/A&gt; and &lt;A href="http://www.microsoft.com/windows/products/windowsvista/enterprise/windows7.mspx?Tab=BranchCache" mce_href="http://www.microsoft.com/windows/products/windowsvista/enterprise/windows7.mspx?Tab=BranchCache"&gt;Windows 7 Branch Cache&lt;/A&gt; at the PDC08 pavillion. We are the second booth to the left when you come in to the Big&amp;nbsp;Room, shaing space with the Windows&amp;nbsp;7 Sensor folks.&amp;nbsp;Come check it out at talk to us.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; -- Ari&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9022729" width="1" height="1"&gt;</description></item><item><title>Heading to PDC 2008</title><link>http://blogs.msdn.com/b/wndp/archive/2008/10/07/heading-to-pdc-2008.aspx</link><pubDate>Wed, 08 Oct 2008 01:44:45 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8988378</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=8988378</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2008/10/07/heading-to-pdc-2008.aspx#comments</comments><description>&lt;p&gt;I’ve been pretty busy &lt;a href="http://blogs.msdn.com/e7/"&gt;Engineering Windows 7&lt;/a&gt; with the rest of the windows networking team and we are really excited to start showing the world some of the work we’ve done at PDC. One of the things we’ve been working on has it’s own session: “Windows 7: Web Services in Native Code” presented by &lt;a href="http://blogs.msdn.com/nikolad/archive/2008/09/30/introducing-a-new-api-for-connecting-native-code-to-web-services-at-pdc-2008.aspx"&gt;Nikola Dudar&lt;/a&gt;. Also those who attend the PDC get &lt;a href="http://microsoftpdc.com/View.aspx?post=91d46819-8472-40ad-a661-2c78acb4018c:8962840&amp;amp;tag=PDC2008"&gt;Windows 7 bits&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;It turns out I’ll be at PDC as well, so let me know if you are heading there and wish to meet up. If you haven’t already registered, act quickly because &lt;a href="http://microsoftpdc.com/Registration/"&gt;registration&lt;/a&gt; is quickly getting full.&lt;/p&gt;  &lt;p&gt;-- Ari Pernick&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8988378" width="1" height="1"&gt;</description></item><item><title>WinHTTP Questions: About Callbacks</title><link>http://blogs.msdn.com/b/wndp/archive/2008/03/03/winhttp-qustions-about-callbacks.aspx</link><pubDate>Mon, 03 Mar 2008 20:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8006772</guid><dc:creator>wndpteam</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=8006772</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2008/03/03/winhttp-qustions-about-callbacks.aspx#comments</comments><description>&lt;P&gt;Hello All, I am continuing the "WinHTTP Questions" series with some questions on WinHTTP callbacks. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Is it correct that WinHTTP Callbacks will occur *only* during an in-progress WinHTTP operation? Is it possible that an external event (such as the remote server resetting the underlying tcp connection) result in a callback even when there's no outstanding operation?&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;No. For external callbacks, WinHTTP will indicate informational callbacks only when there is a pending operation. Essentially, there are two types of callbacks in WinHTTP. Completion callbacks and Informational callbacks. &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Completion callbacks are invoked as a completion of a pending API call e.g. read complete is invoked when the read API completes. Similarly, handle-closed callback is invoked in response to the close handle API. &lt;/LI&gt;
&lt;LI&gt;Informational callbacks, on the other hand, are invoked to inform the application about important events seen during the processing of a call.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;So, when an async API is invoked and it returns TRUE, the application will receive zero or more informational callbacks and then a completion callback. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;When an operation like WinHttpReadData fails immediately (i.e., this call returned FALSE), does it guarantee that user will not receive a STATUS_REQUEST_ERROR callback?&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;Yes. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Does WinHTTP synchronize WinhttpSetStatusCallback with worker threads? Here is our usage scenario: We are implementing a DLL that get dynamically loaded implements an asynchronous Download function with progress notifications and supports a Cancel call. After Cancel or Download completion our DLL should be able to be safely unloaded. Cancel calls WinHttpSetStatusCallback to unregister notifications, closes the request, connection and sessions handles. However we occasionally still get status callbacks after the DLL is unloaded.&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;No, WinHTTP does not synchronize WinHttpSetStatusCallback with worker threads. For e.g.&amp;nbsp; If a&amp;nbsp; callback originating in another thread is in progress when an application calls WinHttpSetStatusCallback, the application still receives a callback notification even after WinHttpSetStatusCallback successfully sets the callback function to NULL and returns. The thread will continue to process, so one will need to wait until the current call finishes. &lt;/P&gt;
&lt;P&gt;Please also refer to the following links for more on callbacks. &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa383917(VS.85).aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa383917(VS.85).aspx"&gt;WINHTTP_STATUS_CALLBACK Callback Function (MSDN)&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa384115(VS.85).aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa384115(VS.85).aspx"&gt;WinHttpSetStatusCallback Function (MSDN)&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Next time we will go a bit deeper into safe request cancellation.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; -- Deepak &amp;amp; Ari&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8006772" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/WinHttp/">WinHttp</category></item><item><title>WinHTTP Questions - async close on a sync request</title><link>http://blogs.msdn.com/b/wndp/archive/2008/02/25/winhttp-questions-async-close-on-a-sync-request.aspx</link><pubDate>Mon, 25 Feb 2008 18:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7839115</guid><dc:creator>wndpteam</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=7839115</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2008/02/25/winhttp-questions-async-close-on-a-sync-request.aspx#comments</comments><description>&lt;P&gt;Hello, my name is Deepak and I'm a SDET in serviceability. We handle a bunch of questions from developers using WinHTTP, and thought we might share then in a new posting series, "WinHTTP Questions".&lt;/P&gt;
&lt;P&gt;&lt;B&gt;Can I cancel a synchronous WinHttpSendRequest call by closing the request handle from a different thread? Or, are there any requirements that I need to use the asynchronous WinHttpSendRequest if I need the ability to cancel it?&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;The short answer is &lt;STRONG&gt;don't do that&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Let's think about the implications of this proposed code. Thread 1 starts a synchronous request and Thread 2 comes along an issues a close. We can't synchronize between Thread 1 and Thread 2 by definition because Thread 1's call is synchronous, we either can &lt;EM&gt;deterministically&lt;/EM&gt; call the close before the request call starts or after the call is completed. So to close the handle during the call results in a race condition. If thread 2 attempts to close the connection during the call, the handle passed in to WinHttpSendRequest may become invalid before WinHttp has a chance to work with it. While you might get lucky, you might also non-deterministically get a crash or memory corruption.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; -- Deepak and Ari&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7839115" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/WinHttp/">WinHttp</category></item><item><title>Ready for Windows Server 2008?</title><link>http://blogs.msdn.com/b/wndp/archive/2008/01/07/ready-for-windows-server-2008.aspx</link><pubDate>Tue, 08 Jan 2008 02:48:46 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7021640</guid><dc:creator>wndpteam</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=7021640</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2008/01/07/ready-for-windows-server-2008.aspx#comments</comments><description>&lt;p&gt;Windows Server 2008 incorporates the completely rewritten TCP/IP stack we shipped in Windows Vista and since this is the first server release with the stack we'd like to ask our readers to load up &lt;a href="http://www.microsoft.com/windowsserver2008/audsel.mspx"&gt;Windows Server RC1&lt;/a&gt; and see if your applications are ready. &lt;/p&gt;  &lt;p&gt;The new features (compared to Windows Server 2003) that may pose potential compatibility issues include: &lt;a href="http://msdn2.microsoft.com/en-us/library/aa480152.aspx#appcomp_topic13"&gt;removed filter hooks&lt;/a&gt;, &lt;a href="http://www.microsoft.com/technet/technetmag/issues/2007/01/CableGuy/"&gt;receive window auto tuning&lt;/a&gt;, &lt;a href="http://www.microsoft.com/technet/community/columns/cableguy/cg1005.mspx"&gt;dual IP layer architecture for IPv6&lt;/a&gt;, &lt;a href="http://www.microsoft.com/technet/community/columns/cableguy/cg0905.mspx"&gt;compound TCP, ECN support, default strong host model, easier kernel mode programming, extensive protocol offload&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Windows Server 2008 is also the very first Microsoft server product to have the &lt;a href="http://msdn2.microsoft.com/en-us/library/bb736286.aspx"&gt;&lt;strong&gt;firewall ON by default&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt; Third party applications that are not aware of this behavior may break.&amp;#160; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;-- Ari and Katarzyna&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7021640" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/TCP_2F00_IP/">TCP/IP</category><category domain="http://blogs.msdn.com/b/wndp/archive/tags/Windows+Server+2008/">Windows Server 2008</category></item><item><title>Happy New Year</title><link>http://blogs.msdn.com/b/wndp/archive/2008/01/07/happy-new-year.aspx</link><pubDate>Mon, 07 Jan 2008 20:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7017798</guid><dc:creator>wndpteam</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=7017798</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2008/01/07/happy-new-year.aspx#comments</comments><description>&lt;P&gt;Just wanted to drop a quick Happy New Year to our readers and see if there is any topics that you want to hear about. We've been pretty busy with Windows Server 2008, Windows Vista SP1 and future windows&amp;nbsp;releases. With the RTM of Windows Server 2008 and Windows Vista SP1 drawing near, I hope to get some posts on things that are new or have changed, but I'd be happy to hear whatever people are interested in.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;-- Ari&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7017798" width="1" height="1"&gt;</description></item><item><title>Throttling, DSCP, and 802.1p with Traffic Control</title><link>http://blogs.msdn.com/b/wndp/archive/2007/11/14/throttling-dscp-and-802-1p-with-the-traffic-control-api.aspx</link><pubDate>Thu, 15 Nov 2007 02:07:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6231069</guid><dc:creator>wndpteam</dc:creator><slash:comments>27</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=6231069</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/11/14/throttling-dscp-and-802-1p-with-the-traffic-control-api.aspx#comments</comments><description>&lt;p&gt;&lt;font size="2"&gt;In his introductory post about the legacy &lt;a href="http://blogs.msdn.com/wndp/archive/2007/10/09/introduction-to-windows-qos-traffic-control.aspx" target="_blank"&gt;Traffic Control (TC) API&lt;/a&gt;, Gabe discussed the host-based model that TC provides. In this post, we will see how Traffic Control APIs can be used to achieve the following for TCP/IPv4 and UDP/IPv4 traffic sent from a host:&lt;/font&gt; &lt;ul&gt; &lt;li&gt;&lt;font size="2"&gt;Throttle (rate-limit) outgoing traffic&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&lt;font size="2"&gt;Add DSCP value in layer-3 (IPv4) header&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&lt;font size="2"&gt;Indicate that an 802.1p tag value should be added in layer-2 header&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;font size="2"&gt;At the bottom of the post, we’ve provided a link to the Networking Connect site to download full source and binaries to a tool which implements all of the above functionality.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;The following are the steps involved:&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;1. The first step in the process is to obtain a handle to the Traffic Control subsystem through a call to &lt;i&gt;TcRegisterClient()&lt;/i&gt;.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;2. Next, make a call to &lt;i&gt;TcEnumerateInterfaces()&lt;/i&gt; using the registration handle obtained in step #1. This call returns a list of all TC enabled interfaces on the system. Iterate through the list to find the interface(s) on which you want to prioritize and/or throttle outgoing traffic.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;3. For each interface of interest, issue a &lt;i&gt;TcOpenInterface()&lt;/i&gt; using the &lt;i&gt;pInterfaceName&lt;/i&gt; from the corresponding &lt;i&gt;TC_IFC_DESCRIPTOR&lt;/i&gt; for that interface from the list returned in step#2. Store the handle returned by &lt;i&gt;TcOpenInterface()&lt;/i&gt;; let’s call it the &lt;i&gt;ifchandle&lt;/i&gt;.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;4. At this point, create a TC Flow and add it to the interface(s) of interest.&lt;/font&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;a. Create the TC Flow:&lt;br&gt;A TC flow is a way of describing various QoS characteristics to be applied to a set of packets and is represented by a &lt;i&gt;TC_GEN_FLOW&lt;/i&gt; structure. The following code snippet shows how to create a TC Flow given the DSCP value, 802.1p value and the throttle rate. &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;BOOL CreateFlow(PTC_GEN_FLOW * _ppTcFlowObj, USHORT DSCPValue, USHORT OnePValue, ULONG ThrottleRate)&lt;br&gt;{&lt;br&gt;&amp;nbsp; BOOL status = FALSE; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Flow Parameters&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; ULONG TokenRate = QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; ULONG TokenBucketSize = QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; ULONG PeakBandwidth = QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; ULONG Latency = QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; ULONG DelayVariation = QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; SERVICETYPE ServiceType = SERVICETYPE_BESTEFFORT;&lt;br&gt;&amp;nbsp; ULONG MaxSduSize=QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; ULONG MinimumPolicedSize=QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; PVOID pCurrentObject;&lt;br&gt;&amp;nbsp; PTC_GEN_FLOW _pTcFlowObj = NULL;&lt;br&gt;&amp;nbsp; int Length = 0; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Calculate the memory size required for the optional TC objects&lt;br&gt;&amp;nbsp; // &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; Length += (OnePValue == NOT_SPECIFIED ? 0:sizeof(QOS_TRAFFIC_CLASS)) + (DSCPValue == NOT_SPECIFIED ? 0:sizeof(QOS_DS_CLASS)); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Print the Flow parameters&lt;br&gt;&amp;nbsp; // &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; printf("Flow Parameters:\n");&lt;br&gt;&amp;nbsp; DSCPValue == NOT_SPECIFIED ? printf("\tDSCP: *\n"):printf("\tDSCP: %u\n", DSCPValue);&lt;br&gt;&amp;nbsp; OnePValue == NOT_SPECIFIED ? printf("\t802.1p: *\n"):printf("\t802.1p: %u\n", OnePValue);&lt;br&gt;&amp;nbsp; ThrottleRate == QOS_NOT_SPECIFIED ? printf("\tThrottleRate: *\n"):printf("\tThrottleRate: %u\n", ThrottleRate);&lt;br&gt;&amp;nbsp; TokenRate = TokenBucketSize = ThrottleRate; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Allocate the flow descriptor&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; _pTcFlowObj = (PTC_GEN_FLOW)malloc(FIELD_OFFSET(TC_GEN_FLOW, TcObjects) + Length); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if (!_pTcFlowObj) &lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Flow Allocation Failed\n");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Exit;&lt;br&gt;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.TokenRate = TokenRate;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.TokenBucketSize = TokenBucketSize;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.PeakBandwidth = PeakBandwidth;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.Latency = Latency;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.DelayVariation = DelayVariation;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.ServiceType = ServiceType;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.MaxSduSize = MaxSduSize;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.MinimumPolicedSize = MinimumPolicedSize; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Currently TC only supports QoS on the send path&lt;br&gt;&amp;nbsp; // ReceivingFlowSpec is legacy and ignored&lt;br&gt;&amp;nbsp; // &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; memcpy(&amp;amp;(_pTcFlowObj-&amp;gt;ReceivingFlowspec), &amp;amp;(_pTcFlowObj-&amp;gt;SendingFlowspec), sizeof(_pTcFlowObj-&amp;gt;ReceivingFlowspec));&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;TcObjectsLength = Length; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Add any requested objects&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; pCurrentObject = (PVOID)_pTcFlowObj-&amp;gt;TcObjects;&lt;br&gt;&amp;nbsp; if(OnePValue != NOT_SPECIFIED)&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QOS_TRAFFIC_CLASS *pTClassObject = (QOS_TRAFFIC_CLASS*)pCurrentObject;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTClassObject-&amp;gt;ObjectHdr.ObjectType = QOS_OBJECT_TRAFFIC_CLASS;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTClassObject-&amp;gt;ObjectHdr.ObjectLength = sizeof(QOS_TRAFFIC_CLASS);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTClassObject-&amp;gt;TrafficClass = OnePValue; //802.1p tag to be used&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCurrentObject = (PVOID)(pTClassObject + 1);&lt;br&gt;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if(DSCPValue != NOT_SPECIFIED)&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QOS_DS_CLASS *pDSClassObject = (QOS_DS_CLASS*)pCurrentObject;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDSClassObject-&amp;gt;ObjectHdr.ObjectType = QOS_OBJECT_DS_CLASS;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDSClassObject-&amp;gt;ObjectHdr.ObjectLength = sizeof(QOS_DS_CLASS);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDSClassObject-&amp;gt;DSField = DSCPValue; //Services Type&lt;br&gt;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; DeleteFlow(_ppTcFlowObj);&lt;br&gt;&amp;nbsp; *_ppTcFlowObj = _pTcFlowObj;&lt;br&gt;&amp;nbsp; status = TRUE;&lt;br&gt;&amp;nbsp; Exit: &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if(!status)&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Flow Creation Failed\n");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteFlow(&amp;amp;_pTcFlowObj);&lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Flow Creation Succeeded\n"); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; return status;&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;b. Add the Flow on the interface:&lt;br&gt;After obtaining a &lt;i&gt;TC_GEN_FLOW&lt;/i&gt; structure with the desired characteristics using a function similar to the one above, issue a call to &lt;i&gt;TcAddFlow()&lt;/i&gt; with the &lt;i&gt;ifchandle &lt;/i&gt;(obtained in step #3) and a pointer to the &lt;i&gt;TC_GEN_FLOW&lt;/i&gt; object (obtained in step #4a). Store the handle returned by &lt;i&gt;TcAddFlow()&lt;/i&gt;;let’s call it the &lt;i&gt;flowhandle&lt;/i&gt;.&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="v" size="2"&gt;5. The next step is to create a TC Filter and add it to the TC Flow created above. &lt;/font&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="v" size="2"&gt;a. Create the TC Filter:&lt;br&gt;A TC Filter is a way of describing which packets to apply the QoS characteristics to. The QoS characteristics defined in the &lt;i&gt;TC_GEN_FLOW&lt;/i&gt; will only apply to the packets matching the filter(s) associated with the Flow. &lt;br&gt;The following code snippet describes how to create a TC Filter given the destination address, the destination port, and the protocol (TCP,UDP or IP).&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;font face="v"&gt;BOOL CreateFilter(PTC_GEN_FILTER&lt;/font&gt; * ppFilter, SOCKADDR_STORAGE Address, USHORT Port, UCHAR ProtocolId)&lt;br&gt;{ &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; BOOL status = FALSE;&lt;br&gt;&amp;nbsp; USHORT AddressFamily = Address.ss_family;&lt;br&gt;&amp;nbsp; PTC_GEN_FILTER pFilter = NULL;&lt;br&gt;&amp;nbsp; PIP_PATTERN pPattern = NULL;&lt;br&gt;&amp;nbsp; PIP_PATTERN pMask = NULL; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if(AddressFamily != AF_INET)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Exit; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Allocate memory for the filter&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; pFilter = (PTC_GEN_FILTER)malloc(sizeof (TC_GEN_FILTER));&lt;br&gt;&amp;nbsp; if(!pFilter)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Exit; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; ZeroMemory(pFilter, sizeof(TC_GEN_FILTER)); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Allocate memory for the pattern and mask&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; pPattern = (PIP_PATTERN)malloc( sizeof(IP_PATTERN));&lt;br&gt;&amp;nbsp; pMask = (PIP_PATTERN)malloc( sizeof(IP_PATTERN));&lt;br&gt;&amp;nbsp; if(!pPattern || !pMask)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Exit; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; memset ( pPattern, 0, sizeof(IP_PATTERN) );&lt;br&gt;&amp;nbsp; pPattern-&amp;gt;DstAddr = ((SOCKADDR_IN *)&amp;amp;Address)-&amp;gt;sin_addr.s_addr;&lt;br&gt;&amp;nbsp; pPattern-&amp;gt;tcDstPort = htons(Port);&lt;br&gt;&amp;nbsp; pPattern-&amp;gt;ProtocolId = ProtocolId;&lt;br&gt;&amp;nbsp; memset ( pMask, (ULONG) -1, sizeof(IP_PATTERN) ); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Set the source address and port to wildcard&lt;br&gt;&amp;nbsp; // 0 -&amp;gt; wildcard, 0xFF-&amp;gt; exact match &lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; pMask-&amp;gt;SrcAddr = 0;&lt;br&gt;&amp;nbsp; pMask-&amp;gt;tcSrcPort = 0; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // if the user specified 0 for dest port, dest address or protocol&lt;br&gt;&amp;nbsp; // set the appropriate mask as wildcard&lt;br&gt;&amp;nbsp; // 0 -&amp;gt; wildcard, 0xFF-&amp;gt; exact match &lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; if(pPattern-&amp;gt;tcDstPort == 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMask-&amp;gt;tcDstPort = 0; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if(pPattern-&amp;gt;ProtocolId == 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMask-&amp;gt;ProtocolId = 0; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if(pPattern-&amp;gt;DstAddr == 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMask-&amp;gt;DstAddr = 0; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; pFilter-&amp;gt;AddressType = NDIS_PROTOCOL_ID_TCP_IP;&lt;br&gt;&amp;nbsp; pFilter-&amp;gt;PatternSize = sizeof(IP_PATTERN);&lt;br&gt;&amp;nbsp; pFilter-&amp;gt;Pattern = pPattern;&lt;br&gt;&amp;nbsp; pFilter-&amp;gt;Mask = pMask; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Delete any previous instances of the Filter&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; DeleteFilter(ppFilter);&lt;br&gt;&amp;nbsp; *ppFilter = pFilter;&lt;br&gt;&amp;nbsp; status = TRUE; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; Exit:&lt;br&gt;&amp;nbsp; if(!status)&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Filter Creation Failed\n");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteFilter(&amp;amp;pFilter);&lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Filter Creation Succeeded\n"); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; return status; &lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;b. Adding the Filter to the TC Flow:&lt;br&gt;Once a TC Filter structure is obtained using a function similar to the one above, issue a call to &lt;i&gt;TcAddFilter()&lt;/i&gt; passing the &lt;i&gt;flowhandle&lt;/i&gt; obtained in step #4b and a pointer to the &lt;i&gt;TC_GEN_FILTER&lt;/i&gt; structure obtained in step #5a. Store the filter handle returned by &lt;i&gt;TcAddFilter()&lt;/i&gt;;&lt;i&gt; &lt;/i&gt;let’s call it &lt;i&gt;filterhandle&lt;/i&gt;.&lt;br&gt;You can add multiple filters on the same flow causing different sets of packets matching each filter to get the same QoS characteristics applied to them. &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;6. At this point, your application is applying QoS on all matching outgoing packets as specified in the TC Filter and TC Flow. Finally, once your purpose is served, make sure you call the respective close calls on all the open TC handles – &lt;i&gt;TcDeletefilter()&lt;/i&gt;, &lt;i&gt;TcDeleteFlow()&lt;/i&gt;, &lt;i&gt;TcCloseInterface()&lt;/i&gt; and &lt;i&gt;TcDeregisterClient()&lt;/i&gt;.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;You can download the full source and binaries of a simple command line tool – tcmonlite, which takes the filter and flow parameters as input, creates TC Flow and Filter, and configures the QoS subsystem with them using the Traffic Control API. All the outgoing traffic on the system matching the filter gets the desired QoS characteristics as long as tcmonlite is running. G&lt;/font&gt;&lt;font size="2"&gt;o to the &lt;/font&gt;&lt;a href="http://connect.microsoft.com/"&gt;&lt;font size="2"&gt;Microsoft Connect&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; website, choose &lt;i&gt;Available Connections &lt;/i&gt;on the left-hand side of the page, and select &lt;i&gt;Windows Networking &lt;/i&gt;from the available connections (bottom half of the page). On the left-hand side of the &lt;i&gt;Windows Networking &lt;/i&gt;page, choose &lt;i&gt;Downloads&lt;/i&gt;, and select &lt;em&gt;TCMonLite&lt;/em&gt;.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;This tool can be used in conjunction with the &lt;a href="http://blogs.msdn.com/wndp/archive/2007/09/14/detecting-802-1p-priority-tags-part-3.aspx" target="_blank"&gt;NDIS LWF driver&lt;/a&gt; to detect 802.1p tags in the Ethernet header and DSCP in the IP header of packets. Let us know what you think!&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;-- Hemant Banavar&amp;nbsp; &lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6231069" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/QoS/">QoS</category></item><item><title>Introduction to Windows QoS Traffic Control</title><link>http://blogs.msdn.com/b/wndp/archive/2007/10/09/introduction-to-windows-qos-traffic-control.aspx</link><pubDate>Tue, 09 Oct 2007 21:05:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5384320</guid><dc:creator>wndpteam</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=5384320</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/10/09/introduction-to-windows-qos-traffic-control.aspx#comments</comments><description>&lt;p&gt;&lt;font size="2"&gt;Disclaimer: Traffic Control (TC) APIs have been marked as &lt;a href="http://blogs.msdn.com/wndp/archive/2006/07/05/657196.aspx" target="_blank"&gt;deprecated&lt;/a&gt;, and will be phased out (eventually removed) when a suitable replacement API is available. &lt;u&gt;No&lt;/u&gt; advancements will be made to these APIs (including adding IPv6 support) in their deprecated state; however, application compatibility will be maintained until their eventual removal.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;Since the introduction of a QoS platform in Windows 2000, there have been two models for applying prioritization and/or send-rate throttling to TCP/IP and UDP/IP network traffic sent from a Windows PC: host-based and application-based. These terms have been used in QoS documentation such as this recent &lt;a href="http://blogs.msdn.com/wndp/archive/2007/02/02/Windows_5F00_QoS_5F00_Support.aspx" target="_blank"&gt;CableGuy article&lt;/a&gt;; however, I acknowledge the meaning of these terms are not immediately obvious. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;An application-based model means only the application which owns the socket handle can add/remove/modify a QoS flow for its traffic. Because the application sending data onto the wire (or air) is applying throttling or priority to its own traffic (the connected socket), no elevation of privileges is required. A host-based model means some other process (not the application sending traffic through the socket) on the PC is applying prioritization or throttling to this traffic it doesn't own. Because the process doesn't own the socket handle, elevation of privileges (administrator) is required. While it is certainly possible for the process that owns the socket handle to leverage a host-based model, the added complexity is unnecessary considering socket-based QoS APIs are available for this purpose. &lt;/font&gt;&lt;font size="2"&gt;A host-based model is a much more complex model than application-based for the following reasons:&lt;/font&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;font size="2"&gt;The process applying QoS properties to traffic it doesn't own has to run as a service or some other out-of-band means&lt;/font&gt; (in typical use cases) &lt;li&gt;&lt;font size="2"&gt;Administrative privileges are required&lt;/font&gt;  &lt;li&gt;&lt;font size="2"&gt;Because the socket handle is not known, a filter has to be applied to match the traffic of interest, based on: source/destination IPv4 address, source/destination port, and protocol (TCP or UDP)&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;font size="2"&gt;In Windows, only the Traffic Control (traffic.h/traffic.dll) interface provides programmatic access to a host-based model. T&lt;/font&gt;&lt;font size="2"&gt;here is value gained from this complexity; however. Because this API requires administrative privileges, the caller can specify any arbitrary layer-2 (802.1p) or layer-3 (DSCP) priority value; whereas application-based API models abstract specific priority values with traffic-classes based on established industry standards. It is worth noting that a&lt;/font&gt;&lt;font size="2"&gt; new &lt;a href="http://blogs.msdn.com/wndp/archive/2006/06/30/653047.aspx" target="_blank"&gt;policy-based&lt;/a&gt; feature has been added to Windows Vista and Windows Server 2008 which enables a host-based model for IT administrators (no coding necessary), which enables significantly richer classification than what TC provides. Policy-based QoS; however, does not provide programmatic access and does not allow for setting layer-2 802.1p tags, only layer-3 DSCP.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;Innovation has been focused on application-based APIs such as qWAVE (qos2.h/qwave.dll) to significantly simplify *&lt;a href="http://blogs.msdn.com/wndp/archive/2005/10/24/484444.aspx" target="_blank"&gt;safely&lt;/a&gt;* adding prioritization and throttling to traffic, as well as policy-based mechanisms for host-based needs.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;Stay tuned for follow-up posts on how to use TC for adding 802.1p tags to the Ethernet header, DSCP to the IPv4 header, and applying throttling to outgoing traffic.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;-- Gabe Frost&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5384320" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/QoS/">QoS</category></item><item><title>WiFi WMM Requirements for Vista Miniport Drivers</title><link>http://blogs.msdn.com/b/wndp/archive/2007/09/18/wifi-wmm-requirements-for-vista-miniport-drivers.aspx</link><pubDate>Tue, 18 Sep 2007 18:00:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4967008</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=4967008</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/09/18/wifi-wmm-requirements-for-vista-miniport-drivers.aspx#comments</comments><description>&lt;p&gt;&lt;font size="2"&gt;A number of partners who author wireless drivers for Vista have asked how they can ensure their WiFi Wireless Multimedia (WMM) implementation is correct, so I thought I'd be explicit about this very important topic. To begin, read the 4-part series &lt;/font&gt;&lt;a href="http://blogs.msdn.com/wndp/archive/2006/06/28/650363.aspx" target="_blank"&gt;&lt;font size="2"&gt;WiFi QoS Support in Windows Vista&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;, which describes how Vista internally indicates a WMM Access Category (WMM_AC), how to detect whether an Access Point supports this capability, and how to observe the behavior of prioritized traffic. Next, be sure you explicitly validate your driver does the following:&lt;/font&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;font size="2"&gt; &lt;p&gt;&lt;font size="2"&gt;Confirm the QoS header exists in 802.11 data frames when DSCP and 802.1p are set independently:&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;DSCP [56, 48, 40, 32, 24, 16, 8, 0]&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;802.1p [7, 6, 5, 4, 3, 2, 1, 0]&lt;/font&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;Ensure the miniport indicates &lt;em&gt;NDIS_MAC_OPTION_8021P_PRIORITY&lt;/em&gt; in &lt;em&gt;OID_GEN_MAC_OPTIONS&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;Miniport behavior on receive:&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;If WMM/11e header is stripped, WMM bit in &lt;em&gt;FrameControlSubtype&lt;/em&gt; must be cleared&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;If WMM/11e header is not stripped, WMM bit in &lt;em&gt;FrameControlSubtype&lt;/em&gt; must *&lt;b&gt;not&lt;/b&gt;* be cleared&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;Must *&lt;b&gt;not&lt;/b&gt;* strip 802.1Q tag in SNAP header (nwifi.sys will strip if necessary&lt;/font&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;Miniport behavior on transmit:&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;Only use &lt;em&gt;NDIS_NET_BUFFER_LIST_8021Q_INFO.WMMInfo&lt;/em&gt; field to ascertain correct WMM_AC (*&lt;b&gt;not&lt;/b&gt;* &lt;em&gt;UserPriority&lt;/em&gt;, or IP DSCP field)&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;font size="2"&gt; &lt;p&gt;&lt;font size="2"&gt;Must not strip 802.1Q tag in SNAP header (may be added by nwifi.sys)&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;font size="2"&gt; &lt;p&gt;-- Gabe Frost&lt;/font&gt;&lt;font size="2"&gt;&lt;/p&gt;&lt;/font&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4967008" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/QoS/">QoS</category><category domain="http://blogs.msdn.com/b/wndp/archive/tags/ndis/">ndis</category></item><item><title>Detecting 802.1p Priority Tags: Part 3</title><link>http://blogs.msdn.com/b/wndp/archive/2007/09/14/detecting-802-1p-priority-tags-part-3.aspx</link><pubDate>Sat, 15 Sep 2007 01:39:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4918303</guid><dc:creator>wndpteam</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=4918303</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/09/14/detecting-802-1p-priority-tags-part-3.aspx#comments</comments><description>&lt;p&gt;Parts &lt;a href="http://blogs.msdn.com/wndp/archive/2007/09/07/detecting-802-1p-priority-tags.aspx" target="_blank"&gt;1&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/wndp/archive/2007/09/13/detecting-802-1p-priority-tags-part-2.aspx" target="_blank"&gt;2&lt;/a&gt; of this series discussed how to determine whether an 802.1p tag was added to traffic, and how to modify the NDIS light-weight-filter (LWF) sample driver source code to accomplish this task. We do know that you're all very busy and not everyone is a developer, so we've added to the package: full source code for the complete filter driver, a command-line tool for accessing the filtered packets, and compiled binaries for you non-developers. We also added the ability to validate *both* 802.1p and DSCP (from the IPv4/IPv6 header). This additional package was added to the existing download, so if you haven't already read part-2 of this series, do so now and you'll find download instructions there. For installation instructions, read the README file in the zip archive. &lt;/p&gt; &lt;p&gt;What do you think? Is this approach (source and tools) helpful? We do actively monitor the &lt;a href="http://forums.microsoft.com/msdn/showforum.aspx?forumid=825&amp;amp;siteid=1" target="_blank"&gt;QoS forum&lt;/a&gt;, so let us know how we can improve your understanding of Windows QoS capabilities.&lt;/p&gt; &lt;p&gt;-- Gabe Frost&lt;/p&gt; &lt;p&gt;-- Huge thanks to Hemant Banavar who authored the tools&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4918303" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/QoS/">QoS</category><category domain="http://blogs.msdn.com/b/wndp/archive/tags/ndis/">ndis</category></item><item><title>Detecting 802.1p Priority Tags: Part 2</title><link>http://blogs.msdn.com/b/wndp/archive/2007/09/13/detecting-802-1p-priority-tags-part-2.aspx</link><pubDate>Fri, 14 Sep 2007 02:43:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4902488</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=4902488</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/09/13/detecting-802-1p-priority-tags-part-2.aspx#comments</comments><description>&lt;p&gt;&lt;font size="2"&gt;In Gabe’s last post on detecting 802.1p priority tags, he described at a relatively high-level why it is difficult to detect a priority tag using packet tracing applications, as well as the proper way to determine whether a tag was present in a packet that was sent onto the wire (or air). In this post, I’ll describe how to programmatically access this information by modifying the NDIS Light Weight Filter (LWF) sample driver found in the &lt;/font&gt;&lt;a href="http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx"&gt;&lt;font size="2"&gt;Windows Driver Kit&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; (WDK). To begin, download and install the WDK and navigate to the LWF sample found in the &lt;i&gt;WinDDK\6000\src\network\ndis\filter&lt;/i&gt; directory. The remainder of this post will describe how to modify this sample to gain access to the &lt;i&gt;UserPriority&lt;/i&gt; value in the out-of-band (OOB) data of a Net Buffer List (NBL) structure, and whether the miniport driver actually stripped the 1Q tag from the Ethernet header like it was supposed to. Based on what part-1 of this series describes about driver (miniport/LWF) layering and framing details, the modified driver will inspect received packets (meaning the sender added the tag to outgoing traffic).&lt;/font&gt;  &lt;p&gt;&lt;font size="2"&gt;The source file in the LWF sample of particular interest is &lt;i&gt;filter.c&lt;/i&gt;, where we’ll modify the &lt;i&gt;FilterReceiveNetBufferLists() &lt;/i&gt;function. &lt;i&gt;FilterReceiveNetBufferLists() &lt;/i&gt;is an optional function for filter drivers, which if provided, processes receive indications made by the underlying miniport or filter drivers beneath in the stack. If this handler is &lt;i&gt;NULL&lt;/i&gt;, NDIS will skip calling this filter when processing a receive indication and will call the next filter (or protocol driver) above in the stack with a non-&lt;i&gt;NULL&lt;/i&gt; &lt;i&gt;FilterReceiveNetBufferLists &lt;/i&gt;handler. The remainder of this post goes into detail about which areas of &lt;i&gt;filter.c &lt;/i&gt;need to be modified.&lt;/font&gt;  &lt;p&gt;&lt;font size="2"&gt;To begin, let’s explore how to access the received packets in this function so they can be inspected. The second parameter to the function, &lt;i&gt;NetBufferLists, &lt;/i&gt;is a linked list of &lt;i&gt;NetBufferList &lt;/i&gt;structures allocated by the underlying driver. Each &lt;i&gt;NetBufferList &lt;/i&gt;contains one &lt;i&gt;NetBuffer &lt;/i&gt;structure, which represents a received packet. This means, in order to inspect each packet in the &lt;i&gt;NetBufferLists &lt;/i&gt;linked list, we need a loop of the following kind within &lt;i&gt;FilterReceiveNetBufferLists():&lt;/i&gt;&lt;/font&gt;  &lt;blockquote&gt; &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;if (pFilter-&amp;gt;TrackReceives) &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;{&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILTER_ACQUIRE_LOCK(&amp;amp;pFilter-&amp;gt;Lock, DispatchLevel);&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pFilter-&amp;gt;OutstandingRcvs += NumberOfNetBufferLists;&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ref = pFilter-&amp;gt;OutstandingRcvs;&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currNbl = NetBufferLists;&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(currNbl)&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman"&gt;&lt;font color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Call the function to parse the packet in each &lt;/font&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman"&gt;&lt;font color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NetBufferList (one net buffer per NBL )&lt;/font&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inspectNetBuffer(currNbl, pFilter);&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currNbl = currNbl-&amp;gt;Next;&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILTER_LOG_RCV_REF(1, pFilter, NetBufferLists, Ref);&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILTER_RELEASE_LOCK(&amp;amp;pFilter-&amp;gt;Lock, DispatchLevel);&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;In the above code snippet, observe that the loop is run only if &lt;i&gt;pFilter-&amp;gt;TrackReceives &lt;/i&gt;is &lt;i&gt;TRUE&lt;/i&gt;. The idea here is to only inspect packets if the user requests the driver to do receive-side inspections (our focus is on a debugging tool). The &lt;i&gt;TrackReceives &lt;/i&gt;flag can be set to &lt;i&gt;FALSE &lt;/i&gt;at &lt;i&gt;FilterAttach&lt;/i&gt; and can be set to &lt;i&gt;TRUE &lt;/i&gt;through an IOCTL. Look at the &lt;i&gt;FilterDeviceIoControl() &lt;/i&gt;function in &lt;i&gt;device.c &lt;/i&gt;for defining IOCTLs. &lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;Now that we have a pointer to the &lt;i&gt;NetBufferList &lt;/i&gt;structure which holds the packet information, let’s explore how to inspect the packet for the 802.1p tag (note you could also inspect the IPv4 or IPv6 header for DSCP here if you really wanted). The &lt;i&gt;inspectNetBuffer&lt;/i&gt; function in the above code snippet starts by extracting the &lt;i&gt;NetBuffer &lt;/i&gt;pointer from the &lt;i&gt;NetBufferList&lt;/i&gt;. Please see the bottom of this post for instructions on where to download the full implementation of this function. Next, if an 802.1p tag is available in the OOB data, it is extracted and stored in the variable called &lt;i&gt;UserPriority &lt;/i&gt;as follows:&lt;/font&gt;  &lt;blockquote&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;if (NET_BUFFER_LIST_INFO&lt;/font&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;(pNetBufferList, Ieee8021QNetBufferListInfo) != 0) &lt;/font&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;{ &lt;/font&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ndis8021QInfo.Value = NET_BUFFER_LIST_INFO(pNetBufferList, Ieee8021QNetBufferListInfo); &lt;/font&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UserPriority = (UCHAR)Ndis8021QInfo.TagHeader.UserPriority; &lt;/font&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;At this point, a pointer to the start of the packet is obtained and stored in &lt;i&gt;packetBuffer&lt;/i&gt;. The Ethernet header is parsed and &lt;i&gt;RecdUnStrippedPackets &lt;/i&gt;(which is initialized to zero at the beginning before starting to track received packets) is incremented if it is found that the Ethernet header still contains the 802.1p tag - indicating the underlying miniport did not strip the tag as per NDIS documentation.&lt;/font&gt;  &lt;p&gt;&lt;font size="2"&gt;To download the full implementation of &lt;i&gt;inspectNetBuffer()&lt;/i&gt;, as used to do the majority of parsing work, go to &lt;/font&gt;&lt;a href="http://connect.microsoft.com/"&gt;&lt;font size="2"&gt;Microsoft Connect&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; website and login using your passport account (create one if you don’t already have one). Once you have logged in, choose &lt;i&gt;Available Connections &lt;/i&gt;on the left-hand side of the page, and select &lt;i&gt;Windows Networking &lt;/i&gt;from the available connections (bottom half of the page). On the left-hand side of the &lt;i&gt;Windows Networking &lt;/i&gt;page, choose &lt;i&gt;Downloads&lt;/i&gt;, and select &lt;i&gt;NDIS LWF Sample With Packet Priority Detection&lt;/i&gt;.&lt;/font&gt;  &lt;p&gt;-- Hemant Banavar&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4902488" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/QoS/">QoS</category><category domain="http://blogs.msdn.com/b/wndp/archive/tags/ndis/">ndis</category></item><item><title>Detecting 802.1p Priority Tags</title><link>http://blogs.msdn.com/b/wndp/archive/2007/09/07/detecting-802-1p-priority-tags.aspx</link><pubDate>Fri, 07 Sep 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4797810</guid><dc:creator>wndpteam</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=4797810</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/09/07/detecting-802-1p-priority-tags.aspx#comments</comments><description>&lt;P&gt;&lt;FONT size=2&gt;Consider a case where a network application calls Windows QoS APIs to add a layer-2 IEEE 802.1Q UserPriority tag (almost always referred to as &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;A href="http://blogs.msdn.com/wndp/archive/2006/01/09/511020.aspx" target=_blank mce_href="http://blogs.msdn.com/wndp/archive/2006/01/09/511020.aspx"&gt;802.1p&lt;/A&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;) to outgoing traffic. Ascertaining whether the tag actually got added to an outgoing packet is not as simple as it seems due to the nature of how the Windows network stack is designed, and how framing actually occurs. From an internal implementation perspective, The QoS Packet Scheduler (Pacer.sys in Vista/2008 Server, and Psched.sys in XP/2003 Server) in the network stack merely updates an out-of-band structure (not the actual formed packet) that an 802.1Q UserPriority tag should be added. The specific NDIS structure is &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;A class="" href="http://msdn2.microsoft.com/en-us/library/bb245890.aspx" target=_blank mce_href="http://msdn2.microsoft.com/en-us/library/bb245890.aspx"&gt;NDIS_NET_BUFFER_LIST_8021Q_INFO&lt;/A&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;, which contains member variables for both VlanID and UserPriority, and is passed to the NDIS miniport driver for implementing both priority tagging (UserPriority) and VLAN (VlanId). It is up to the NDIS miniport driver to actually insert the 802.1Q tag into the frame based on these values before transmitting on the wire. A miniport driver will only insert this tag if the feature is supported and enabled in the advanced properties of the NIC driver; typically layer-2 priority tagging is disabled by default.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;From a network stack layering perspective, it’s important to understand that Pacer.sys is an NDIS Lightweight Filter (LWF) driver, and will always be inserted above a miniport driver, which will always be the lowest network software in the stack because it communicates directly with the NIC hardware. Also note that network sniffing applications like NetMon and WireShark are also network stack filters, and will always be inserted above the miniport driver. This is important knowledge because it should be clear that taking a network sniff of traffic on the sending PC will never show the tag in a packet (because the tag gets added below the sniffing software). Also,&amp;nbsp;the QoS Packet Scheduler can't know for absolute certainty whether the miniport driver added the tag to the outgoing&amp;nbsp;packet.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;What about trying to do a network sniff on the receiving PC? Good question, but also will show the layer-2 tag not present in packets. The reason for this is NDIS developer documentation clearly states that miniport drivers must strip the tag when received, and populate the NDIS_NET_BUFFER_LIST_8021Q_INFO UserPriority and VlanId fields with the values in the tag. This out-of-band structure can then be used by NDIS filter drivers higher up in the stack for implementing these features. The functional reason for stripping the layer-2 tag is because Tcpip.sys will drop any received packet that contains this tag. Therefore, if a misbehaving miniport driver does not strip the tag, the packet will never be received by the user-mode application because it will be dropped internally.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;In conclusion:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size=2&gt;A network sniffing app on the sending PC will never see a tag&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size=2&gt;A network sniffing app on the receiving PC will never see a tag &lt;/FONT&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size=2&gt;Unless the miniport driver is misbehaving, which will result in dropped packets&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;&lt;FONT size=2&gt;Monitoring tagged packets from intermediate network elements (such as a switch) is hard if at all possible&lt;/FONT&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size=2&gt;Perhaps a clever SNMP counter could be used, but would depend on the device manufacturer&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=2&gt;If you have not came to this conclusion already, the only way to determine whether a layer-2 tag got added on the sending PC and/or received by the receiving PC is to monitor the NDIS_NET_BUFFER_LIST_8021Q_INFO.UserPriority field. Stay tuned for a follow-up post which describes how to do this.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;-- Gabe Frost&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4797810" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/QoS/">QoS</category></item><item><title>The Case of Vista Multimedia Playback and Network Throughput</title><link>http://blogs.msdn.com/b/wndp/archive/2007/08/27/the-case-of-vista-multimedia-playback-and-network-throughput.aspx</link><pubDate>Mon, 27 Aug 2007 20:07:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4594525</guid><dc:creator>wndpteam</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=4594525</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/08/27/the-case-of-vista-multimedia-playback-and-network-throughput.aspx#comments</comments><description>&lt;p&gt;Mark Russinovich has a great post today on the &lt;a href="http://blogs.technet.com/markrussinovich/archive/2007/08/27/1833290.aspx"&gt;what and how of the network/multimedia vista issue&lt;/a&gt; that people have &lt;a href="http://it.slashdot.org/article.pl?sid=07/08/26/1628200"&gt;recently&lt;/a&gt; been talking about. Amusingly enough a couple people on /. more or less figured it out, but are only modded 3 and lower. Go Figure.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;-- Ari&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4594525" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/networking/">networking</category><category domain="http://blogs.msdn.com/b/wndp/archive/tags/ndis/">ndis</category></item><item><title>Ask Perf explains how winInet is used</title><link>http://blogs.msdn.com/b/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><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=4496765</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/08/21/ask-perf-explains-how-wininet-is-used.aspx#comments</comments><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/b/wndp/archive/tags/WinINet/">WinINet</category><category domain="http://blogs.msdn.com/b/wndp/archive/tags/WinHttp/">WinHttp</category></item><item><title>Receive Window Auto-Tuning on Vista.</title><link>http://blogs.msdn.com/b/wndp/archive/2007/07/05/receive-window-auto-tuning-on-vista.aspx</link><pubDate>Fri, 06 Jul 2007 02:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3715277</guid><dc:creator>wndpteam</dc:creator><slash:comments>28</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=3715277</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/07/05/receive-window-auto-tuning-on-vista.aspx#comments</comments><description>&lt;p&gt;Hi, my name is Katarzyna and I am the Program Manager within the Internet Protocols team. I have been asked a few times about the Receive Window Auto-Tuning feature on Vista and some associated issues people are having.  &lt;p&gt;One of the &lt;a href="http://www.microsoft.com/technet/community/columns/cableguy/cg1105.mspx#E4B" mce_href="http://www.microsoft.com/technet/community/columns/cableguy/cg1105.mspx#E4B"&gt;many cool new features on Windows Vista&lt;/a&gt;, &lt;a href="http://www.microsoft.com/technet/technetmag/issues/2007/01/CableGuy/default.aspx" mce_href="http://www.microsoft.com/technet/technetmag/issues/2007/01/CableGuy/default.aspx"&gt;Receive Window Auto-Tuning&lt;/a&gt; enables the networking stack to receive data more efficiently than on XP. Auto-Tuning allows the operating system to continually monitor the routing conditions (bandwidth, network delay, application delay) and configure connections (scale the TCP Receiving Window) so as to maximize the network performance.In some high bandwidth, high latency links, we have seen SMB performance improvement up to 20 times!  &lt;p&gt;In every TCP packet there is a "window" field, which informs the receiver how much data the sender can accept back. This window controls the flow by setting a threshold on data kept "in flight" and prevents overwhelming the receiver with data that it cannot accept.  &lt;p&gt;The TCP window field is 16 bits wide, allowing for a maximum window size of 64KB, which used to meet requirements of many older networks. Nowadays, however, network interfaces can handle larger packets and keep more of them in flight at any given time. Thus, a larger TCP window has become necessary; especially on high-speed, high latency networks. To fill such a long, fat pipe and make use of the available bandwidth, the sending system can often require very large windows for good performance.  &lt;p&gt;The solution to this demand is called "window scaling”, described back in 1992 in &lt;a href="http://www.ietf.org/rfc/rfc1323.txt" mce_href="http://www.ietf.org/rfc/rfc1323.txt"&gt;RFC 1323&lt;/a&gt;. It introduces an eight-bit scale factor, which serves as a multiplication factor for the window width. After the factor has been negotiated, window values used by that system on a given connection will be shifted to the left by that scale factor; a window scale of zero, thus, implies no scaling at all, while a scale factor of six implies that window sizes should be shifted six bits, thus multiplied by 2^6 = 64. Now a window greater than 64KB can be easily expressed (e.g., 128KB) by setting the scale factor (e.g., 6) and keeping the window field under the original 16 bits (here, 2048).  &lt;p&gt;The window size included in all packets is modified by the scale factor, which is negotiated once at the very beginning of a TCP connection. The connection requestor suggests window scaling factor in its original SYN packet and if the SYN+ACK packet sent in response contains the option, then this particular value will be used on this connection. The scale factor cannot be changed after the initial setup handshake; remaining data transfers on this connection will implicitly use the negotiated value.  &lt;p&gt;Older routers and firewalls however do not handle window scaling correctly leaving the option in the original SYN packet but setting the connection’s scale factor to zero. Seeing the option on, the receiver responds with its own window scale factor. Believing that its scale factor has been accepted, the initiator scales the window appropriately while the receiver thinks that a scale factor of zero is applied and thus a small window of data should follow. As a result, the communication is slow at best. Sometimes, small window packets are dropped by the routers, essentially breaking the connection.  &lt;p&gt;The resulting slow data transfers or loss of connectivity, users may experience as slow or hung networking applications. Remote Desktop Connection and network file copy are two scenarios particularly hurt by misbehaving routers.  &lt;p&gt;If your connection from a Vista machine appears slow or hung, here are some steps to isolate the cause:  &lt;ul&gt; &lt;li&gt;First, make sure that your firewall and router can support window scaling. Some devices from Linksys, Cisco, NetApp, SonicWall, Netgear, Checkpoint, D-Link were reported as having problems with window scaling. (Some of the incompatible devices are given &lt;a href="http://support.microsoft.com/kb/934430" mce_href="http://support.microsoft.com/kb/934430"&gt;here&lt;/a&gt;. You can check with the manufacturer or run the &lt;a href="http://www.microsoft.com/windows/using/tools/igd/default.mspx" mce_href="http://www.microsoft.com/windows/using/tools/igd/default.mspx"&gt;connectivity diagnostic suite&lt;/a&gt; (especially, TCP High Performance Test) provided by Microsoft to determine your gateway device’s compliance.  &lt;li&gt;Second, check with the manufacturer if a firmware update has been issued for your device that can fix the problem. Replace the problematic device or update the firmware as suggested by the manufacturer. If the router cannot be replaced or if it the device is remote (e.g., a firewall of your ISP or corporation)  &lt;li&gt;Third, If the problem still persists, you can restrict autotuning by running “&lt;b&gt;netsh interface tcp set global autotuninglevel=restricted&lt;/b&gt;” from the command prompt. We have found that restricted mode will often allow some of the benefits of autotuning with a number of problematic devices.  &lt;li&gt;Lastly, if all else fails, in order to disable this feature, run &lt;strong&gt;"netsh interface tcp set global autotuninglevel=disabled&lt;/strong&gt;".  &lt;li&gt;(In order to reenable autotuning, run “&lt;b&gt;netsh interface tcp set global autotuninglevel=normal”&lt;/b&gt;.) &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Please refer to the following KB articles for more information:  &lt;ul&gt; &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/932170" mce_href="http://support.microsoft.com/kb/932170"&gt;KB 932170: When you copy large files to or from earlier operating systems, the copy operation may be slower than expected on some Windows Vista-based computers&lt;/a&gt;  &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/929868" mce_href="http://support.microsoft.com/kb/929868"&gt;KB 929868: A Web site sends data very slowly or drops the data completely when you use Windows Vista Enterprise &lt;/a&gt; &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/935400" mce_href="http://support.microsoft.com/kb/935400"&gt;KB 935400: It takes a very long time to download an e-mail message from a POP3 server in Outlook 2007&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;-- Katarzyna&lt;/p&gt; &lt;p&gt;Updated: Broken link to KB 932170&lt;br&gt;Update 2: Changed the guidance to do restricted before disabled.&lt;br&gt;Update 3: tunning doesn't have two "n"s. :)&lt;br&gt;Update 4: no really, tuning doesn't have two "n"s.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3715277" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/wndp/archive/tags/TCP_2F00_IP/">TCP/IP</category><category domain="http://blogs.msdn.com/b/wndp/archive/tags/Windows+Server+2008/">Windows Server 2008</category></item><item><title>OffTopic: Another way to generate XML in PowerShell</title><link>http://blogs.msdn.com/b/wndp/archive/2007/06/15/offtopic-another-way-to-generate-xml-in-powershell.aspx</link><pubDate>Fri, 15 Jun 2007 20:19:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3315930</guid><dc:creator>wndpteam</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=3315930</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/06/15/offtopic-another-way-to-generate-xml-in-powershell.aspx#comments</comments><description>&lt;p&gt;I recently needed to generate XML from PowerShell and was disappointed to see the &lt;a href="http://blogs.msdn.com/powershell/archive/2007/05/29/using-powershell-to-generate-xml-documents.aspx"&gt;PowerShell blog use the old ASP model&lt;/a&gt; of doing text insertion into the middle of a big string. It might be the tester in me, or the security training, but with some unexpected input you can easily end up with malformed XML or even worse maliciously malformed XML. The other extreme would be to use .Net XML APIs to build up the XML doc from scratch, but I didn't like how much redundant code I would need to build the xml header and&amp;nbsp;I didn't find any good sample code&amp;nbsp;in&amp;nbsp;C#&amp;nbsp;to&amp;nbsp;create an XML document from scratch, so I ended up developing a middle approach. Start with a string that has nothing but the xml header and an empty top level element, convert that over to an XMLDocument, use the APIs to add data and then write out the doc to the disk.&lt;/p&gt; &lt;p&gt;For example:&lt;/p&gt; &lt;p&gt;$doc = [xml] "&amp;lt;?xml version=""1.0"" encoding=""utf-8""?&amp;gt;&amp;lt;ns:RoleInstance xmlns:ns=""&lt;a href="http://namespace.microsoft.com/2007/Whatever&amp;quot;&amp;quot;/"&gt;http://namespace.microsoft.com/2007/Whatever""/&lt;/a&gt;&amp;gt;"  &lt;p&gt;$elem = $doc.CreateElement("ns:TestBuild")&lt;br&gt;$elem.SetAttribute("Product", $Product);&lt;br&gt;$elem.SetAttribute("Lab", $Lab);&lt;br&gt;$elem.SetAttribute("BuildNumber", $OSBuildNumber);&lt;br&gt;$elem.SetAttribute("SPBuildNumber", $SPBuildNumber);&lt;br&gt;$elem.SetAttribute("TimeStamp", $BuildLabString.Split(".")[4]);&lt;br&gt;$elem.SetAttribute("SKU", $SKU);&lt;br&gt;$elem.SetAttribute("Language", $SystemLocale.Split("-")[0].Trim());&lt;br&gt;$elem.SetAttribute("Culture", $SystemLocale.Split("-")[1].Trim());&lt;br&gt;$elem.SetAttribute("Architecture", $Processor);&lt;br&gt;$elem.SetAttribute("Type", $Type);&lt;br&gt;$doc.get_ChildNodes().Item(1).AppendChild($elem) | out-null&lt;/p&gt; &lt;p&gt;$elem = $doc.CreateElement("ns:Implementation");&lt;br&gt;$elem.SetAttribute("type", "WTTResource");&lt;br&gt;$elem.SetAttribute("ResourceName", $Name );&lt;br&gt;$elem.SetAttribute("ResourceId", $ResourceId );&lt;br&gt;$elem.SetAttribute("ResourceConfigurationId", $Id );&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;br&gt;$doc.get_ChildNodes().Item(1).AppendChild($elem) | out-null  &lt;p&gt;$doc.get_ChildNodes().Item(1).SetAttribute("GUID", [GUID]::NewGuid().ToString() );&lt;br&gt;$doc.save((Join-path $RolePath "RoleInstance.xml"))&amp;nbsp;  &lt;p&gt;This code uses CreateElement and SetAttribute and then associates as a child to the 2nd item in the doc ($doc.get_ChildNodes().Item(1))&amp;nbsp;which is my RoleInstance tag. By using the XML APIs I can feel confident that the information in each attribute gets properly encoded and I keep my document well formed. The only down side is that it is slightly harder to visualize the structure of the resulting XML. &lt;p&gt;&amp;nbsp; -- Ari &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://blogs.msdn.com/powershell/archive/2007/06/18/using-a-dsl-to-generate-xml-in-powershell.aspx"&gt;Bruce over at the powershell blog&lt;/a&gt; teaches me a new trick using Domain Specific Languages to do&amp;nbsp;a cleaner job of constructing the XML. Thanks Bruce!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3315930" width="1" height="1"&gt;</description></item><item><title>Windows Rally Demo'd at WinHEC</title><link>http://blogs.msdn.com/b/wndp/archive/2007/05/16/windows-rally-demo-at-winhec.aspx</link><pubDate>Wed, 16 May 2007 22:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2679177</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/wndp/rsscomments.aspx?WeblogPostID=2679177</wfw:commentRss><comments>http://blogs.msdn.com/b/wndp/archive/2007/05/16/windows-rally-demo-at-winhec.aspx#comments</comments><description>&lt;P&gt;I noticed that there was a demo of Rally technologies at the WinHEC keynote the other day, so I created &lt;A class="" href="http://blogs.msdn.com/wndp/attachment/2679177.ashx" mce_href="http://blogs.msdn.com/wndp/attachment/2679177.ashx"&gt;a link to part of the keynote with the Rally&amp;nbsp;demo&lt;/A&gt;. Enjoy.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;-- Ari Pernick&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2679177" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-02-67-91-77/Media-Link.asx" length="441" type="video/x-ms-asf" /><category domain="http://blogs.msdn.com/b/wndp/archive/tags/QoS/">QoS</category><category domain="http://blogs.msdn.com/b/wndp/archive/tags/Rally/">Rally</category></item></channel></rss>