<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Pointless Blathering</title><subtitle type="html">Peter Wieland's thoughts on Windows driver development, and occasional rants about computing in general.</subtitle><id>http://blogs.msdn.com/peterwie/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/peterwie/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2007-03-28T20:29:00Z</updated><entry><title>New KMDF white-paper out on writing a bus driver</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2008/10/21/new-kmdf-white-paper-out-on-writing-a-bus-driver.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2008/10/21/new-kmdf-white-paper-out-on-writing-a-bus-driver.aspx</id><published>2008-10-21T20:48:59Z</published><updated>2008-10-21T20:48:59Z</updated><content type="html">&lt;p&gt;Penny Orwick has been working on a white paper that talks abut using KMDF to write a bus driver.&amp;#160; It’s been stalled waiting for us lazy developers to review it, but it finally came out last night:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/whdc/driver/wdf/KMDFBusDrv.mspx"&gt;http://www.microsoft.com/whdc/driver/wdf/KMDFBusDrv.mspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9010098" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author><category term="Device Drivers General" scheme="http://blogs.msdn.com/peterwie/archive/tags/Device+Drivers+General/default.aspx" /><category term="KMDF" scheme="http://blogs.msdn.com/peterwie/archive/tags/KMDF/default.aspx" /></entry><entry><title>Pedantic Coder: Hungarian Notation</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2008/10/13/pedantic-coder-hungarian-notation.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2008/10/13/pedantic-coder-hungarian-notation.aspx</id><published>2008-10-13T18:00:00Z</published><updated>2008-10-13T18:00:00Z</updated><content type="html">&lt;p&gt;I generally dislike &lt;a href="http://en.wikipedia.org/wiki/Hungarian_notation"&gt;Hungarian Notation&lt;/a&gt;.&amp;#160; I particularly dislike what Wikipedia calls &amp;quot;System Hungarian&amp;quot;, where the prefix indicates data type, as it adds almost no value for me.&amp;#160; I dislike the more semantically oriented form of Hungarian notation where the prefix implies some broader attribute (like &amp;quot;safety&amp;quot;) because, though that does provide some value - I'm generally not fond of terse prefixes.&amp;#160; If something is an unsafe X then call it &amp;quot;unsafeX&amp;quot;, not &amp;quot;uX&amp;quot; hoping that a reader will know u means unsafe.&lt;/p&gt;  &lt;p&gt;I have taken to including units in variable names when they're (a) beyond what the underlying C/C++ types can discriminate between and (b) too basic to warrant the creation of a class.&amp;#160; For example, when a timeout is in milliseconds or microseconds i'll name the variable &amp;quot;timeoutMs&amp;quot; or &amp;quot;timeoutUs&amp;quot; so that I know which units the value is in.&amp;#160; I don't think that a &amp;quot;time&amp;quot; class is adding enough value here to create one and deal with publishing it, making it available for all the public interfaces I define, figuring out how to make it usable for C developers, etc...&amp;#160; But the difference between Ms and Us is quite large (both literally and figuratively).&lt;/p&gt;  &lt;p&gt;When I do annotate variable names i tend to use suffixes - I find it's easier (for me) to parse a list of names if the real variable name comes first.&amp;#160; A block of variables named msX, msY, msZ, ... is simply harder to read.&amp;#160; &lt;/p&gt;  &lt;p&gt;Despite this there's one set of terse suffixes that I have started using religiously - Cb, Cch &amp;amp; Ce.&amp;#160; These are count-of-bytes, count-of-characters and count-of-elements.&amp;#160; I have started using these everywhere in place of more general terms like &amp;quot;length&amp;quot; or &amp;quot;size&amp;quot; to indicate a counter for another variable.&amp;#160; I think about these as another form of unit, and it has saved my butt a couple of times – particularly if you start using the safe-string functions since you can easily see that your “length” matches the same units as the string function you’re calling.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8994682" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author><category term="Code" scheme="http://blogs.msdn.com/peterwie/archive/tags/Code/default.aspx" /></entry><entry><title>I've been style sheet hacking again</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2008/10/10/i-ve-been-style-sheet-hacking-again.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2008/10/10/i-ve-been-style-sheet-hacking-again.aspx</id><published>2008-10-11T00:08:00Z</published><updated>2008-10-11T00:08:00Z</updated><content type="html">My last post ran into a hard-coded width in the winter style.&amp;nbsp; I like the style, but i wanted the text to be full screen.&amp;nbsp; Hopefully the style-sheet override i put in will work.&amp;nbsp; If it doens't let me know in this topic and i'll try to figure it out.&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8994883" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author><category term="Other" scheme="http://blogs.msdn.com/peterwie/archive/tags/Other/default.aspx" /></entry><entry><title>Measuring DPC time</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2008/10/06/measuring-dpc-time.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2008/10/06/measuring-dpc-time.aspx</id><published>2008-10-07T03:59:00Z</published><updated>2008-10-07T03:59:00Z</updated><content type="html">&lt;P&gt;At the DDC this year we had some very useful “community forums”.&amp;nbsp; I generally come out of these feeling like I've been beaten with a sack of oranges, and this year was no exception.&amp;nbsp; But one question in particular struck my eye – someone was saying that MS didn’t provide any useful tools for figuring out why the DPC latency they were seeing on notebooks was so poor.&amp;nbsp; When he asked about this my first thought was “I bet XPerf can do that”.&lt;/P&gt;
&lt;P&gt;XPerf, for those who haven’t seen it, is part of a performance toolkit that the Windows performance team &lt;A href="http://www.microsoft.com/whdc/system/sysperf/perftools.mspx" mce_href="http://www.microsoft.com/whdc/system/sysperf/perftools.mspx"&gt;released&lt;/A&gt;.&amp;nbsp; It collects ETW events reported by various system components and then provides an … interesting … UI to pull all of those events together into graphs and visualize what in the world is going on.&lt;/P&gt;
&lt;P&gt;The down-side of XPerf is that it can be very hard to use.&amp;nbsp; Every time I approach this tool I think “wow that’s a lot of data to make sense of”.&amp;nbsp; But I would think that we can use it to collect information about what DPCs are running and how long they run for.&lt;/P&gt;
&lt;P&gt;Once I installed XPerf I went into the installation directory and looked at the tools that it provides.&amp;nbsp; There are two interesting tools – XPerf.exe and xperfview.exe.&amp;nbsp; The first allows you to easily start and stop trace sessions, merge trace logs and do some data processing on the resulting logs.&amp;nbsp; The second is the GUI visualization tool and lets you see your trace data.&amp;nbsp; Let’s start with XPerf:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;C:\xperf&amp;gt;xperf&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    Microsoft (R) Windows (R) Performance Analyzer Version 4.1.6512&lt;/PRE&gt;&lt;PRE&gt;    Performance Analyzer Command Line&lt;/PRE&gt;&lt;PRE class=alt&gt;    Copyright (c) Microsoft Corporation. All rights reserved.&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    Usage: xperf options ...&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;        xperf -help view             &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; xperfview, the graphical user interface&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;        xperf -help start            &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; logger start options&lt;/PRE&gt;&lt;PRE&gt;        xperf -help providers        &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; known tracing flags&lt;/PRE&gt;&lt;PRE class=alt&gt;        xperf -help stackwalk        &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; stack walking options&lt;/PRE&gt;&lt;PRE&gt;        xperf -help stop             &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; logger stop options&lt;/PRE&gt;&lt;PRE class=alt&gt;        xperf -help merge            &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; merge multiple trace files&lt;/PRE&gt;&lt;PRE&gt;        xperf -help processing       &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; trace processing options&lt;/PRE&gt;&lt;PRE class=alt&gt;        xperf -help symbols          &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; symbol decoding configuration&lt;/PRE&gt;&lt;PRE&gt;        xperf -help query            &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; query options&lt;/PRE&gt;&lt;PRE class=alt&gt;        xperf -help mark             &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; mark and mark-flush&lt;/PRE&gt;&lt;PRE&gt;        xperf -help format           &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; time and timespan formats on the command line&lt;/PRE&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;Well we want to use this to start a trace session, so let’s start with xperf –help start:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;C:\xperf&amp;gt;xperf -help start&lt;/PRE&gt;&lt;PRE&gt;    Trace start options:&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    xperf [-start|-update [LoggerName]] -on Flags|Groups options ...&lt;/PRE&gt;&lt;PRE class=alt&gt;            or -flush [LoggerName] ...&lt;/PRE&gt;&lt;PRE&gt;            or -SetProfInt [&amp;lt;n&amp;gt;] [cached]&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    User provider format &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; -on: (GUID|KnownProviderName)[:Flags[:Level]]&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;        -start      LoggerName       Start a logging session &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; LoggerName&lt;/PRE&gt;&lt;PRE class=alt&gt;        -update     LoggerName       Update a logging session &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; LoggerName&lt;/PRE&gt;&lt;PRE&gt;        -flush      LoggerName       Flush a logging session &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; LoggerName&lt;/PRE&gt;&lt;PRE class=alt&gt;        -on         Flags|Groups     For kernel logging sessions, the sequence of&lt;/PRE&gt;&lt;PRE&gt;                                     kernel flags and groups to be enabled,&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     separated by &lt;SPAN class=str&gt;'+'&lt;/SPAN&gt;.  For user logging&lt;/PRE&gt;&lt;PRE&gt;                                     sessions, the sequence of providers to be&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     enabled, separated by &lt;SPAN class=str&gt;'+'&lt;/SPAN&gt;.  The accepted&lt;/PRE&gt;&lt;PRE&gt;                                     provider format &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt;:&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     (GUID|KnownProviderName)[:Flags[:Level]].&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     Use &lt;SPAN class=str&gt;"xperf -help providers"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; a list of&lt;/PRE&gt;&lt;PRE&gt;                                     valid flags&lt;/PRE&gt;&lt;PRE class=alt&gt;        -f          filename         Log events to specified file; &lt;SPAN class=kwrd&gt;default&lt;/SPAN&gt;:&lt;/PRE&gt;&lt;PRE&gt;                                     \kernel.etl &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; kernel traces and \user.etl&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; user traces&lt;/PRE&gt;&lt;PRE&gt;        -BufferSize Size             Set trace buffer size to Size KB (4 KB -&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     1024 KB); &lt;SPAN class=kwrd&gt;default&lt;/SPAN&gt;: 64 KB&lt;/PRE&gt;&lt;PRE&gt;        -MinBuffers n                Set minimum number of trace buffers to n;&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     &lt;SPAN class=kwrd&gt;default&lt;/SPAN&gt;: 64&lt;/PRE&gt;&lt;PRE&gt;        -MaxBuffers n                Set maximum number of trace buffers to n;&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     &lt;SPAN class=kwrd&gt;default&lt;/SPAN&gt;: 320&lt;/PRE&gt;&lt;PRE&gt;        -MaxFile    Size             Set maximum file size to Size MB&lt;/PRE&gt;&lt;PRE class=alt&gt;        -FlushTimer n                Set the flush timer to n seconds&lt;/PRE&gt;&lt;PRE&gt;        -BootTrace  Flags|Groups|off Config the Event Tracing For Windows Logger &lt;/PRE&gt;&lt;PRE class=alt&gt;                                     to trace boot.  Set flags &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; &lt;SPAN class=str&gt;"off"&lt;/SPAN&gt; to turn &lt;/PRE&gt;&lt;PRE&gt;                                     off boot tracing.  All loggering control can&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     be used &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; conjunction with &lt;SPAN class=kwrd&gt;this&lt;/SPAN&gt;.  Use &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                                     conjunction with -f to log to a file other &lt;/PRE&gt;&lt;PRE class=alt&gt;                                     than \Perf.etl.&lt;/PRE&gt;&lt;PRE&gt;        -RealTime                    Enable real time tracing&lt;/PRE&gt;&lt;PRE class=alt&gt;        -Buffering                   Enable buffering mode tracing&lt;/PRE&gt;&lt;PRE&gt;        -FileMode   Mode             Set the File Mode; &lt;SPAN class=kwrd&gt;default&lt;/SPAN&gt;: Sequential.&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     Mode: Sequential, Circular, Append, NewFile&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;        -ClockType  ClockType        Set the clock type; &lt;SPAN class=kwrd&gt;default&lt;/SPAN&gt;: PerfCounter.&lt;/PRE&gt;&lt;PRE&gt;                                     Type: Cycle, PerfCounter, SystemTime.&lt;/PRE&gt;&lt;PRE class=alt&gt;        -StackWalk  flags|@file      Enable stack walking &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; the events&lt;/PRE&gt;&lt;PRE&gt;                                     specified &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; Flag+Flag+..., or parse &lt;SPAN class=str&gt;'file'&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE class=alt&gt;                                     file &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; flags. Run &lt;SPAN class=str&gt;"xperf -help stackwalk"&lt;/SPAN&gt; &lt;/PRE&gt;&lt;PRE&gt;                                     &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; more information.&lt;/PRE&gt;&lt;PRE class=alt&gt;        -Pids       pid [...]        Apply flags to processes pid [...].  Used &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;                                     conjunction with &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; loggers.&lt;/PRE&gt;&lt;PRE class=alt&gt;        -PidNewProcess &amp;lt;command-line&amp;gt;   Apply flags to a &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; process xperf will &lt;/PRE&gt;&lt;PRE&gt;                                     start with &amp;lt;command-line&amp;gt;.  Used &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     conjunction with &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; loggers.&lt;/PRE&gt;&lt;PRE&gt;        -heap                        Enable heap tracing &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; processes specified &lt;/PRE&gt;&lt;PRE class=alt&gt;                                     by Pids and PidNewProcess.&lt;/PRE&gt;&lt;PRE&gt;        -critsec                     Enable critical section tracing &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; processes&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     specified by Pids and PidNewProcess.&lt;/PRE&gt;&lt;PRE&gt;        -SetProfInt [&amp;lt;n&amp;gt;] [cached]   Set sampled profile interval to &amp;lt;n&amp;gt; [1221 ..&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     10000000].  If &lt;SPAN class=str&gt;"cached"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; specified,&lt;/PRE&gt;&lt;PRE&gt;                                     intervals are cached &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; ETW and reapplied&lt;/PRE&gt;&lt;PRE class=alt&gt;                                     whenever &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ETW kernel loggers with sampled&lt;/PRE&gt;&lt;PRE&gt;                                     profile are started. [Default: &amp;lt;n&amp;gt; = 10000; &lt;/PRE&gt;&lt;PRE class=alt&gt;                                     not cached]&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    Multiple loggers can be started &lt;SPAN class=kwrd&gt;using&lt;/SPAN&gt; multiple -start options, each followed by&lt;/PRE&gt;&lt;PRE&gt;    the options to be applied to that logger.  If LoggerName, or -start LoggerName,&lt;/PRE&gt;&lt;PRE class=alt&gt;    &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; omitted, the Kernel Logger &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; implied.  Only a single instance of Kernel &lt;/PRE&gt;&lt;PRE&gt;    Logger can exist at any time.  If one of the loggers fails to start, all the &lt;/PRE&gt;&lt;PRE class=alt&gt;    already started loggers are stopped.&lt;/PRE&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The only required argument to –start is a set of flags.&amp;nbsp; The definition of Flags says to look at xperf providers to see what the possible flags are.&amp;nbsp; The help for that command says:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;C:\xperf&amp;gt;xperf -help providers&lt;/PRE&gt;&lt;PRE&gt;    Providers Query options:&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    xperf -providers [Installed|I] [Registered|R] [KernelFlags|KF] [KernelGroups|KG] [Kernel|K]&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    Query all installed/known and registered providers, &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; well &lt;SPAN class=kwrd&gt;as&lt;/SPAN&gt; all known kernel flags and groups.&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    The following options are supported:&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;        I,  Installed    : include Installed/known providers&lt;/PRE&gt;&lt;PRE class=alt&gt;        R,  Registered   : include Registered providers&lt;/PRE&gt;&lt;PRE&gt;        KF, KernelFlags  : include Kernel Flags&lt;/PRE&gt;&lt;PRE class=alt&gt;        KG, KernelGroups : include Kernel Groups&lt;/PRE&gt;&lt;PRE&gt;        K,  Kernel       : include Kernel flags and groups; shortcut &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; &lt;SPAN class=str&gt;"KF KG"&lt;/SPAN&gt;.&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    If no options are specified, all providers are included &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; the output.&lt;/PRE&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;We want to look at DPC’s, so let’s dump just the kernel providers (if only because dumping all of them would probably exceed what I can post in one blog entry &lt;IMG alt=Smile src="http://messenger.msn.com/MMM2006-04-19_17.00/Resource/emoticons/regular_smile.gif" mce_src="http://messenger.msn.com/MMM2006-04-19_17.00/Resource/emoticons/regular_smile.gif"&gt;).&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;C:\xperf&amp;gt;xperf -providers K&lt;/PRE&gt;&lt;PRE&gt;Kernel Flags:&lt;/PRE&gt;&lt;PRE class=alt&gt;       PROC_THREAD    : Process and Thread create/delete&lt;/PRE&gt;&lt;PRE&gt;       LOADER         : Kernel and user mode Image Load/Unload events&lt;/PRE&gt;&lt;PRE class=alt&gt;       PROFILE        : CPU Sample profile&lt;/PRE&gt;&lt;PRE&gt;       CSWITCH        : Context Switch&lt;/PRE&gt;&lt;PRE class=alt&gt;       COMPACT_CSWITCH: Compact Context Switch&lt;/PRE&gt;&lt;PRE&gt;       DISPATCHER     : CPU Scheduler&lt;/PRE&gt;&lt;PRE class=alt&gt;       DPC            : DPC Events&lt;/PRE&gt;&lt;PRE&gt;       INTERRUPT      : Interrupt events&lt;/PRE&gt;&lt;PRE class=alt&gt;       SYSCALL        : System calls&lt;/PRE&gt;&lt;PRE&gt;       PRIORITY       : Priority change events&lt;/PRE&gt;&lt;PRE class=alt&gt;       ALPC           : Advanced Local Procedure Call&lt;/PRE&gt;&lt;PRE&gt;       PERF_COUNTER   : Process Perf Counters&lt;/PRE&gt;&lt;PRE class=alt&gt;       DISK_IO        : Disk I/O&lt;/PRE&gt;&lt;PRE&gt;       DISK_IO_INIT   : Disk I/O Initiation&lt;/PRE&gt;&lt;PRE class=alt&gt;       FILE_IO        : File system operation end times and results&lt;/PRE&gt;&lt;PRE&gt;       FILE_IO_INIT   : File system operation (create/open/close/read/write)&lt;/PRE&gt;&lt;PRE class=alt&gt;       HARD_FAULTS    : Hard Page Faults&lt;/PRE&gt;&lt;PRE&gt;       FILENAME       : FileName (e.g., FileName create/delete/rundown)&lt;/PRE&gt;&lt;PRE class=alt&gt;       SPLIT_IO       : Split I/O&lt;/PRE&gt;&lt;PRE&gt;       REGISTRY       : Registry tracing&lt;/PRE&gt;&lt;PRE class=alt&gt;       DRIVERS        : Driver events&lt;/PRE&gt;&lt;PRE&gt;       POWER          : Power management events&lt;/PRE&gt;&lt;PRE class=alt&gt;       NETWORKTRACE   : Network events (e.g., tcp/udp send/receive)&lt;/PRE&gt;&lt;PRE&gt;       VIRT_ALLOC     : Virtual allocation reserve and release&lt;/PRE&gt;&lt;PRE class=alt&gt;       MEMINFO        : Memory List Info&lt;/PRE&gt;&lt;PRE&gt;       ALL_FAULTS     : All page faults including hard, Copy on write, demand zero faults, etc.&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Kernel Groups:&lt;/PRE&gt;&lt;PRE class=alt&gt;       Base           : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+PROFILE+MEMINFO&lt;/PRE&gt;&lt;PRE&gt;       Diag           : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PERF_COUNTER+COMPACT_CSWITCH&lt;/PRE&gt;&lt;PRE class=alt&gt;       DiagEasy       : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PERF_COUNTER&lt;/PRE&gt;&lt;PRE&gt;       Latency        : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PROFILE&lt;/PRE&gt;&lt;PRE class=alt&gt;       FileIO         : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+FILE_IO+FILE_IO_INIT&lt;/PRE&gt;&lt;PRE&gt;       IOTrace        : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+CSWITCH&lt;/PRE&gt;&lt;PRE class=alt&gt;       ResumeTrace    : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+PROFILE+POWER&lt;/PRE&gt;&lt;PRE&gt;       SysProf        : PROC_THREAD+LOADER+PROFILE&lt;/PRE&gt;&lt;PRE class=alt&gt;       Network        : PROC_THREAD+LOADER+NETWORKTRACE&lt;/PRE&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;That “Latency” group sounds interesting – it includes DPCs and interrupts along with process/thread create/delete and loader events (both of which it turns out are needed if you want to see what process anything is happening in).&amp;nbsp; So let’s start up a trace session for “Latency”.&amp;nbsp; &lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;C:\xperf&amp;gt;xperf -on Latency&lt;/PRE&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;Now to create some “load” I'll use WMP to watch the stock footage of a bear in the river.&amp;nbsp; Then I exit WMP and stop the trace:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;C:\xperf&amp;gt;xperf -stop&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;C:\xperf&amp;gt;dir \kernel.etl&lt;/PRE&gt;&lt;PRE&gt; Volume &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; drive C &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; Safe&lt;/PRE&gt;&lt;PRE class=alt&gt; Volume Serial Number &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; 042D-D2B2&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt; Directory of C:\&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;10/06/2008  04:52 PM        16,384,000 kernel.etl&lt;/PRE&gt;&lt;PRE&gt;               1 File(s)     16,384,000 bytes&lt;/PRE&gt;&lt;PRE class=alt&gt;               0 Dir(s)  57,208,664,064 bytes free&lt;/PRE&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;By default the kernel logger dumped all 16 MB of output into c:\kernel.etl.&amp;nbsp; Now if we want to see what’s in that file we can load it up with xperfview:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;C:\xperf&amp;gt;xperfview \kernel.etl&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_4.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_1.png" width=639 height=484 mce_src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;These are two of 15 different graphs that XPerf makes available from the .ETL file.&amp;nbsp; Here we can see the CPU time for both of my CPUs as well as a count of disk I/O operations in flight over the collection period.&amp;nbsp; I have pulled out the menu of “frames” that you can enable (clicking on the chevron in the middle will make it disappear or reappear).&lt;/P&gt;
&lt;P&gt;Let’s say that I want to drill in on this a little bit, and look at CPU time just for a single process – say WMPLAYER.EXE since I was watching a video.&amp;nbsp; I can select the “CPU Sampling by Process” option from the frame list:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_8.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_3.png" width=644 height=232 mce_src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;And then click the down arrow next to “Processes” and select just WMPLAYER.EXE (The short cut to do this is to click All, then click it again to unselect everything, then scroll and find just the one or two processes that you need").&amp;nbsp; If we do this with Disk Utilization as well, and remove the intervening frames we can get a side-by-side view of CPU activity and disk I/O for one process that looks like this:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_10.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_4.png" width=636 height=484 mce_src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_4.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We can also overlay the DPC activity on top of the CPU graph if we want.&amp;nbsp; Right click in the CPU Sampling by processor frame and choose “Overlay Graph” then “DPC CPU Usage” and “All” processors:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_12.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_5.png" width=644 height=230 mce_src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_5.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;The red and blue lines are CPU 0 and CPU 1 respectively, with the yellow line still showing normal CPU utilization for WMPLAYER.EXE.&lt;/P&gt;
&lt;P&gt;XPerfView also has the ability to show you your data in pivot-table form.&amp;nbsp; Let’s say we want to look at DPC CPU Utilization.&amp;nbsp; Right click on any frame showing DPC data (either the merged graph we just setup above, or re-enable the DPC frame from the frame list) and choose “Summary Table” and you’ll get something like this:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_14.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_6.png" width=644 height=362 mce_src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_6.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is showing us every DPC event in the .ETL file.&amp;nbsp; The columns on the left of the yellow line control how the data is grouped and the columns to the right of the line show us the aggregate results for that grouping.&amp;nbsp; Here we’re grouped by module name and we can see the total count and average and max duration of all of the DPCs for that module.&amp;nbsp; NDIS stands out with a 2.6 ms DPC.&amp;nbsp; If you want to see every DPC in a particular module (sorted by “Enter Time”) you can click the + box next to the name and the view will expand.&lt;/P&gt;
&lt;P&gt;Let’s say we want to see all the entries grouped not just by module but by the actual DPC routine within that module.&amp;nbsp; The function column shows us the address of the DPC routine that was executed.&amp;nbsp; If we drag that to the right of the yellow line we get a new grouping:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_16.png" mce_href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_16.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_7.png" width=636 height=484 mce_src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_7.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;For each module we can see which DPC function is being called the most and which one is taking up so much time.&amp;nbsp; You can use this to find out other things, like which threads in WMP are taking up time and what thread routine they are running.&amp;nbsp; Go back and enable the CPU Utilization by processor frame then get a summary table for that:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_18.png" mce_href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_18.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_8.png" width=644 height=470 mce_src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/MeasuringDPCtime_EA29/image_thumb_8.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;This would all be more impressive if symbol loading were working.&amp;nbsp; In theory XPerf can load symbols and use them to determine the name of the function rather than just showing an address or “Unknown”.&amp;nbsp; However I’ve rarely gotten symbol loading to work, and when it does work it still seems pretty fragile.&amp;nbsp; If you use xperf –help symbols it provides some help on getting symbols working.&lt;/P&gt;
&lt;P&gt;There’s one more handy trick that I found while I was trying to get symbols to work.&amp;nbsp; XPerf.exe has some processing options too.&amp;nbsp; XPerf –help processing shows us a list of the options:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;C:\xperf&amp;gt;xperf -help processing&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    Trace Post-Processing options:&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;        xperf -I &amp;lt;trace file&amp;gt; ... [-o output] [-symbols ...] [-target {human|machine}]&lt;/PRE&gt;&lt;PRE&gt;                           [-a action ... [-a action ...] ...]&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;        -I       trace file       The trace file to be processed.&lt;/PRE&gt;&lt;PRE class=alt&gt;        -o       output file      Optional, the name of the file that output goes to.  If not&lt;/PRE&gt;&lt;PRE&gt;                                  given, stdout &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; used.&lt;/PRE&gt;&lt;PRE class=alt&gt;        -symbols [options]        Enable and configure symbol decoding support.&lt;/PRE&gt;&lt;PRE&gt; See &lt;SPAN class=str&gt;"xperf&lt;/PRE&gt;&lt;PRE class=alt&gt;                                  -help symbols"&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; detailed help&lt;/PRE&gt;&lt;PRE&gt;        -target  {human|machine}  Select the target audience of the output. Default &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; human.&lt;/PRE&gt;&lt;PRE class=alt&gt;        -quiet                    Do not print progress information.&lt;/PRE&gt;&lt;PRE&gt;        -tle                      Process the trace even &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; the presence of lost events.&lt;/PRE&gt;&lt;PRE class=alt&gt;        -tti                      Process the trace even &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; the presence of time inversions.&lt;/PRE&gt;&lt;PRE&gt;        -a       action ...       Optional, the actions to take.  Default action &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; to dump&lt;/PRE&gt;&lt;PRE class=alt&gt;                                  the &lt;SPAN class=kwrd&gt;event&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; text form.&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;    Examples:&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;        xperf -I trace.etl -o &lt;SPAN class=kwrd&gt;out&lt;/SPAN&gt;.csv      : dump the events &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; trace.etl to file &lt;SPAN class=kwrd&gt;out&lt;/SPAN&gt;.csv&lt;/PRE&gt;&lt;PRE&gt;        xperf -help registry               : print help on action registry&lt;/PRE&gt;&lt;PRE class=alt&gt;        xperf -I trace.etl -a registry     : print registry access statistics to stdout&lt;/PRE&gt;&lt;PRE&gt;        xperf -I trace32.etl trace64.etl -o &lt;SPAN class=kwrd&gt;out&lt;/SPAN&gt;.csv : dump the events &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; trace32.etl and trace64.etl to file &lt;SPAN class=kwrd&gt;out&lt;/SPAN&gt;.csv&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    Available Actions:&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;        boot             Show boot and shutdown statistics&lt;/PRE&gt;&lt;PRE class=alt&gt;        bootprefetch     Show boot-time prefetching information&lt;/PRE&gt;&lt;PRE&gt;        cpudisk          Show CPU/Disk activity report&lt;/PRE&gt;&lt;PRE class=alt&gt;        cswitch          Show Context Switch data&lt;/PRE&gt;&lt;PRE&gt;        diskio           Show Disk IO Statistics&lt;/PRE&gt;&lt;PRE class=alt&gt;        dpcisr           Show DPC/ISR Statistics&lt;/PRE&gt;&lt;PRE&gt;        drvdelay         Show Driver delays&lt;/PRE&gt;&lt;PRE class=alt&gt;        dumper           Dump events &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; the trace &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; text form&lt;/PRE&gt;&lt;PRE&gt;        filename         Show File Names &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; the trace&lt;/PRE&gt;&lt;PRE class=alt&gt;        focuschange      Show the Windows thread focus change events &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; the trace&lt;/PRE&gt;&lt;PRE&gt;        hardfault        Show hard fault statistics by process and file.&lt;/PRE&gt;&lt;PRE class=alt&gt;        marks            Show Marks Information&lt;/PRE&gt;&lt;PRE&gt;        pagefault        Show page fault information &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; the trace&lt;/PRE&gt;&lt;PRE class=alt&gt;        perfctrs         Show process performance counters.&lt;/PRE&gt;&lt;PRE&gt;        pnp              Show PnP events &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; the trace&lt;/PRE&gt;&lt;PRE class=alt&gt;        prefetch         Show Prefetch Information&lt;/PRE&gt;&lt;PRE&gt;        process          Show process, thread, image information&lt;/PRE&gt;&lt;PRE class=alt&gt;        profile          Show Sampled profiler data&lt;/PRE&gt;&lt;PRE&gt;        readyBoot        Show ReadyBoot statistics&lt;/PRE&gt;&lt;PRE class=alt&gt;        registry         Show Registry Access Statistics&lt;/PRE&gt;&lt;PRE&gt;        services         Show service status information&lt;/PRE&gt;&lt;PRE class=alt&gt;        shutdown         Show shutdown statistics&lt;/PRE&gt;&lt;PRE&gt;        stack            Show Stack Information&lt;/PRE&gt;&lt;PRE class=alt&gt;        suspend          Show Suspend Transition Information&lt;/PRE&gt;&lt;PRE&gt;        sysconfig        Show System Configuration&lt;/PRE&gt;&lt;PRE class=alt&gt;        tracestats       Show Trace Statistics&lt;/PRE&gt;&lt;PRE&gt;        winlogon         Show Winlogon events &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; the trace&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    xperf -help &amp;lt;action&amp;gt; [&amp;lt;action&amp;gt; ...] &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; detailed help&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;    If no action &lt;SPAN class=kwrd&gt;is&lt;/SPAN&gt; present, dumper will be invoked.&lt;/PRE&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Since this all started with DPC latency, let’s try out that dpcisr action, which will “Show DPC/ISR Statistics” and see what it has:&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;C:\xperf&amp;gt;xperf -I \kernel.etl -symbols verbose -a dpcisr&lt;/PRE&gt;&lt;PRE&gt;xperf: Using symbol path: srv*c:\DownstreamStore*http:&lt;SPAN class=rem&gt;//msdl.microsoft.com/download/symbols&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=alt&gt;xperf: Using executable path: srv*c:\DownstreamStore*http:&lt;SPAN class=rem&gt;//msdl.microsoft.com/download/symbols&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE&gt;xperf: Using SymCache path: c:\DownstreamStore&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;--------------------------&lt;/PRE&gt;&lt;PRE class=alt&gt;DPC Info&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;--------------------------&lt;/PRE&gt;&lt;PRE&gt;CPU Usage Summing By Module For the Whole Trace&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;CPU Usage from 0 us to 24682000 us:&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;     CPU 0 Usage      CPU 1 Usage&lt;/PRE&gt;&lt;PRE class=alt&gt;     usec      %      usec      % Module&lt;/PRE&gt;&lt;PRE&gt;      248   0.00         0   0.00 CLASSPNP.SYS&lt;/PRE&gt;&lt;PRE class=alt&gt;       31   0.00         0   0.00 HTTP.sys&lt;/PRE&gt;&lt;PRE&gt;      562   0.00         0   0.00 NETIO.SYS&lt;/PRE&gt;&lt;PRE class=alt&gt;       17   0.00         0   0.00 Ntfs.sys&lt;/PRE&gt;&lt;PRE&gt;     5121   0.02         0   0.00 USBPORT.SYS&lt;/PRE&gt;&lt;PRE class=alt&gt;      273   0.00         0   0.00 afd.sys&lt;/PRE&gt;&lt;PRE&gt;    16752   0.07       135   0.00 ataport.SYS&lt;/PRE&gt;&lt;PRE class=alt&gt;      101   0.00        36   0.00 b57nd60x.sys&lt;/PRE&gt;&lt;PRE&gt;        1   0.00         0   0.00 fltmgr.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;        5   0.00         0   0.00 hal.dll&lt;/PRE&gt;&lt;PRE&gt;     3851   0.02         0   0.00 i8042prt.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;       14   0.00         0   0.00 luafv.sys&lt;/PRE&gt;&lt;PRE&gt;   981815   3.98         0   0.00 ndis.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;      239   0.00         0   0.00 netbt.sys&lt;/PRE&gt;&lt;PRE&gt;     2364   0.01       227   0.00 ntkrnlpa.exe&lt;/PRE&gt;&lt;PRE class=alt&gt;    37360   0.15         0   0.00 portcls.sys&lt;/PRE&gt;&lt;PRE&gt;      119   0.00       103   0.00 rassstp.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;      317   0.00         0   0.00 rdbss.sys&lt;/PRE&gt;&lt;PRE&gt;       27   0.00        17   0.00 srv.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;        4   0.00         0   0.00 srvnet.sys&lt;/PRE&gt;&lt;PRE&gt;    62926   0.25     49358   0.20 tcpip.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;     5054   0.02         0   0.00 usbhub.sys&lt;/PRE&gt;&lt;PRE&gt;        6   0.00         0   0.00 watchdog.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 43599&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,     49, or   0.11%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,    379, or   0.87%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,  10388, or  23.83%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,   9765, or  22.40%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,   7806, or  17.90%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,   3885, or   8.91%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,   5375, or  12.33%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       64 usecs AND &amp;lt;=      128 usecs,   5175, or  11.87%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;      128 usecs AND &amp;lt;=      256 usecs,    639, or   1.47%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;      256 usecs AND &amp;lt;=      512 usecs,     55, or   0.13%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;      512 usecs AND &amp;lt;=     1024 usecs,     55, or   0.13%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;     1024 usecs AND &amp;lt;=     2048 usecs,     22, or   0.05%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;     2048 usecs AND &amp;lt;=     4096 usecs,      6, or   0.01%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                 43599&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 10 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module CLASSPNP.SYS&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      2, or  20.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      3, or  30.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,      5, or  50.00%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                    10&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 8 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module HTTP.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      1, or  12.50%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      3, or  37.50%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      4, or  50.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                     8&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 124 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module NETIO.SYS&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,     57, or  45.97%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,     61, or  49.19%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,      5, or   4.03%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,      1, or   0.81%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                   124&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 5 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module Ntfs.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      4, or  80.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      1, or  20.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                     5&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 481 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module USBPORT.SYS&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,     81, or  16.84%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,     64, or  13.31%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,    257, or  53.43%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,     76, or  15.80%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,      3, or   0.62%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                   481&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 44 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module afd.sys&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      1, or   2.27%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      3, or   6.82%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,     30, or  68.18%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,      9, or  20.45%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,      1, or   2.27%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                    44&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 736 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module ataport.SYS&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,     15, or   2.04%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,     28, or   3.80%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,    207, or  28.13%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,    335, or  45.52%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,    139, or  18.89%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       64 usecs AND &amp;lt;=      128 usecs,     12, or   1.63%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                   736&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 50 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module b57nd60x.sys&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,     23, or  46.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,     19, or  38.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      6, or  12.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,      1, or   2.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,      1, or   2.00%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                    50&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 1 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module fltmgr.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      1, or 100.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                     1&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 1 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module hal.dll&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      1, or 100.00%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                     1&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 329 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module i8042prt.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      9, or   2.74%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,    298, or  90.58%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,     22, or   6.69%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                   329&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 5 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module luafv.sys&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      1, or  20.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      3, or  60.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      1, or  20.00%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                     5&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 32833 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module ndis.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,    178, or   0.54%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,   9073, or  27.63%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,   7653, or  23.31%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,   4082, or  12.43%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,   1930, or   5.88%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,   4425, or  13.48%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       64 usecs AND &amp;lt;=      128 usecs,   4727, or  14.40%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;      128 usecs AND &amp;lt;=      256 usecs,    627, or   1.91%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;      256 usecs AND &amp;lt;=      512 usecs,     55, or   0.17%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;      512 usecs AND &amp;lt;=     1024 usecs,     55, or   0.17%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;     1024 usecs AND &amp;lt;=     2048 usecs,     22, or   0.07%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;     2048 usecs AND &amp;lt;=     4096 usecs,      6, or   0.02%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                 32833&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 10 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module netbt.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,     10, or 100.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                    10&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 597 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module ntkrnlpa.exe&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,     43, or   7.20%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,    129, or  21.61%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,    344, or  57.62%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,     50, or   8.38%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,      4, or   0.67%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,      3, or   0.50%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,     23, or   3.85%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       64 usecs AND &amp;lt;=      128 usecs,      1, or   0.17%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                   597&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 2087 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module portcls.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      1, or   0.05%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,    216, or  10.35%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,    675, or  32.34%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,   1076, or  51.56%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,    119, or   5.70%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                  2087&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 100 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module rassstp.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,     37, or  37.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,     62, or  62.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      1, or   1.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                   100&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 99 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module rdbss.sys&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,     87, or  87.88%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      8, or   8.08%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,      4, or   4.04%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                    99&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 13 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module srv.sys&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      1, or   7.69%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      8, or  61.54%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      4, or  30.77%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                    13&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 2 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module srvnet.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      1, or  50.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      1, or  50.00%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                     2&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 4998 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module tcpip.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      1, or   0.02%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,     48, or   0.96%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,   1242, or  24.85%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,   2179, or  43.60%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,    421, or   8.42%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,    660, or  13.21%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       64 usecs AND &amp;lt;=      128 usecs,    435, or   8.70%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;      128 usecs AND &amp;lt;=      256 usecs,     12, or   0.24%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                  4998&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 1060 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module usbhub.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,    579, or  54.62%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,    386, or  36.42%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,     85, or   8.02%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,      9, or   0.85%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,      1, or   0.09%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                  1060&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 6 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module watchdog.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      3, or  50.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      3, or  50.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                     6&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;All Module =  43599,  Total = 43599,   EQUAL&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;--------------------------&lt;/PRE&gt;&lt;PRE&gt;Usage From 0 ms to 24682 ms, Summing In 1 second intervals. Intervals=25&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;                             CPU 0 Usage       CPU 1 Usage&lt;/PRE&gt;&lt;PRE class=alt&gt;Start (ms) End (ms)        (usec)      %     (usec)      %&lt;/PRE&gt;&lt;PRE&gt;         0-1000      :     33992,   3.40       897,   0.09&lt;/PRE&gt;&lt;PRE class=alt&gt;      1000-2000      :     24437,   2.44      1332,   0.13&lt;/PRE&gt;&lt;PRE&gt;      2000-3000      :     42317,   4.23      4510,   0.45&lt;/PRE&gt;&lt;PRE class=alt&gt;      3000-4000      :     40179,   4.02      1757,   0.18&lt;/PRE&gt;&lt;PRE&gt;      4000-5000      :     34190,   3.42       988,   0.10&lt;/PRE&gt;&lt;PRE class=alt&gt;      5000-6000      :     19434,   1.94      2066,   0.21&lt;/PRE&gt;&lt;PRE&gt;      6000-7000      :     25339,   2.53      2618,   0.26&lt;/PRE&gt;&lt;PRE class=alt&gt;      7000-8000      :     46758,   4.68      1691,   0.17&lt;/PRE&gt;&lt;PRE&gt;      8000-9000      :     81696,   8.17      1998,   0.20&lt;/PRE&gt;&lt;PRE class=alt&gt;      9000-10000     :     77932,   7.79      1500,   0.15&lt;/PRE&gt;&lt;PRE&gt;     10000-11000     :     64336,   6.43      1684,   0.17&lt;/PRE&gt;&lt;PRE class=alt&gt;     11000-12000     :     45099,   4.51      2311,   0.23&lt;/PRE&gt;&lt;PRE&gt;     12000-13000     :     59469,   5.95      1890,   0.19&lt;/PRE&gt;&lt;PRE class=alt&gt;     13000-14000     :     44035,   4.40      2393,   0.24&lt;/PRE&gt;&lt;PRE&gt;     14000-15000     :     50393,   5.04      2455,   0.25&lt;/PRE&gt;&lt;PRE class=alt&gt;     15000-16000     :     71508,   7.15      1694,   0.17&lt;/PRE&gt;&lt;PRE&gt;     16000-17000     :     56853,   5.69      2054,   0.21&lt;/PRE&gt;&lt;PRE class=alt&gt;     17000-18000     :     63219,   6.32      4046,   0.40&lt;/PRE&gt;&lt;PRE&gt;     18000-19000     :     62428,   6.24      4742,   0.47&lt;/PRE&gt;&lt;PRE class=alt&gt;     19000-20000     :     33793,   3.38      1134,   0.11&lt;/PRE&gt;&lt;PRE&gt;     20000-21000     :     28147,   2.81       759,   0.08&lt;/PRE&gt;&lt;PRE class=alt&gt;     21000-22000     :     30630,   3.06       640,   0.06&lt;/PRE&gt;&lt;PRE&gt;     22000-23000     :     33294,   3.33       710,   0.07&lt;/PRE&gt;&lt;PRE class=alt&gt;     23000-24000     :     26121,   2.61      1819,   0.18&lt;/PRE&gt;&lt;PRE&gt;     24000-24682     :     21608,   3.17      2177,   0.32&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;--------------------------&lt;/PRE&gt;&lt;PRE class=alt&gt;Interrupt Info&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;--------------------------&lt;/PRE&gt;&lt;PRE&gt;CPU Usage Summing By Module For the Whole Trace&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;CPU Usage from 0 us to 24682000 us:&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;     CPU 0 Usage      CPU 1 Usage&lt;/PRE&gt;&lt;PRE class=alt&gt;     usec      %      usec      % Module&lt;/PRE&gt;&lt;PRE&gt;    10420   0.04         0   0.00 USBPORT.SYS&lt;/PRE&gt;&lt;PRE class=alt&gt;    46437   0.19         0   0.00 VIDEOPRT.SYS&lt;/PRE&gt;&lt;PRE&gt;      125   0.00         0   0.00 acpi.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;     7657   0.03         0   0.00 ataport.SYS&lt;/PRE&gt;&lt;PRE&gt;     8722   0.04         0   0.00 i8042prt.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;    72940   0.30         0   0.00 ndis.sys&lt;/PRE&gt;&lt;PRE&gt;    13633   0.06         0   0.00 portcls.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 48319&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,  12026, or  24.89%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,  24954, or  51.64%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,   9693, or  20.06%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,   1611, or   3.33%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,     29, or   0.06%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,      6, or   0.01%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                 48319&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 2256 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module USBPORT.SYS&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,    602, or  26.68%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,   1556, or  68.97%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,     97, or   4.30%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,      1, or   0.04%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                  2256&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 20976 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module VIDEOPRT.SYS&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,  12026, or  57.33%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,   7821, or  37.29%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,   1081, or   5.15%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,     43, or   0.20%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,      1, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,      4, or   0.02%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                 20976&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 11 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module acpi.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,     11, or 100.00%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                    11&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 811 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module ataport.SYS&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,    225, or  27.74%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,    574, or  70.78%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,     12, or   1.48%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                   811&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 1178 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module i8042prt.sys&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,    905, or  76.83%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,    260, or  22.07%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,     12, or   1.02%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       32 usecs AND &amp;lt;=       64 usecs,      1, or   0.08%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                  1178&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Total = 20976 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module ndis.sys&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,  16181, or  77.14%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,   4713, or  22.47%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,     81, or   0.39%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,      1, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Total,                                                 20976&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;Total = 2111 &lt;SPAN class=kwrd&gt;for&lt;/SPAN&gt; module portcls.sys&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        0 usecs AND &amp;lt;=        1 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        1 usecs AND &amp;lt;=        2 usecs,      0, or   0.00%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        2 usecs AND &amp;lt;=        4 usecs,    350, or  16.58%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;        4 usecs AND &amp;lt;=        8 usecs,   1213, or  57.46%&lt;/PRE&gt;&lt;PRE class=alt&gt;Elapsed Time, &amp;gt;        8 usecs AND &amp;lt;=       16 usecs,    545, or  25.82%&lt;/PRE&gt;&lt;PRE&gt;Elapsed Time, &amp;gt;       16 usecs AND &amp;lt;=       32 usecs,      3, or   0.14%&lt;/PRE&gt;&lt;PRE class=alt&gt;Total,                                                  2111&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;All Module =  48319,  Total = 48319,   EQUAL&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;--------------------------&lt;/PRE&gt;&lt;PRE&gt;Usage From 0 ms to 24682 ms, Summing In 1 second intervals. Intervals=25&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;                             CPU 0 Usage       CPU 1 Usage&lt;/PRE&gt;&lt;PRE class=alt&gt;Start (ms) End (ms)        (usec)      %     (usec)      %&lt;/PRE&gt;&lt;PRE&gt;         0-1000      :      5820,   0.58         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;      1000-2000      :      3686,   0.37         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;      2000-3000      :      6472,   0.65         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;      3000-4000      :      5410,   0.54         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;      4000-5000      :      4638,   0.46         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;      5000-6000      :      2420,   0.24         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;      6000-7000      :      2793,   0.28         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;      7000-8000      :      5988,   0.60         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;      8000-9000      :     12071,   1.21         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;      9000-10000     :     12461,   1.25         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;     10000-11000     :      9816,   0.98         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;     11000-12000     :      8206,   0.82         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;     12000-13000     :      8926,   0.89         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;     13000-14000     :      6189,   0.62         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;     14000-15000     :      7649,   0.76         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;     15000-16000     :      9613,   0.96         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;     16000-17000     :      8431,   0.84         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;     17000-18000     :      7618,   0.76         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;     18000-19000     :      7212,   0.72         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;     19000-20000     :      4813,   0.48         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;     20000-21000     :      3925,   0.39         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;     21000-22000     :      4557,   0.46         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;     22000-23000     :      5169,   0.52         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;     23000-24000     :      3489,   0.35         0,   0.00&lt;/PRE&gt;&lt;PRE&gt;     24000-24682     :      2552,   0.37         0,   0.00&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;Distribution of number of 2000 ms intervals w.r.t. DPC/ISR usage:&lt;/PRE&gt;&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;                                      CPU 0                      CPU 1&lt;/PRE&gt;&lt;PRE&gt; DPC/ISR Usage %      DPC      ISR Combined      DPC      ISR Combined&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;gt;=  0 AND &amp;lt;=   1        0       12        0       13       13       13&lt;/PRE&gt;&lt;PRE&gt;&amp;gt;   1 AND &amp;lt;=   5        8        1        7        0        0        0&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;gt;   5 AND &amp;lt;=  10        5        0        6        0        0        0&lt;/PRE&gt;&lt;PRE&gt;&amp;gt;  10 AND &amp;lt;=  20        0        0        0        0        0        0&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;gt;  20 AND &amp;lt;=  40        0        0        0        0        0        0&lt;/PRE&gt;&lt;PRE&gt;&amp;gt;  40 AND &amp;lt;=  60        0        0        0        0        0        0&lt;/PRE&gt;&lt;PRE class=alt&gt;&amp;gt;  60 AND &amp;lt;=  80        0        0        0        0        0        0&lt;/PRE&gt;&lt;PRE&gt;&amp;gt;  80 AND &amp;lt;= 100        0        0        0        0        0        0&lt;/PRE&gt;&lt;PRE class=alt&gt;---&lt;/PRE&gt;&lt;PRE&gt;Total:                 13       13       13       13       13       13&lt;/PRE&gt;&lt;/DIV&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;Which is a pretty nice summary of all the DPCs and ISRs that ran during the data collection period and how long they ran for.&lt;/P&gt;
&lt;P&gt;I like XPerf a lot and it’s something we plan to use in WDF to collect data around specific performance scenarios.&amp;nbsp; In particular its ability to tie system performance data together with custom ETW events logged by components (like, say, UMDF) gives a very nice way to see how the parts of an end-to-end performance scenario break down temporarily and also to see how the scenario either causes system activity or is impacted by system activity.&lt;/P&gt;
&lt;P&gt;I just wish I could get the symbols working &lt;IMG alt=Smile src="http://messenger.msn.com/MMM2006-04-19_17.00/Resource/emoticons/regular_smile.gif" mce_src="http://messenger.msn.com/MMM2006-04-19_17.00/Resource/emoticons/regular_smile.gif"&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8980372" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author><category term="Device Drivers General" scheme="http://blogs.msdn.com/peterwie/archive/tags/Device+Drivers+General/default.aspx" /><category term="Vista" scheme="http://blogs.msdn.com/peterwie/archive/tags/Vista/default.aspx" /></entry><entry><title>Beta version of Windows Live Writer is available</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2008/10/02/beta-version-of-windows-live-writer-is-available.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2008/10/02/beta-version-of-windows-live-writer-is-available.aspx</id><published>2008-10-03T02:49:07Z</published><updated>2008-10-03T02:49:07Z</updated><content type="html">&lt;p&gt;There’s a new &lt;a href="http://download.live.com/writer"&gt;beta of WLW&lt;/a&gt; available.&amp;#160; I used the previous version for the few posts that I did make and it was very useful.&lt;/p&gt;  &lt;p&gt;The easiest way to try this version out is to post something, so here’s a picture of what my mornings are like these days (at least i think this was morning &lt;img alt="Smile" src="http://messenger.msn.com/MMM2006-04-19_17.00/Resource/emoticons/regular_smile.gif" /&gt;)&lt;/p&gt;  &lt;p&gt;&lt;a title="Finnian Eats Breakfast" href="http://www.flickr.com/photos/55906189@N00/2882803304/"&gt;&lt;img title="Finnian Eats Breakfast" alt="Finnian Eats Breakfast" src="http://static.flickr.com/3224/2882803304_cf5fcd5c25.jpg" align="middle" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8974653" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author><category term="Other" scheme="http://blogs.msdn.com/peterwie/archive/tags/Other/default.aspx" /></entry><entry><title>Code</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2008/02/05/code.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2008/02/05/code.aspx</id><published>2008-02-06T01:33:03Z</published><updated>2008-02-06T01:33:03Z</updated><content type="html">&lt;p&gt;&lt;font size="+0"&gt;Perhaps I'm just out of ideas, but I've decided to write about my &lt;a href="http://blogs.msdn.com/peterwie/archive/tags/Code/default.aspx"&gt;coding style&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="+0"&gt;Coding style is usually a very personal thing, like any writing style.&amp;#160; And as it usually causes some to foam at the mouth when brought up, I also wanted to put out this little disclaimer before I start.&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="+0"&gt;You may agree with how I've chosen to do things, you may disagree, you may not care in the least.&amp;#160; Please just take this as writing by someone who has been writing code a while and who likes to think about the process of writing code and building software.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="+0"&gt;At the least this can help my blog live up to its name :)&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7477302" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author><category term="Other" scheme="http://blogs.msdn.com/peterwie/archive/tags/Other/default.aspx" /><category term="Code" scheme="http://blogs.msdn.com/peterwie/archive/tags/Code/default.aspx" /></entry><entry><title>Pedantic Coder : Where do braces go?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2008/02/04/pedantic-coder-where-do-braces-go.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2008/02/04/pedantic-coder-where-do-braces-go.aspx</id><published>2008-02-05T02:25:15Z</published><updated>2008-02-05T02:25:15Z</updated><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;I've become rather pedantic about my coding style over the years.&amp;#160; I've worked in a number of people's code, and have always felt most comfortable in the core NT code because of the consistency of formatting, naming, etc...&amp;#160; This is a coding style that we often call &amp;quot;Cutler Normal Form&amp;quot; in deference to Dave Cutler.&lt;/p&gt;  &lt;p&gt;Despite this I recently made a change in the way I place my braces around blocks of code.&amp;#160; CNF says that braces go at the end of the line that will execute the code block, as follows:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (foo) {
    &lt;span class="kwrd"&gt;do&lt;/span&gt; something;
} &lt;span class="kwrd"&gt;else&lt;/span&gt; {
    &lt;span class="kwrd"&gt;do&lt;/span&gt; something &lt;span class="kwrd"&gt;else&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;I used to really like this style.&amp;#160; It made it clear to me when the statement being evaluated was continued into the next block.&amp;#160; Of course I always use braces, even when I only want one statement in the if or else clause, so this was a quick way to look and be sure i'd set things up correctly.&lt;/p&gt;

&lt;p&gt;I've now transitioned over to:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (foo) 
{
    &lt;span class="kwrd"&gt;do&lt;/span&gt; something;
} 
&lt;span class="kwrd"&gt;else&lt;/span&gt;
{
    &lt;span class="kwrd"&gt;do&lt;/span&gt; something &lt;span class="kwrd"&gt;else&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;style type="text/css"&gt;







.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;This was the preferred style of the folks in the UMDF group when I joined the project.&amp;#160; It took me a while to warm up to this.&amp;#160; However i eventually found two things that i like about it.&lt;/p&gt;

&lt;p&gt;First it leaves more open white space.&amp;#160; In my &amp;quot;old age&amp;quot; (i.e. mid thirties) i find that i like more whitespace in my code.&amp;#160; It improves the readability for me, and makes me work harder to keep my functions fitting on a single page - which is a good threshold for whether they're understandable or not.&lt;/p&gt;

&lt;p&gt;The second is that it makes it much, much easier to put part of the block under an IFDEF.&amp;#160; This to me was the winner.&amp;#160; Now i can do:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;#if&lt;/span&gt; bar
&lt;span class="kwrd"&gt;if&lt;/span&gt; (foo)
{
    &lt;span class="kwrd"&gt;do&lt;/span&gt; something specific to bar;
}
&lt;span class="kwrd"&gt;else&lt;/span&gt;
&lt;span class="preproc"&gt;#endif&lt;/span&gt;
{
    &lt;span class="kwrd"&gt;do&lt;/span&gt; something else;
}&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;style type="text/css"&gt;







.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;







.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Rather than:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;#if&lt;/span&gt; bar
&lt;span class="kwrd"&gt;if&lt;/span&gt; (foo) {
    &lt;span class="kwrd"&gt;do&lt;/span&gt; something specific to bar;
} &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="rem"&gt;// note that there would otherwise be a { here&lt;/span&gt;
&lt;span class="preproc"&gt;#endif&lt;/span&gt;
{
    &lt;span class="kwrd"&gt;do&lt;/span&gt; something &lt;span class="kwrd"&gt;else&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;style type="text/css"&gt;







.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Or even worse:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;#if&lt;/span&gt; bar
&lt;span class="kwrd"&gt;if&lt;/span&gt; (foo) {
    &lt;span class="kwrd"&gt;do&lt;/span&gt; something specific to bar;
} &lt;span class="kwrd"&gt;else&lt;/span&gt; {
&lt;span class="preproc"&gt;#else&lt;/span&gt;
{
&lt;span class="preproc"&gt;#endif&lt;/span&gt;
    &lt;span class="kwrd"&gt;do&lt;/span&gt; something &lt;span class="kwrd"&gt;else&lt;/span&gt;;
}&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;style type="text/css"&gt;







.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Perhaps it's a silly thing to change something as fundamental(ist) as brace formatting style to get around a little inconsistency in how you preprocess out part of a conditional.&amp;#160; But i like consistency ... the hairs on the back of my neck go up when i see code that's not in my normal format.&amp;#160; So in the end this made me more comfortable.&lt;/p&gt;

&lt;p&gt;This has come up quite a bit for me when debugging something or refactoring something.&amp;#160; When refactoring i'll frequently #if out a chunk of impacted non-critical functionality (usually replaced with a failure case) until i'm ready to deal with that chunk of code.&amp;#160; For debugging it can be useful to do the same thing if you're trying to track down the cause of a crash and are at your witts end.&lt;/p&gt;

&lt;p&gt;And I've come to find it prettier.&lt;/p&gt;

&lt;p&gt;-p&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7450391" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author><category term="Code" scheme="http://blogs.msdn.com/peterwie/archive/tags/Code/default.aspx" /></entry><entry><title>So many ways to send SCSI requests to a driver</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2008/01/25/so-many-ways-to-send-scsi-requests-to-a-driver.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2008/01/25/so-many-ways-to-send-scsi-requests-to-a-driver.aspx</id><published>2008-01-26T03:26:59Z</published><updated>2008-01-26T03:26:59Z</updated><content type="html">&lt;p&gt;(Please excuse the recycled bits.&amp;#160; The 7-month-old is still absorbing most of my blogging time (along with sleeping time, dating time, playing time, cleaning time, working time, etc...))&lt;/p&gt;  &lt;p&gt;A question came up on the ntdev mailing list about why there are &amp;quot;so many&amp;quot; ways to send an I/O request to a SCSI driver.&lt;/p&gt;  &lt;p&gt;In matter of fact there are two - IRP_MJ_SCSI and IOCTL_SCSI_PASS_THROUGH (and it's direct mapped variant).&lt;/p&gt;  &lt;p&gt;IRP_MJ_SCSI == IRP_MJ_INTERNAL_DEVICE_CONTROL. This is easily determined by looking at the headers. No SCSI shouldn't have its own IRP MJ code, and no it shouldn't reuse a number from an existing one. But it's been that way since I joined MS (and I tried to change it once ... not possible without breaking everyone doing storage) and so we all just have to live with it. Someone decided we needed a MJ code for SCSI requests. I suspect IRP_MJ_INTERNAL_DEVICE_CONTROL was reused to avoid the cost of an additional PVOID per driver object (which at the time would have been an issue).&lt;/p&gt;  &lt;p&gt;IOCTL_SCSI_EXECUTE_* is set in the stack location for an IRP_MJ_SCSI to (a) allow someone handling IRP_MJ_INTERNAL_DEVICE_CONTROL to differentiate between the two and (b) to provide some indicator of which direction the SRB is transferring data. Its use isn't particularly consistent ... I think of it as more of a debugging aid but I see that some of our drivers (like the RAMDISK driver) use it to decide if the SRB in question is a read/write type command or one of those strange SCSI commands like REQUEST_SENSE which require more complex emulation. I think using the CDB code would have been a much better idea.&lt;/p&gt;  &lt;p&gt;IRP_MJ_SCSI comes with an SRB.&lt;/p&gt;  &lt;p&gt;IOCTL_SCSI_PASS_THROUGH and IOCTL_SCSI_PASS_THROUGH_DIRECT are to send SCSI requests from user-mode. They come with SCSI_PASS_THROUGH/SCSI_PASS_THROUGH_DIRECT structures so as not to expose SRB to user-mode and so as to avoid validating SRBs which might come from user-mode (besides, how is a user mode component going to provide a value like OriginalIrp). &lt;/p&gt;  &lt;p&gt;IOCTL_SCSI_PASS_THROUGH is a buffered operation, while IOCTL_SCSI_PASS_THROUGH_DIRECT direct maps the data transfer. They're separate control codes because they are - I suppose a flag in the PASS_THROUGH structure could have contained the transfer mode ... would that make you happier?&lt;/p&gt;  &lt;p&gt;So there are two ways to send a SCSI request. One for kernel-mode components (IRP_MJ_SCSI) and one for user-mode components (IOCTL_SCSI_PASS_THROUGH[_DIRECT]). If you want to convert a pass-through command to a IRP_MJ_SCSI command it's pretty straight-forward to make an SRB and send it down.&lt;/p&gt;  &lt;p&gt;-p&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7248944" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author><category term="Storage Drivers" scheme="http://blogs.msdn.com/peterwie/archive/tags/Storage+Drivers/default.aspx" /></entry><entry><title>WDK available in other languages</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2007/09/24/wdk-available-in-other-languages.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2007/09/24/wdk-available-in-other-languages.aspx</id><published>2007-09-24T21:22:13Z</published><updated>2007-09-24T21:22:13Z</updated><content type="html">&lt;p&gt;This is pretty cool, though my high-school french isn't sufficient to appreciate it completely.&amp;#xA0; The WDK content on MSDN has been translated into multiple languages.&amp;#xA0; &lt;/p&gt;  &lt;p&gt;It's a machine translation and to make up for the inconsistencies they do side-by-side english &amp;amp; other language.&amp;#xA0; It's not as good as native documentation, but hopefully it will help bridge the gap for those who don't speak english as their first language.&lt;/p&gt;  &lt;p&gt;The language options are:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#xB7; &lt;a href="http://mtbeta.msdn.microsoft.com/pt-br/library/default.aspx"&gt;Brazilian Portuguese (pt-br)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#xB7; &lt;a href="http://mtbeta.msdn.microsoft.com/fr-fr/library/default.aspx"&gt;French (fr-fr)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#xB7; &lt;a href="http://mtbeta.msdn.microsoft.com/ja-jp/library/default.aspx"&gt;Japanese (ja-jp)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#xB7; &lt;a href="http://mtbeta.msdn.microsoft.com/zh-cn/library/default.aspx"&gt;S. Chinese (zh-cn)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#xB7; &lt;a href="http://mtbeta.msdn.microsoft.com/es-es/library/default.aspx"&gt;Spanish (es-es)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#xB7; &lt;a href="http://mtbeta.msdn.microsoft.com/zh-tw/library/default.aspx"&gt;T. Chinese (zh-tw)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Enjoy&lt;/p&gt;  &lt;p&gt;-p&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5103712" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author><category term="Device Drivers General" scheme="http://blogs.msdn.com/peterwie/archive/tags/Device+Drivers+General/default.aspx" /></entry><entry><title>Where is Peter</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2007/09/20/where-is-peter.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2007/09/20/where-is-peter.aspx</id><published>2007-09-20T23:20:14Z</published><updated>2007-09-20T23:20:14Z</updated><content type="html">&lt;p&gt;It's been ages since I posted to my blog and I'm sorry about that.&amp;#xA0; I recently became a dad and it turns up that absorbs a lot of the free time I used to spend on my blog.&lt;/p&gt;  &lt;p&gt;I'm hoping to get back into things ... so don't remove me from your OPML files yet.&lt;/p&gt;  &lt;p&gt;-p&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5018145" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author></entry><entry><title>Catherine van Ingen is up on Channel 9</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2007/06/15/catherine-van-ingen-is-up-on-channel-9.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2007/06/15/catherine-van-ingen-is-up-on-channel-9.aspx</id><published>2007-06-15T21:59:07Z</published><updated>2007-06-15T21:59:07Z</updated><content type="html">&lt;p&gt;I used to work with Catherine back when i was on the storage team.&amp;nbsp; I learned a lot just watching Catherine do what she does.&amp;nbsp; I went to the taping of the interview and it was quite amusing.&amp;nbsp; I think this is definately worth the hour it takes to watch.&lt;/p&gt; &lt;p&gt;&lt;a title="http://channel9.msdn.com/ShowPost.aspx?PostID=316739" href="http://channel9.msdn.com/ShowPost.aspx?PostID=316739"&gt;http://channel9.msdn.com/ShowPost.aspx?PostID=316739&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;table&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt; &lt;div class="photDiv" id="template__ctl0_PostThroneView__ctl0_PostRepeater__ctl0_UserPostBar1__ctl0_Postview1__ctl0__ctl0_photDiv"&gt; &lt;div id="playerContainer"&gt; &lt;div id="smudge"&gt;&lt;br&gt;﻿What do global warming, a scientific instrument weighing about 4500 tons and bill collection have in common? The once Berkeley ‘hippie chick’ turned Software Architect Catharine van Ingen. Catharine has a wealth of experience in hardware, including work with the Alpha machine and MIPS processor teams, industrial-strength software for algorithms used to manage water flows, logging data from particle accelerator detectors, and buying Mickey Mouse watches over the Internet. &lt;br&gt;&lt;br&gt;Show: &lt;a href="http://channel9.msdn.com/shows/Behind_The_Code"&gt;Behind The Code&lt;/a&gt;&lt;br&gt;&lt;br&gt;Tags: &lt;a href="http://channel9.msdn.com/tags/MS+Personalities" rel="tag"&gt;MS+Personalities&lt;/a&gt;, &lt;a href="http://channel9.msdn.com/tags/Hardware" rel="tag"&gt;Hardware&lt;/a&gt;, &lt;a href="http://channel9.msdn.com/tags/Architecture" rel="tag"&gt;Architecture&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3317993" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author></entry><entry><title>WinHEC Day 2 - So Very Tired</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2007/05/17/winhec-day-2-so-very-tired.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2007/05/17/winhec-day-2-so-very-tired.aspx</id><published>2007-05-17T10:39:21Z</published><updated>2007-05-17T10:39:21Z</updated><content type="html">&lt;p&gt;I was up way to late last night and then decided to get up this morning for the keynotes.&amp;nbsp; And to make it somewhere by 8 i have to get up early since i'm not really functional in the mornings.&amp;nbsp; So it's been a long day, but a good one.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Mark Russinovich gave a very good keynote speech&amp;nbsp;about kernel changes for Server 2008.&amp;nbsp; The Windows Sideshow folks are doing some really amazing stuff with their platform and had several very exciting things to demonstrate.&amp;nbsp; &lt;/p&gt; &lt;p&gt;The evening was a reception at Univeral Studios (in part of the backlot area).&amp;nbsp; Also fun, but i'm not sure i had enough energy to really go.&amp;nbsp; I did finally dig out my camera and take a couple of pictures.&amp;nbsp; I&amp;nbsp; like my Fuji F30 for its low-light point and shoot capabilities.&lt;/p&gt; &lt;p&gt;I managed to be one of the last folks out of the park - the line to get on the busses was quite long:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/WinHECDay2SoVeryTired_905/WinHec%202007%20Day%202%20003%5B4%5D.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/WinHECDay2SoVeryTired_905/WinHec%202007%20Day%202%20003_thumb%5B2%5D.jpg" width="240" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;On the ride back i&amp;nbsp;had a chat with an MS employee from Amsterdam&amp;nbsp;who was in for the convention.&amp;nbsp; That really made my night.&amp;nbsp;&lt;/p&gt; &lt;p&gt;Sleep now.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2690310" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author></entry><entry><title>WinHEC Day 1</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2007/05/15/winhec-day-1.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2007/05/15/winhec-day-1.aspx</id><published>2007-05-16T03:41:25Z</published><updated>2007-05-16T03:41:25Z</updated><content type="html">&lt;p&gt;One day and i'm done.&amp;nbsp; More or less.&amp;nbsp; All of the KMDF and UMDF talks were front-loaded into the conference so we were finished "talking" by 4:15.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Eliyas and I gave our talk this morning on what's new in KMDF and UMDF.&amp;nbsp; It seemed to go pretty well, though it's definately one of the least technical talks i've given on the topic.&amp;nbsp; It's also my least rehearsed - i didn't start running through the slides until I got into my hotel room last night.&amp;nbsp; Hopefully it didn't show too badly :).&amp;nbsp; I did a quick poll of the room and most of the attendees were aware of UMDF and KMDF &amp;amp; a good number are using KMDF.&amp;nbsp; UMDF adoption is sparser (which isn't surprising) but actually the number of hands was better than I was expecting.&lt;/p&gt; &lt;p&gt;I got to poke my head into Landy's Q&amp;amp;A session on the memory manager.&amp;nbsp; Landy always manages to pack a room and it's easy to understand why.&amp;nbsp; &lt;/p&gt; &lt;p&gt;The KMDF chalk talk was pretty lively.&amp;nbsp; Folks have been playing with KMDF for quite a while so there were a number of good questions.&amp;nbsp; The UMDF chalk-talk had a large number of "newbies" which we honestly weren't expecting.&amp;nbsp; I think Praveen did a pretty good job of adapting to that - we walked thorugh the skeleton sample briefly then showed debugging some things with the debugger extensions to walk through your driver once it's up.&amp;nbsp; Shefalli had a little time at the end to run through her slides on testing your UMDF drivers and the tools that are available for that.&lt;/p&gt; &lt;p&gt;Now that Nar's done talking about the I/O manager changes it's time to go back to the hotel.&amp;nbsp; I'm ready for a nap.&lt;/p&gt; &lt;p&gt;-p&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2660502" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author></entry><entry><title>How do i figure out which host contains my driver?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2007/05/15/how-do-i-figure-out-which-host-contains-my-driver.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2007/05/15/how-do-i-figure-out-which-host-contains-my-driver.aspx</id><published>2007-05-16T03:18:06Z</published><updated>2007-05-16T03:18:06Z</updated><content type="html">&lt;p&gt;Let's say you're luck enough to have more than one user-mode driver running on your system.&amp;nbsp; How would you figure out which is running your driver?&lt;/p&gt; &lt;p&gt;Let's take my laptop.&amp;nbsp; By luck i happen to have installed both the UMDF skeleton and echo drivers.&amp;nbsp; I'm interested in debugging the echo driver (the skeleton does almost nothing so it's not really worth debugging :) ).&amp;nbsp; Device manager shows me this:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/Howdoifigureoutwhichhostcontainsmydriver_F0DF/image%7B0%7D%5B8%5D.png" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 10px 0px 0px; border-right-width: 0px" height="480" src="http://blogs.msdn.com/blogfiles/peterwie/WindowsLiveWriter/Howdoifigureoutwhichhostcontainsmydriver_F0DF/image%7B0%7D_thumb%5B6%5D.png" width="299" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And there are two host processes:&lt;/p&gt;&lt;pre&gt;    tasklist | findstr -i wudfhost.exe
    WUDFHost.exe 4668 Services 0 3,572 K
    WUDFHost.exe 4296 Services 0 3,540 K
&lt;/pre&gt;
&lt;p&gt;How do i know which is which?&lt;/p&gt;
&lt;p&gt;Praveen found a really good trick for this.&amp;nbsp; Tasklist has a /M flag which lets you look for processes with a particular module loaded.&amp;nbsp; So i if i want to know which host has wudfechodriver.dll loaded i can simply run:&lt;/p&gt;&lt;pre&gt;    tasklist /m wudfechodriver.dll
    Image Name    PID   Modules
    WUDFHost.exe 4668   WUDFEchoDriver.dll
&lt;/pre&gt;
&lt;p&gt;Note that you need to do this from an elevated command window on Vista - WUDFHost runs as LocalService in session 0 and isn't normally visible to an unelevated process. 
&lt;p&gt;Also if you're a PowerShell sort of person (as i'm rapidly becoming) you could run: &lt;pre&gt;foreach($p in get-process wudfhost) {
    $p | format-table
    $p.Modules | 
        ? {$_.FileName -like "$env:windir\system32\drivers\umdf\*"} | 
        format-table -autosize
}&lt;/pre&gt;
&lt;p&gt;to get: &lt;pre&gt;Handles NPM(K) PM(K) WS(K) VM(M) CPU(s)   Id ProcessName
------- ------ ----- ----- ----- ------   -- -----------
    124      3  2092  3508    31   0.05 4296 WUDFHost 

Size(K) ModuleName       FileName
------- ----------       --------
24      UMDFSkeleton.dll C:\Windows\System32\drivers\UMDF\UMDFSkeleton.dll 

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s)   Id ProcessName
------- ------ ----- ----- ----- ------   -- -----------
    124      3  2100  3568    31   0.03 4668 WUDFHost 

Size(K) ModuleName         FileName
------- ----------         --------
28      WUDFEchoDriver.dll C:\Windows\System32\drivers\UMDF\WUDFEchoDriver.dll
&lt;/pre&gt;
&lt;p&gt;I like this technique a little more because it shows all the hosts and lists every UMDF driver that's loaded in that host, not just the one you were asking about.&amp;nbsp; But it requires you to use &lt;a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/faq.mspx" target="_blank"&gt;PowerShell&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2660163" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author></entry><entry><title>How to enable USB selective suspend and system wake in the UMDF driver for a USB device</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/peterwie/archive/2007/03/28/how-to-enable-usb-selective-suspend-and-system-wake-in-the-umdf-driver-for-a-usb-device.aspx" /><id>http://blogs.msdn.com/peterwie/archive/2007/03/28/how-to-enable-usb-selective-suspend-and-system-wake-in-the-umdf-driver-for-a-usb-device.aspx</id><published>2007-03-29T06:29:00Z</published><updated>2007-03-29T06:29:00Z</updated><content type="html">&lt;DIV class=Section1&gt;
&lt;P class=MsoNormal style="TEXT-ALIGN: center" align=center&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-SIZE: 12pt; LINE-HEIGHT: 115%"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;EM&gt;Today's guest blogger is Abhishek Ram.&amp;nbsp; Abhishek owns the PNP and Power Management&amp;nbsp;code for UMDF now, and has been working on getting idle detection and wait-wake support into UMDF for a future release.&amp;nbsp; In the interim he spent some time looking at how to enable&amp;nbsp;selective suspend and system wakeup in the&amp;nbsp;current&amp;nbsp;UMDF Fx2 sample.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;If you’re writing as UMDF driver for a USB device, you’ve probably installed the &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; driver as a lower filter driver for your device (like the UMDF OSR USB Fx2 driver sample in the WDK) and you’re probably using the &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; driver to read from, write to and control the device. In this post, I’ll talk about how you can use the &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; driver to enable USB selective suspend and system wake for your device.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;Power policy ownership&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;The &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; driver should be the power policy owner in your driver stack. Meaning, it is the &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; driver that makes the decisions on what power state the device should be in. Note that &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; assumes power policy ownership of the driver stack by default – you don’t need to do anything special to enable this. You &lt;B style="mso-bidi-font-weight: normal"&gt;do&lt;/B&gt; need to make sure that your driver does &lt;B style="mso-bidi-font-weight: normal"&gt;not&lt;/B&gt; try to claim power policy ownership for the device stack. (UMDF drivers can claim power policy ownership by calling &lt;SPAN class=SpellE&gt;IWDFDeviceInitialize&lt;/SPAN&gt;::&lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;SetPowerPolicyOwnership&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;). Make sure you’re not doing this in this case).&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;I/O Queues&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;You need to make sure that you do not use power-managed queues if you decide that you want to enable USB selective suspend through &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt;. If you are interested in enabling only system wake and not USB selective suspend, you may use power-managed queues. You can specify whether or not a queue is power-managed during queue creation – it is a parameter to the &lt;SPAN class=SpellE&gt;IWDFDevice&lt;/SPAN&gt;::&lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;CreateIoQueue&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;) method.&lt;/P&gt;
&lt;P class=MsoNormal&gt;Here’s the reason why you should not use a power-managed queue if you’ve enabled USB selective suspend through &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt;. By definition, the framework (UMDF) will not deliver to the driver a request that arrives on a power-managed queue, unless the device is in a powered-up state. Now let’s say you’ve enabled USB selective suspend and your device idles out because it has been inactive for a while. Now, if you receive a request on a power-managed queue after the device has idled out, the framework will not deliver the request to your driver because the device is not currently powered up. And since you’re not the power policy owner for the stack, the framework will not be able to power-up the device either, as only the power policy owner of the stack can make decisions about the power state of the device. Hence the request will remain stuck in your power-managed queue.&lt;/P&gt;
&lt;P class=MsoNormal&gt;On the other hand, if you were to use a non-power-managed queue, then if a request arrives when the device has idled out the framework would still deliver the request to your driver. Your driver would then forward it to the &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; driver (assuming it cannot complete it by itself). Upon receiving the request, the &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; driver can make the decision on whether the device needs to be powered-up. If it does need to be powered up, &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; can take the necessary steps to do so, as it is the power policy owner for the device stack.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;Setting values in the device’s hardware key via the INF&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;In order to enable USB selective suspend and system wake using the &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; driver, it is necessary to set some values in the device’s hardware key via the INF. Refer to the topic “INF &lt;SPAN class=SpellE&gt;AddReg&lt;/SPAN&gt; directive” on MSDN for details on how to do this.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;USB selective suspend&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;A UMDF driver must do the following in order to enable USB selective suspend through &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; –&lt;/P&gt;
&lt;P class=MsoListParagraph style="TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1"&gt;&lt;SPAN style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;SPAN style="mso-list: Ignore"&gt;1.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Through its INF file, the driver must set a value named “&lt;SPAN class=SpellE&gt;DeviceIdleEnabled&lt;/SPAN&gt;” in the device’s hardware key to 1. This value will tell the &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; driver that the device is capable of supporting USB selective suspend.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-LEFT: 0.5in"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;HKR&lt;SPAN class=GramE&gt;,,"&lt;/SPAN&gt;DeviceIdleEnabled",0x00010001,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-LEFT: 0.5in"&gt;Setting this value is a prerequisite. In the absence of this value, &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; will ignore requests to enable device selective suspend. However, the presence of this value alone is not enough to enable selective suspend. You’ll need to follow the next step as well.&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo1"&gt;&lt;SPAN style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;SPAN style="mso-list: Ignore"&gt;2.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;The driver must instruct &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; to enable selective suspend. The driver can do this either programmatically or through its INF file.&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="MARGIN-LEFT: 1in; TEXT-INDENT: -0.25in; mso-add-space: auto; mso-list: l1 level2 lfo1"&gt;&lt;SPAN style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;SPAN style="mso-list: Ignore"&gt;a.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Programmatic method – The &lt;SPAN class=SpellE&gt;IWDFUsbTargetDevice&lt;/SPAN&gt;::&lt;SPAN class=SpellE&gt;&lt;SPAN class=GramE&gt;SetPowerPolicy&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN class=GramE&gt;(&lt;/SPAN&gt;) method allows you to tell the &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; driver to enable selective suspend by setting the AUTO_SUSPEND policy. You can also configure the idle timeout by setting the SUSPEND_DELAY policy.&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="MARGIN-LEFT: 1in; TEXT-INDENT: -0.25in; mso-add-space: auto; mso-list: l1 level2 lfo1"&gt;&lt;SPAN style="mso-bidi-font-family: Calibri; mso-bidi-theme-font: minor-latin"&gt;&lt;SPAN style="mso-list: Ignore"&gt;b.&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;INF method – The driver must set a value named “&lt;SPAN class=SpellE&gt;DefaultIdleState&lt;/SPAN&gt;” in the device’s hardware key to 1. This will tell &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt; that by default, selective suspend should be enabled. The driver can also specify the default idle timeout by setting a value named “&lt;SPAN class=SpellE&gt;DefaultIdleTimeout&lt;/SPAN&gt;” in the device’s hardware key to the desired timeout value in milliseconds. &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-LEFT: 1in"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;HKR&lt;SPAN class=GramE&gt;,,"&lt;/SPAN&gt;DefaultIdleState",0x00010001,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-LEFT: 1in"&gt;&lt;I style="mso-bidi-font-style: normal"&gt;HKR&lt;SPAN class=GramE&gt;,,"&lt;/SPAN&gt;DefaultIdleTimeout",0x00010001,5000&lt;o:p&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN-LEFT: 1in"&gt;Note that the INF method allows you to specify the defaults at the time of device install and these defaults can be overridden at run-time using the programmatic method.&lt;/P&gt;
&lt;P class=MsoNormal&gt;A UMDF driver can also decide whether or not the user can enable or disable USB selective suspend for the device. If the driver wants to allow the user to enable or disable USB selective suspend, it must set a value named “&lt;SPAN class=SpellE&gt;UserSetDeviceIdleEnabled&lt;/SPAN&gt;” in the device’s hardware key to 1. &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;I style="mso-bidi-font-style: normal"&gt;HKR&lt;SPAN class=GramE&gt;,,"&lt;/SPAN&gt;UserSetDeviceIdleEnabled",0x00010001,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Doing so will cause a check box to show up in the power management settings property page for the device in the Device Manager UI. The user can check or uncheck the box to enable or disable USB selective suspend.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;System wake&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;System wake refers to the ability to a device to wake a system when the system is in a lower-power state. In order to enable system wake through &lt;SPAN class=SpellE&gt;WinUSB&lt;/SPAN&gt;, a UMDF driver must set a registry value named “&lt;SPAN class=SpellE&gt;SystemWakeEnabled&lt;/SPAN&gt;” in the device’s hardware key to 1. &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;I style="mso-bidi-font-style: normal"&gt;HKR&lt;SPAN class=GramE&gt;,,"&lt;/SPAN&gt;SystemWakeEnabled",0x00010001,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Setting this value also allows the user to control the ability of the device to wake the system from a low-power state. A check box shows up in the power management settings property page for the device in the Device Manager UI and the user can or uncheck the box to enable or disable system wake.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;Troubleshooting tip&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;There &lt;SPAN class=GramE&gt;are&lt;/SPAN&gt; some known hardware and operating system issues due to which some devices are unable to wake from the idle state even if USB selective suspend is enabled for them. If you hit this issue, one thing to try would be to ensure that the USB hub that the device is connected to is enabled for idle. This is not guaranteed to work, but it has proved to be a useful technique to work around some USB device wake problems. Details on how to apply this workaround –&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpFirst style="TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo3"&gt;&lt;SPAN style="mso-ascii-font-family: Calibri; mso-fareast-font-family: Calibri; mso-hansi-font-family: Calibri; mso-bidi-font-family: Calibri"&gt;&lt;SPAN style="mso-list: Ignore"&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;In the Device Manager UI, choose “View” from the menu and then choose “Devices by connection” from the drop-down list. The Device Manager UI should refresh and display the devices by connection.&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpMiddle style="TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo3"&gt;&lt;SPAN style="mso-ascii-font-family: Calibri; mso-fareast-font-family: Calibri; mso-hansi-font-family: Calibri; mso-bidi-font-family: Calibri"&gt;&lt;SPAN style="mso-list: Ignore"&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Find your device and locate the parent USB hub device that it is connected to. Right click on the parent USB hub and select “Properties” to view its properties&lt;/P&gt;
&lt;P class=MsoListParagraphCxSpLast style="TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo3"&gt;&lt;SPAN style="mso-ascii-font-family: Calibri; mso-fareast-font-family: Calibri; mso-hansi-font-family: Calibri; mso-bidi-font-family: Calibri"&gt;&lt;SPAN style="mso-list: Ignore"&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;Go to the “Power Management” tab and check the box titled “Allow the computer to turn off this device to save power”.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1983703" width="1" height="1"&gt;</content><author><name>PeterWie</name><uri>http://blogs.msdn.com/members/PeterWie.aspx</uri></author><category term="UMDF" scheme="http://blogs.msdn.com/peterwie/archive/tags/UMDF/default.aspx" /></entry></feed>