<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>HoppeRx - the cure for your ailing device : DeanMel</title><link>http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx</link><description>Tags: DeanMel</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Passive KITL to the rescue</title><link>http://blogs.msdn.com/hopperx/archive/2007/11/02/passive-kitl-to-the-rescue.aspx</link><pubDate>Fri, 02 Nov 2007 18:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5838922</guid><dc:creator>deanmel</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/5838922.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=5838922</wfw:commentRss><description>I'm sure many of you have been in a situation where your device hangs during field testing. Or sometimes you are trying to track down a problem which only repros at a certain location. The best thing you can have in these situations is, of course, a live...(&lt;a href="http://blogs.msdn.com/hopperx/archive/2007/11/02/passive-kitl-to-the-rescue.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5838922" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL/default.aspx">KITL</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/WM6/default.aspx">WM6</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/jetstream/default.aspx">jetstream</category></item><item><title>Running Platform Builder 6 on Vista</title><link>http://blogs.msdn.com/hopperx/archive/2007/10/25/running-platform-builder-6-on-vista.aspx</link><pubDate>Thu, 25 Oct 2007 20:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5674024</guid><dc:creator>deanmel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/5674024.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=5674024</wfw:commentRss><description>There are a lot of people that afraid to switch of Vista because they are afraid that their stuff will not work. Well truth be told, I've been running Vista+VS2005_SP1+PB6 since March of this year and haven't had any major problems. The only two problems...(&lt;a href="http://blogs.msdn.com/hopperx/archive/2007/10/25/running-platform-builder-6-on-vista.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5674024" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/WM6/default.aspx">WM6</category></item><item><title>Where did Callstacks go from the Hopper logs?</title><link>http://blogs.msdn.com/hopperx/archive/2007/10/04/where-did-callstacks-go-from-the-hopper-logs.aspx</link><pubDate>Thu, 04 Oct 2007 23:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5278282</guid><dc:creator>deanmel</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/5278282.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=5278282</wfw:commentRss><description>If you upgraded from an older version of Hopper to a more recent one, you probably noticed that the callstacks are gone from the Hopper logs. We made them optional for two reasons: 1. Printing out callstacks slowed down the run significantly 2. They did...(&lt;a href="http://blogs.msdn.com/hopperx/archive/2007/10/04/where-did-callstacks-go-from-the-hopper-logs.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5278282" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/WM6/default.aspx">WM6</category></item><item><title>Why my private binaries do not show up in the image?</title><link>http://blogs.msdn.com/hopperx/archive/2007/09/28/why-my-private-binaries-do-not-show-up-in-the-image.aspx</link><pubDate>Fri, 28 Sep 2007 21:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5191132</guid><dc:creator>deanmel</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/5191132.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=5191132</wfw:commentRss><description>Why my private binaries do not show up in the image? I've been asked this question too many times by now. Many partners when testing their private changes have to figure it out the hard way. The reason why your updated binary doesn't show up in the image...(&lt;a href="http://blogs.msdn.com/hopperx/archive/2007/09/28/why-my-private-binaries-do-not-show-up-in-the-image.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5191132" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/WM6/default.aspx">WM6</category></item><item><title>How to load mismatched PDBs in Platform Builder</title><link>http://blogs.msdn.com/hopperx/archive/2007/09/21/how-to-load-mismatched-pdbs.aspx</link><pubDate>Fri, 21 Sep 2007 03:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5022161</guid><dc:creator>deanmel</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/5022161.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=5022161</wfw:commentRss><description>I don't know how many times I wished Platform Builder had an option to load PDB files with timestamps that do not match my executable. This option was available for desktop users for decades. Windbg and other desktop debuggers can do it without problems....(&lt;a href="http://blogs.msdn.com/hopperx/archive/2007/09/21/how-to-load-mismatched-pdbs.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5022161" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/Platform+Builder/default.aspx">Platform Builder</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>How to get work done while building the tree</title><link>http://blogs.msdn.com/hopperx/archive/2007/05/01/how-to-get-work-done-while-building-the-tree.aspx</link><pubDate>Tue, 01 May 2007 02:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2346219</guid><dc:creator>deanmel</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/2346219.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=2346219</wfw:commentRss><description>&amp;nbsp; 
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: #003366; FONT-FAMILY: 'Lucida Console'"&gt;Over past several months I've noticed that when our partners come here onsite. They like to build Windows Mobile images on their laptops while trying to get other work done at the same time. The problem with that is when compiler, linker, etc. do their job they slow down the computer significantly because there is a lot of compiling and disk I/O happening.&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: #003366; FONT-FAMILY: 'Lucida Console'" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: #003366; FONT-FAMILY: 'Lucida Console'"&gt;Interestingly Microsoft engineers that worked on the build process foreseen this problem. There is "secret" switch that is actually described in the documentation but not many people know about it. It runs all build processes in an idle priority. All you need to do is add "-m" to the blddemo command. &lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: #003366; FONT-FAMILY: 'Lucida Console'" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: #003366; FONT-FAMILY: 'Lucida Console'"&gt;The pros of doing this you already know -- you can work without significant slowdowns while your image is building. The cons, however, are insignificant -- it might take 5 minutes longer to build the image.&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: #003366; FONT-FAMILY: 'Lucida Console'" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2346219" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/Platform+Builder/default.aspx">Platform Builder</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/WM6/default.aspx">WM6</category></item><item><title>KITL timeouts with USB Serial Part 2</title><link>http://blogs.msdn.com/hopperx/archive/2007/01/14/kitl-timeouts-with-usb-serial-part-2.aspx</link><pubDate>Sun, 14 Jan 2007 08:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1464267</guid><dc:creator>deanmel</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/1464267.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=1464267</wfw:commentRss><description>&amp;nbsp; 
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;In the&lt;SPAN style="FONT-WEIGHT: bold"&gt; &lt;A class="" title="first part" href="http://blogs.msdn.com/hopperx/archive/2006/12/23/kitl-timeouts-with-usb-serial.aspx" mce_href="http://blogs.msdn.com/hopperx/archive/2006/12/23/kitl-timeouts-with-usb-serial.aspx"&gt;first part&lt;/A&gt;&lt;/SPAN&gt; we talked briefly about KITL timeouts. In this article we are going to give you a little bit more details and try to explain why it behaves the way it does.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;How did we run into this issue?&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;It all started with Hopper (apparently Hopper is also good at finding KITL problems as well as all the other problems it usually finds :-). When we ran Hopper on one of the devices, it would behave in a very strange way.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Sometimes it would start spewing a lot of data into the debug output and stop completely, the other times it would keep going, sometimes it would stop for 20 minutes and then continue like nothing happened.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;And when debug output stopped we could still type in Shell window and get the response back from the Shell commands. Most of the time, however, we would see a small hick up (sometimes less then a second) and debugging would continue after that. As you see it was completely random. Obviously if the only thing we saw were hick ups we would have never even noticed the problem.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Everyone knows how frustrating these ambiguous bugs could be when you don't have a consistent repro.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;We got lucky because we saw that it would happen when Hopper tried to print out a 27 character string. &lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Why 27 characters? As it was mentioned in the previous post the way USB Serial KITL indicates the end of the transmission is by sending a partial packet (less then max packet size).&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;However, if the data sent over the wire happens to be a multiple of max packet size then a zero length packet needs to be sent to indicate the end of the transmission. The default packet size that most manufactures use right now is 64 bytes. When you send 27 character text you will get exactly 64 bytes. Let's look at the debug message packet to see why it is 27 character string. Here is how the Debug Message packet looks when sent over the USB Serial:&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;&lt;IMG style="WIDTH: 685px; HEIGHT: 133px" height=133 src="http://blogs.msdn.com/photos/deanmel/images/1464239/original.aspx" width=685 align=left mce_src="http://blogs.msdn.com/photos/deanmel/images/1464239/original.aspx"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;If you look at the header file you'll see the following sizes:&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="DIRECTION: ltr"&gt;
&lt;TABLE class="" style="BORDER-RIGHT: #a3a3a3 1pt solid; BORDER-TOP: #a3a3a3 1pt solid; BORDER-LEFT: #a3a3a3 1pt solid; DIRECTION: ltr; BORDER-BOTTOM: #a3a3a3 1pt solid; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 border=1 valign="top"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT: #a3a3a3 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #a3a3a3 1pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 4pt; VERTICAL-ALIGN: top; BORDER-LEFT: #a3a3a3 1pt solid; WIDTH: 2.629in; PADDING-TOP: 4pt; BORDER-BOTTOM: #a3a3a3 1pt solid"&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;sizeof(OAL_KITL_SERIAL_HEADER) &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT: #a3a3a3 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #a3a3a3 1pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 4pt; VERTICAL-ALIGN: top; BORDER-LEFT: #a3a3a3 1pt solid; WIDTH: 2.629in; PADDING-TOP: 4pt; BORDER-BOTTOM: #a3a3a3 1pt solid"&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;sizeof(KITL_HDR)&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="" style="BORDER-RIGHT: #a3a3a3 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #a3a3a3 1pt solid; PADDING-LEFT: 4pt; PADDING-BOTTOM: 4pt; VERTICAL-ALIGN: top; BORDER-LEFT: #a3a3a3 1pt solid; WIDTH: 2.629in; PADDING-TOP: 4pt; BORDER-BOTTOM: #a3a3a3 1pt solid"&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;sizeof(KITL_DBGMSG_INFO) &lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/DIV&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Arial" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;That's 34 bytes plus 27 byte string. Which is 61 bytes. Where is the other 3? Let's look at the packet that was sniffed from the line:&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;&amp;nbsp;&lt;IMG style="WIDTH: 547px; HEIGHT: 93px" height=93 src="http://blogs.msdn.com/photos/deanmel/images/1464236/original.aspx" width=547 align=left mce_src="http://blogs.msdn.com/photos/deanmel/images/1464236/original.aspx"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;There are&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;3 extra bytes at the end:&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;0x0D, 0x0A and 0x00. They are \n, \r and \0.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;So that's how the mystery of 27 byte string was solved. &lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;The Explanation &lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;We know that this hick up or hang happens when the data sent by the client is aligned to exactly max packet size. But why in some cases do we see a hick up and in the others a hang? And why would we still be able to type shell commands? That didn't make any sense.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;Why would we still be able to type shell commands?&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The answer lies in the KITL Architecture. KITL has a full duplex architecture meaning it has separate channels for sending and receiving data. It also has 16 separate clients (see the picture blow).&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Debug Message is client number 0 and Shell command window is client number 10 then you can bring down client number 0 but client number 10 would still work. The problem we were having was on the Transport level which is below the Client level but since the Transport was still Polling the data underneath it was able to respond to our Shell requests and only the Debug Message Client was stuck.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;&lt;IMG style="WIDTH: 486px; HEIGHT: 270px" height=270 src="http://blogs.msdn.com/photos/deanmel/images/1464246/original.aspx" width=486 align=left mce_src="http://blogs.msdn.com/photos/deanmel/images/1464246/original.aspx"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;But why would it sometimes stop just for a split second and other times it would hang? The answer is simply luck! Let's say the device was trying to send 4 packets which were exactly 64 bytes each. The host would receive all 4 packets however on the last packet it would just stop because it is waiting for a transmission end packet which never comes because there is no more data in the queue on the device. That is the case when the Debug Message output would get stuck. If the device were to send something else at that moment then the data flow would resume and packet number 4 would be flashed out. &lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;There are other ways that would allow the data flow to be resumed. When the host waits for the packet to come but it never does for any reason then the host would send a packet back asking the device to retransmit the data. However if the only thing the device does is retransmit the last packet it will still be aligned at 64 bytes and the host would still think that there is more data. In most cases though the device send something else with the retransmit (echo, acknowledgment etc.)&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;which will generate a partial packet in the end and the data flow will be resumed. I hope now you see why I said "luck" in the beginning.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;The Conclusion&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri"&gt;In the end this was a very challenging issue and I'm glad that we had USB sniffer that allowed us to look at the raw packets. Some of you might not have the USB sniffers that's why we thought it is important for us to share our finding with you.&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 11pt; MARGIN: 0in; FONT-FAMILY: Calibri" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1464267" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL/default.aspx">KITL</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL+Timeout/default.aspx">KITL Timeout</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category></item><item><title>KITL timeouts with USB Serial</title><link>http://blogs.msdn.com/hopperx/archive/2006/12/23/kitl-timeouts-with-usb-serial.aspx</link><pubDate>Sun, 24 Dec 2006 01:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1354311</guid><dc:creator>deanmel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/1354311.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=1354311</wfw:commentRss><description>&lt;P&gt;Recently the JDP team investigated a group of KITL timeout failures. Each timeout occurred under similar conditions and seemed to be associated with a single bug. At first we were puzzled as to why we were seeing these failures on different devices with different OS versions. As the investigation progressed it became clear that the bug was located in a section of BSP code that handles KITL packets sent over the USB Serial transport. To indicate a transmission is complete the USB client sends a partial packet (i.e. a packet smaller then the max packet size) to USB host. This means that if the data being sent is equal to the exact size of the USB max packet size, the USB client must send a zero length packet at the end of the transmission. On the BSPs we were using, this zero length packet was never sent, so in some cases KITL would think it was hung waiting for a transmission to complete; in other cases, the debug message flow would simply stop for a split second and then continue. To test for this bug you can write a very simple application that will send 64 byte packets to the debug output. Keep in mind the standard KITL header is 34 bytes (do not worry about these details if they do not make sense right now, I will explain KITL header and transmissions in more detail in a follow-up blog). Also, do not forget that debug messages are sent in ASCII therefore each character will take 1 byte. The following code will detect the KITL packet bug if the bug is present, a hang or a pause will be shown in the debug messages when this code is executed: &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; WORD-BREAK: keep-all; POSITION: relative; BACKGROUND-COLOR: #cccccc" ;&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="COLOR: blue"&gt;char&lt;/SPAN&gt; strng[101];&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="COLOR: blue"&gt;for&lt;/SPAN&gt;(&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; a = 0; a &amp;lt; 100; a++) &lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;memset&lt;/SPAN&gt;(strng, &lt;SPAN style="COLOR: maroon"&gt;'k'&lt;/SPAN&gt;, a);&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strng[a] = &lt;SPAN style="COLOR: maroon"&gt;'\0'&lt;/SPAN&gt;;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;printf&lt;/SPAN&gt;(&lt;SPAN style="COLOR: maroon"&gt;"%s\n"&lt;/SPAN&gt;, strng);&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;//!!If the bug exists, the second printf should cause a hickup or hang!!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;printf&lt;/SPAN&gt;(&lt;SPAN style="COLOR: maroon"&gt;"%s\n"&lt;/SPAN&gt;, strng); &lt;SPAN style="COLOR: green"&gt;//Remember '\n' is compiled into two characters (CR and LF).&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;B&gt;&lt;/B&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;The Fix&lt;/B&gt; &lt;BR&gt;This bug has a simple fix. Find the KITLSend function in your KITL implementation, (it's called USBKitlTxIntHandler in some BSPs), then find the spot right before a packet is sent to USB and insert these 3 lines: &lt;/P&gt;
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; WORD-BREAK: keep-all; POSITION: relative; BACKGROUND-COLOR: #cccccc" ;&gt;&amp;nbsp; 
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// here we split the last trunk of data into 2 short packets(EP1Len - 4) and 4 bytes&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="COLOR: blue"&gt;if&lt;/SPAN&gt; (len == EP1Len) &lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;{&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// if the requested send size happens to be multiple of EP1Len,&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// we should send a zero length packet to indicate end of data,&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;// here we split the last trunk of data into 2 short packets(EP1Len - 4) and 4 bytes&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;//, so we never need to send a zero length packet&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.375in; FONT-FAMILY: 'Courier New'"&gt;lastPacketLen -= 4;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'"&gt;}&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: 'Courier New'" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1354311" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL/default.aspx">KITL</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/KITL+Timeout/default.aspx">KITL Timeout</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category></item><item><title>How to setup AppVerifier for "Always running" processes</title><link>http://blogs.msdn.com/hopperx/archive/2006/09/26/How-to-setup-AppVerifier-for-_2200_Always-running_2200_-processes.aspx</link><pubDate>Tue, 26 Sep 2006 02:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:771402</guid><dc:creator>deanmel</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/771402.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=771402</wfw:commentRss><description>&lt;P&gt;AppVerifier is a very useful tool when it comes to finding memory leaks. It is relatively easy to configure if you have some understanding of how AKU's and PB work. There are pretty comprehensive instructions on MSDN found &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcedebug5/html/wce50tskrunningtheapplicationverifiertool.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcedebug5/html/wce50tskrunningtheapplicationverifiertool.asp"&gt;here&lt;/A&gt;. However if you need to use AppVerifier on something that loads during boot time, you need to perform extra steps that are harder to find. The purpose of this article is to explain in a greater detail what you need to do to setup AppVerifier for processes that load at boot time.&lt;/P&gt;
&lt;P&gt;Here are simple steps that you need to follow to make AppVerifier work for "Always Running" processes:&lt;/P&gt;
&lt;P&gt;1. Install Platform Builder (tools only install is enough because CETK is included with that install), install AKU if you haven't already&lt;BR&gt;2. Open your AKU build window where you build images&lt;BR&gt;3. (Optional) Removed/reset all the security or make sure it's configured properly&lt;BR&gt;4. Copy all the AppVerifier binaries to your %_FLATRELEASEDIR% by running getappverif_cetk.bat from your wcetk directory.&amp;nbsp;&lt;BR&gt;
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; POSITION: relative" ;&gt;a. Default is "c:\Program Files\Platform Builder for Windows Mobile\5.00\CEPB\wcetk\DDTK\DESKTOP\getappverif_cetk.bat"&lt;BR&gt;b. Or copy them manually. Here is the list of files needed (AppVerif* shim_*.dll symhlp.dll vlog.dll lmemdebug_autoshim.dll shimeng.dll)&lt;/DIV&gt;5. Set the environment variables for the modules that need to be shimmed in our case device.exe and the OEM dlls that you want to check&lt;BR&gt;
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; POSITION: relative" ;&gt;a. Run SET VERIFY_MODULES=device.exe &amp;lt;list the rest of your dlls and exes delimited by spaces&amp;gt;. For example: SET VERIFY_MODULE=device.exe atidrv.dll &lt;/DIV&gt;6. Set IMGSHIMENABLE=1 if you have set IMGPERSISTENTSTORAGE=1&lt;BR&gt;7. Set VERIFY_OPTIONS=EnableFanOut (read more about options later ion the article)&lt;BR&gt;8. Run makeverifyfile.bat from your WCETK directory (default is at "c:\Program Files\Platform Builder for Windows Mobile\5.00\CEPB\wcetk\DDTK\DESKTOP\makeverifyfile.bat")&lt;BR&gt;9. Run makeimg.exe&lt;BR&gt;10. Make sure that all shim dlls got signed properly&lt;BR&gt;11. Flash the image on to the device&lt;BR&gt;12. Connect the device to KITL and boot it (you don't need KITL but it's much more convenient to have it)&lt;BR&gt;13. To make sure that KITL is connected you should see things like 
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; POSITION: relative" ;&gt;a. TID:&amp;lt;address&amp;gt; ++Shim autoloader&lt;BR&gt;b. Found shim 'shim_heap.dll'&lt;BR&gt;c. And so on&lt;/DIV&gt;14. Unfortunately there is no magic bullet that would just show all the memory leaks. The best way to find a leak is to get a snapshot then run user scenarios then get a delta. Here is an example of what can be done:&lt;BR&gt;
&lt;DIV style="BORDER-TOP: #fefefe 2px solid; MARGIN-LEFT: 25px; POSITION: relative" ;&gt;a. Boot the device&lt;BR&gt;b. Run 'heapverif device.exe chk' (this will create a check point on device.exe)&lt;BR today in&lt;BR plug or driver your test that tests the all Run c.&gt;d. Run 'heapverif device.exe delta' (this will report the potential leaks since the last check point on device.exe)&lt;BR&gt;e. Repeat these steps to find all the leaks&lt;BR&gt;&lt;/DIV&gt;&lt;BR&gt;&lt;STRONG&gt;Obtaining the log file &lt;/STRONG&gt;
&lt;P&gt;If you are connected with KITL the log file with AppVerifier information can be found in your release directory it should be called something like this &lt;BR&gt;AppVerifier_&amp;lt;ProcessName&amp;gt;_&amp;lt;ProcessIdentifier&amp;gt;.log older versions of AppVerifier might call it VerifierLog_&amp;lt;AppName_&amp;lt;ProcessIdentifier&amp;gt;.log&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=771402" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/AppVerifier/default.aspx">AppVerifier</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/Application+Verifier/default.aspx">Application Verifier</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category></item><item><title>DevHealth's mysterious dup(d) type explained</title><link>http://blogs.msdn.com/hopperx/archive/2006/09/19/devhealth-s-mysterious-dup-d-type-explained.aspx</link><pubDate>Wed, 20 Sep 2006 00:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:762705</guid><dc:creator>deanmel</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/hopperx/comments/762705.aspx</comments><wfw:commentRss>http://blogs.msdn.com/hopperx/commentrss.aspx?PostID=762705</wfw:commentRss><description>&lt;P&gt;If you run DevHealth on your devices you probably saw dup(d) on the page summary for a process or a dll. It looks something like this:&lt;/P&gt;
&lt;P&gt;=== lap_pw.dll page summary: code=0[rom(C):0 ram(c):0] data r/o(R)=0 r/w=0[ro(r)=0 rw(W)=0 exe(E)=0 dll(D)=0 heap(H)=0] page(p)=0 stack(S)=0 &lt;STRONG&gt;dup(d)=0&lt;/STRONG&gt; unknown(?)=0 obj(O)=0 reserved(-)=23&lt;/P&gt;
&lt;P&gt;A lot of times it equals 0 but sometimes you see other values. MSDN and Platform Builder documentation has some of the information about DevHealth which you can find &lt;A href="ms-help://MS.WindowsCE.501/mobpbguide5/html/wce50conTargetControlDebuggingCommands.htm" mce_href="ms-help://MS.WindowsCE.501/mobpbguide5/html/wce50conTargetControlDebuggingCommands.htm"&gt;here&lt;/A&gt; or &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcepb40/html/_wcepb_Using_Cesh_exe_Debugging_Commands.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcepb40/html/_wcepb_Using_Cesh_exe_Debugging_Commands.asp"&gt;here on MSDN&lt;/A&gt;. Scroll down to "The following table shows the memory information definitions that are included in the page summary" table it has some of the definitions that DevHealth uses in its reports.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;In the past we received several emails from OEMs concerned that these might be memory leaks because the name kind of suggests it. Please do not be alarmed. It will become clear why in a few moments.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;First thing that DevHealth does is it checks what’s called a “Secure Section” of the OS. "Secure Section" is a special 32Mb section that lives in Kernel space Slot 93 (c2000000). This section is designed to keep all the DLLs and read/write code that processes load into Slot 0. To put it in other words, if a DLL ever shows up in Slot 0 then it will show up in Secure Section. &lt;BR&gt;&amp;nbsp;&lt;BR&gt;This is a housekeeping mechanism which allows the loader to only load a particular DLL once greatly increasing the loading speed. When the next process asks for the same DLL, since the OS has it loaded in Secure Slot, it just references that DLL and increments the ref count. In the end Secure Slot is an ORed (&lt;A href="http://en.wikipedia.org/wiki/OR_gate" mce_href="http://en.wikipedia.org/wiki/OR_gate"&gt;logical OR&lt;/A&gt;) version of all the DLLs that ever show up in Slot 0.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;Let's look at an example which will hopefully clarify some things. If we have two Processes. Process 1 which has loaded DLL A and DLL C and Process 2 that has loaded DLL B and DLL C. 
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;IMG src="http://blogs.msdn.com/photos/deanmel/images/756303/425x279.aspx" mce_src="http://blogs.msdn.com/photos/deanmel/images/756303/425x279.aspx"&gt; 
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;As I mentioned previously DevHealth reads the “Secure Section” first and when it sees DLL A, B and C in it (remember all the DLLs that show up in Slot 0 show up ORed in the "Secure Section"). Then it reads Section 0 and sees that Process 1 has DLL A and C loaded. As it prints this information out it will print them as dup(d) type meaning that it already saw this DLL pages. Same thing happens for the Process 2.&lt;BR&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=762705" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/hopperx/archive/tags/DeanMel/default.aspx">DeanMel</category><category domain="http://blogs.msdn.com/hopperx/archive/tags/WM6/default.aspx">WM6</category></item></channel></rss>