<?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>Mahjayar's WebLog. : Debugging</title><link>http://blogs.msdn.com/mahjayar/archive/tags/Debugging/default.aspx</link><description>Tags: Debugging</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>DbSyncProvider: Improving memory performance involving execissive conflicts.</title><link>http://blogs.msdn.com/mahjayar/archive/2009/01/15/dbsyncprovider-improving-memory-performance-involving-execissive-conflicts.aspx</link><pubDate>Thu, 15 Jan 2009 23:17:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9321485</guid><dc:creator>Mahjayar</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mahjayar/comments/9321485.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mahjayar/commentrss.aspx?PostID=9321485</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mahjayar/rsscomments.aspx?PostID=9321485</wfw:comment><description>&lt;p align="justify"&gt;&lt;font size="2"&gt;This is the second post aimed at providing tips for improving runtime memory footprint when using the P2P &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.synchronization.data.dbsyncprovider.aspx"&gt;DbSyncProvier&lt;/a&gt; class in V2 of SyncServices for ADO.NET. &lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;First post link: &lt;/font&gt;&lt;a title="DbSyncProvider- Improving Memory Performance In WCF Based Synchronization" href="http://blogs.msdn.com/mahjayar/archive/2008/10/01/dbsyncprovider-improving-memory-performance-in-wcf-based-synchronization.aspx"&gt;&lt;font size="2"&gt;DbSyncProvider- Improving Memory Performance In WCF Based Synchronization&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;We have had customers report memory usage surging when DbSyncProvider is applying changes from a peer and encounters conflicts. If the number of conflicts increases the memory usage spikes and pretty soon will run out of memory.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;After debugging, we narrowed down the issue down to a property in &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.synchronization.data.dbsynctableprogress.aspx"&gt;DbSyncTableProgress&lt;/a&gt; class: Conflicts. This property was being used by the runtime to “log” conflicts that were skipped during that Sync session. DbSyncTableProgress holds the running count of progress made during a sync session for each sync adapter configured. Whenever the system encounters a Conflict while applying a row it will try to invoke the optional conflict event handler. The runtime will then decide what to do with the row based on the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.synchronization.data.applyaction.aspx"&gt;ApplyAction&lt;/a&gt; enum returned by that event handler. The default action is ApplyAction.Continue which means the runtime will assume “LocalWins” resolution and just update the local metadata for that row and move on. That is the best case scenario. Now lets see the worst case scenarios: we have two.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;1. No event handler registered but row application failed due to Database error.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;2. User registered event handler returned an ApplyAction of RetryNextSync.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;The first case can happen for a variety of reasons such as errors in user configured TSQL command, typos in user configured Stored proc names or params, error in executing stored proc or database timeouts or other database related errors. The second is just a normal way of saying “dont worry about this row for this sync and we will try this again in the next sync”. Since the P2P provider is based off of Microsoft Sync Framework choosing RetryNextSync adds an exception for that particular row in the sync knowledge and moves on. This exception will tell the source to resend the row during the next sync.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;Whenever the above two scenarios happen the runtime will “log” the conflict in the corresponding DbSyncTableProgress for that table. Logging includes cloning the source DataRow and the local DataRow and storing it in DbSyncTableProgress.Conflicts property. So for each conflict the runtime caches the source and destination row. If the number of conflicts increases or the size of each DataRow is large the system will gobble up available memory eventually leading to OutOfMemory exceptions. &lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;This property was carried over from &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.synchronization.data.synctableprogress_members.aspx"&gt;SyncTableProgress&lt;/a&gt; type in SyncServices V1. SyncServices V1 was an anchor based hub-spoke synchronization. V1 too had conflict resolution handling and one such option was to skip applying rows. Since the runtime had no way of storing anchors for those skipped rows, those rows would never ever be synchronized again (until a future changed to the same row happens). So, we had to aggregate and log all such conflicts so users can view it at the end of a sync session and take appropriate action. As you can see with the advent of SyncFramework this property is no longer needed as this bookkeeping is automatically done by the SyncFramework API’s.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;&lt;strong&gt;Workaround&lt;/strong&gt;:&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;So there is a simple workaround to avoid this issue. Workaround is to implement the SyncProgress event handler on DbSyncProvider and clear the Conflicts collection on the TableProgress property.&lt;/font&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="left"&gt;&lt;font size="2"&gt;this.peerProvider.SyncProgress += &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#008000"&gt;EventHandler&lt;/font&gt;&amp;lt;&lt;font color="#008000"&gt;DbSyncProgressEventArgs&lt;/font&gt;&amp;gt;(peerProvider_SyncProgress);&lt;/font&gt;&lt;/p&gt;    &lt;p align="left"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p align="left"&gt;&lt;font size="2"&gt;void peerProvider_SyncProgress(object sender, &lt;font color="#008000"&gt;DbSyncProgressEventArgs&lt;/font&gt; e)         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; e.TableProgress.Conflicts.Clear();         &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font size="2"&gt;This will ensure that the collection is always cleared and no extra memory will be used. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Ps: This bug is on track to be fixed for the next release.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Maheshwar Jayaraman&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9321485" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mahjayar/archive/tags/Debugging/default.aspx">Debugging</category><category domain="http://blogs.msdn.com/mahjayar/archive/tags/Sync+Framework/default.aspx">Sync Framework</category><category domain="http://blogs.msdn.com/mahjayar/archive/tags/DbSyncProvider/default.aspx">DbSyncProvider</category></item><item><title>Microsoft releasing .NET framework source code</title><link>http://blogs.msdn.com/mahjayar/archive/2007/10/03/microsoft-releasing-net-framework-source-code.aspx</link><pubDate>Thu, 04 Oct 2007 01:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5268234</guid><dc:creator>Mahjayar</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mahjayar/comments/5268234.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mahjayar/commentrss.aspx?PostID=5268234</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mahjayar/rsscomments.aspx?PostID=5268234</wfw:comment><description>&lt;P&gt;Microsoft is releasing the source code for the framework libraries. Read more about it &lt;A class="" href="http://weblogs.asp.net/scottgu/archive/2007/10/03/releasing-the-source-code-for-the-net-framework-libraries.aspx" mce_href="http://weblogs.asp.net/scottgu/archive/2007/10/03/releasing-the-source-code-for-the-net-framework-libraries.aspx"&gt;here&lt;/A&gt;. Its not like you couldnt do this earlier. You could always have used .Net Reflector but having the ability to step in to the framework classes while debugging is neat. Looks like plans are on for releasing the source code for WCF as well! &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5268234" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mahjayar/archive/tags/WCF+_2800_Indigo_2900_/default.aspx">WCF (Indigo)</category><category domain="http://blogs.msdn.com/mahjayar/archive/tags/Debugging/default.aspx">Debugging</category></item><item><title>Debugging the mystery of the crashing desktop</title><link>http://blogs.msdn.com/mahjayar/archive/2007/04/01/debugging-the-mystery-of-the-crashing-desktop.aspx</link><pubDate>Mon, 02 Apr 2007 05:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2009427</guid><dc:creator>Mahjayar</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mahjayar/comments/2009427.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mahjayar/commentrss.aspx?PostID=2009427</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mahjayar/rsscomments.aspx?PostID=2009427</wfw:comment><description>&lt;P&gt;My home desktop running Vista would crash with a blue screen everytime I logged in the main console if I had remotely logged in via TerminalServices prior to that. This was happening every time I connected remotely to the box and couple of weeks earlier I found another way of crashing it. I was able to consistently crash the system if I logged in as Guest and then login with main account. Prior to today, I never bothered to check why it crashed as I attributed the crash to some faulty driver not updated for vista and I had a simple workaround of restarting the computer before disconnecting from my remote session (I know its not the ideal way but it worked for me). My desktop is a Gateway T3306, a "cheap" desktop that I had purchased during 2005 thanksgiving. The desktop was bare bones and I had beefed it up by adding extra memory/disk. &lt;/P&gt;
&lt;P&gt;Last week I attended &lt;A class="" href="http://blogs.msdn.com/controlpanel/blogs/www.solsem.com" mce_href="http://blogs.msdn.com/controlpanel/blogs/www.solsem.com"&gt;David Solomon's&lt;/A&gt; &amp;nbsp;5 day course on "&lt;A class="" href="http://www.solsem.com/class_internals.html" mce_href="http://www.solsem.com/class_internals.html"&gt;&lt;FONT color=#555555&gt;Windows OS Internals&lt;/FONT&gt;&lt;/A&gt;" and part of that talked about debugging a system crash dump. After the exercise I decided to come home and check the dumps to see which driver was actually causing the crash. &lt;/P&gt;
&lt;P&gt;I started up Windbg and loaded the latest dump from \windows directory and the autoanalyze gave me the following output.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;PAGE_FAULT_IN_NONPAGED_AREA (50)&lt;BR&gt;Invalid system memory was referenced.&amp;nbsp; This cannot be protected by try-except,&lt;BR&gt;it must be protected by a Probe.&amp;nbsp; Typically the address is just plain bad or it&lt;BR&gt;is pointing at freed memory.&lt;BR&gt;Arguments:&lt;BR&gt;Arg1: dd05221e, memory referenced.&lt;BR&gt;Arg2: 00000000, value 0 = read operation, 1 = write operation.&lt;BR&gt;Arg3: 90ea9301, If non-zero, the instruction address which referenced the bad memory&lt;BR&gt;&amp;nbsp;address.&lt;BR&gt;Arg4: 00000002, (reserved)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;FOLLOWUP_NAME:&amp;nbsp; MachineOwner&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;SYMBOL_NAME:&amp;nbsp; win32k!SearchIconCache+20&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;FAILURE_BUCKET_ID:&amp;nbsp; 0x50_win32k!SearchIconCache+20&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;BUCKET_ID:&amp;nbsp; 0x50_win32k!SearchIconCache+20&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Followup: MachineOwner&lt;/EM&gt;&lt;BR&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The followup usually points to a driver if it finds one in the thread callstack that caused the &lt;STRONG&gt;KiTrap0E&lt;/STRONG&gt; error (crash). &lt;STRONG&gt;MachineName&lt;/STRONG&gt; usually means that it didnt find a driver in the stack. Walking the stack using the &lt;STRONG&gt;k&lt;/STRONG&gt; command produced the following output.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;EM&gt;kd&amp;gt; k&lt;BR&gt;ChildEBP RetAddr&amp;nbsp; &lt;BR&gt;a0c9fc30 81c8fa74 nt!MmAccessFault+0x106&lt;BR&gt;a0c9fc30 90ea9301 nt!KiTrap0E+0xdc&lt;BR&gt;a0c9fcc4 90ea93bc win32k!SearchIconCache+0x20&lt;BR&gt;a0c9fce4 90ea94ab win32k!_FindExistingCursorIcon+0x4a&lt;BR&gt;a0c9fd50 81c8c96a win32k!NtUserFindExistingCursorIcon+0xe5&lt;BR&gt;a0c9fd50 77ce0f34 nt!KiFastCallEntry+0x12a&lt;BR&gt;WARNING: Frame IP not in any known module. Following frames may be wrong.&lt;BR&gt;001be900 00000000 0x77ce0f34&lt;BR&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;So the stack points to a Win32k thread trying to call a &lt;STRONG&gt;SearchIconCache&lt;/STRONG&gt; method. Tried searching on the method name but didnt hit anything. So tried to see what it was trying to do with memory location &lt;EM&gt;&lt;STRONG&gt;dd05221e&lt;/STRONG&gt; &lt;/EM&gt;mentioned in the argument so the bubcheck. Did a unassemble at the &amp;nbsp;return address for the Trap0E function and got this.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;kd&amp;gt; u 90ea9301 &lt;BR&gt;win32k!SearchIconCache+0x20:&lt;BR&gt;90ea9301 663b461c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ax,word ptr [esi+1Ch]&lt;BR&gt;90ea9305 754e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jne&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; win32k!SearchIconCache+0x74 (90ea9355)&lt;BR&gt;90ea9307 f6462004&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test&amp;nbsp;&amp;nbsp;&amp;nbsp; byte ptr [esi+20h],4&lt;BR&gt;90ea930b 7448&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; je&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; win32k!SearchIconCache+0x74 (90ea9355)&lt;BR&gt;90ea930d 668b461e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ax,word ptr [esi+1Eh]&lt;BR&gt;90ea9311 663b4704&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ax,word ptr [edi+4]&lt;BR&gt;90ea9315 753e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jne&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; win32k!SearchIconCache+0x74 (90ea9355)&lt;BR&gt;90ea9317 8d4614&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lea&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax,[esi+14h]&lt;BR&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The first statement compares a value pointed by pointer (esi + 1ch). ESI register had the value dd052202&amp;nbsp; and adding 1CH points to memory location dd05221e which is the same as the one pointed by the bugcheck argument. The memory at dd05221e pointed to nothing/garbage.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;kd&amp;gt; dd dd05221e&lt;BR&gt;dd05221e&amp;nbsp; ???????? ???????? ???????? ????????&lt;BR&gt;dd05222e&amp;nbsp; ???????? ???????? ???????? ????????&lt;BR&gt;dd05223e&amp;nbsp; ???????? ???????? ???????? ????????&lt;BR&gt;dd05224e&amp;nbsp; ???????? ???????? ???????? ????????&lt;BR&gt;dd05225e&amp;nbsp; ???????? ???????? ???????? ????????&lt;BR&gt;dd05226e&amp;nbsp; ???????? ???????? ???????? ????????&lt;BR&gt;dd05227e&amp;nbsp; ???????? ???????? ???????? ????????&lt;BR&gt;dd05228e&amp;nbsp; ???????? ???????? ???????? ????????&lt;BR&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;the address dd05221e is kernel mode address space and hence this meant some kernel mode code was pointing to a wrong address or had its address space overwritten by a rogue driver as the memory could have been corrupted long before poor Win32K tried to do what it was doing. The process that was running this thread during the crash was &lt;STRONG&gt;mobsync.exe&lt;/STRONG&gt; and from running &lt;STRONG&gt;procmon&lt;/STRONG&gt; on my live system I found that it was the &lt;STRONG&gt;Microsoft Mobile Sync&lt;/STRONG&gt; service running within the "Plug n Play" svchost service. Apparently this kicks in when I open the "Sync Center" or when you plugin a Windows mobile device which I had done occasionally on this PC. To confirm whether this process was the culprit each time my system crashed I opened all Minidumps from &lt;STRONG&gt;\Windows\Minidumps&lt;/STRONG&gt; folder. Vista by default stores minidumps of all crashes in &lt;STRONG&gt;\Windows\MiniDump&lt;/STRONG&gt; folder but keeps overwriting the full kernel dump at &lt;STRONG&gt;\Windows\Memory.dmp&lt;/STRONG&gt;.&amp;nbsp;I was surprised to find that each minidump showed the same &lt;STRONG&gt;mobsync&lt;/STRONG&gt;&amp;nbsp;process &amp;nbsp;as the culprit with identical callstack as the kernel dump. I was almost convinced to fill a bug with the sync team and add the kernel dump for reference but&amp;nbsp;then I decided to check one more detail before filing the bug. I read up on the BugCheck code 0x50 and here is what the documentation had to say about it.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;H4&gt;&lt;EM&gt;Cause&lt;/EM&gt;&lt;/H4&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Bug check 0x50 usually occurs after the installation of faulty hardware or in the event of failure of installed hardware (usually related to defective RAM, be it main memory, L2 RAM cache, or video RAM).&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Another common cause is the installation of a faulty system service.&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Antivirus software can also trigger this error, as can a corrupted NTFS volume.&lt;/EM&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Great, the cause could be &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;faulty RAM (Which I ruled out as I just had a faulty RAM crash at work and the blue screen was completely different for that. I also confirmed this by looking at the BIOS log which usually mentions which DIMM faulted)&lt;/LI&gt;
&lt;LI&gt;Video RAM&lt;/LI&gt;
&lt;LI&gt;System Service (Which mobsync.exe is)&lt;/LI&gt;
&lt;LI&gt;AntiVirus (I had to rule out service and video ram before trying this out)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;My Video card is an integrated S3/Via UniChrome Pro card from S3Graphics.com and looking up their site for updated Vista drivers yielded no results. That leaves me with two options, spend $$ on a video card and hope the problem goes away or try to confirm the issue with the mobsync team before spending the money. I think I am going to opt for the second option. I plan on turning on Driver Verification for the video card and then trying to reproduce the crash to see if &lt;STRONG&gt;DriverVerifier&lt;/STRONG&gt; catches it and if that doesnt help then file the bug and wait. I will update later on how my DriverVerifier experiment went along.&lt;/P&gt;
&lt;P&gt;Bottom line is I got more out of "Windows OS Internals" class that what I had initially hoped and I would strongly recommend it esp for people working on drivers. &lt;A class="" href="http://en.wikipedia.org/wiki/Mark_Russinovich" mce_href="http://en.wikipedia.org/wiki/Mark_Russinovich"&gt;Mark Russionovich&lt;/A&gt; made a guest appearance at the class talking about UAC and impressed everyone with his brilliance. &lt;/P&gt;
&lt;P&gt;Maheshwar Jayaraman&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2009427" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mahjayar/archive/tags/Random+Thoughts/default.aspx">Random Thoughts</category><category domain="http://blogs.msdn.com/mahjayar/archive/tags/Debugging/default.aspx">Debugging</category></item></channel></rss>