<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-12304400</id><updated>2012-01-27T15:09:52.316-08:00</updated><category term='NTFS'/><category term='Vista'/><category term='Visual Studio'/><category term='MindManager'/><category term='data security'/><category term='Microsoft'/><category term='debugging'/><category term='Outlook'/><category term='VB.NET'/><category term='Windows'/><category term='XAML'/><category term='VSTO'/><category term='general security'/><category term='HTPC'/><category term='netflix'/><category term='python'/><category term='SDL'/><category term='EFS'/><category term='MOSS'/><category term='usability'/><category term='Mac Mini'/><category term='BDE'/><category term='Patterns and Practices'/><category term='personal'/><category term='authentication'/><category term='dogs'/><category term='Web Services'/><category term='TPM'/><category term='SharePoint'/><category term='XML'/><category term='ux'/><category term='.net coding'/><category term='Google'/><category term='HFS+'/><category term='random rants'/><category term='C#'/><category term='VBA'/><category term='Threat Modeling'/><category term='iPhone'/><category term='Agile'/><category term='coding'/><category term='MCML'/><category term='Vista Media Center'/><category term='career'/><category term='CacheMyWork'/><category term='Wiki'/><category term='WPF'/><category term='CodePlex'/><category term='InfoPath'/><title type='text'>ParanoidMike</title><subtitle type='html'>Security geek and web architect by day; comic book geek and glass artist by leisure.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default?start-index=101&amp;max-results=100'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>155</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12304400.post-7904800267561913812</id><published>2012-01-27T15:09:00.000-08:00</published><updated>2012-01-27T15:09:52.340-08:00</updated><title type='text'>Stalk Google's stalking of you</title><content type='html'>What with all the attention on Google right now because of the sweeping and selfish privacy policy changes they &lt;a href="http://www.google.com/intl/en/policies/" target="_blank"&gt;just publicized&lt;/a&gt;, it's smart, fun and sometimes a little disturbing to see just what Google's advertising arm thinks it knows about you. &amp;nbsp;Play along at home - browse to this page from whatever browser(s) you like to use, and compare with what I found.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.google.com/ads/preferences"&gt;http://www.google.com/ads/preferences&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
(1) Here's what Google thinks based on the cookie in my iPhone's Twitter cache:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Your categories&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Below you can review the interests and inferred demographics that Google has associated with your cookie. You can remove or edit these at any time.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Arts &amp;amp; Entertainment - Comics &amp;amp; Animation - Comics&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Arts &amp;amp; Entertainment - Humor - Live Comedy&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Your demographics&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;We infer your age and gender based on the websites you've visited. You can remove or edit these at any time.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Age: 35-44&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Gender: Male&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
(2) Here's what Google says about me (the same user) according to my&lt;br /&gt;
iPhone's browser cookie (i.e. in Safari):&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Your categories&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Below, you can review the interests and inferred demographics that Google has associated with your cookie. You can remove or edit these at any time.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Beauty &amp;amp; Fitness&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Jobs &amp;amp; Education - Jobs&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Reference - General Reference&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;World Localities - North America - USA - Pacific Northwest - Oregon - Portland (OR)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Your demographics&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;No demographic categories are associated with your ad preferences so far. You can add or edit demographics at any time.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
(3) Here's what Google thinks of me according to Chrome on my laptop:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="r5qKKd" style="background-color: white; color: #333333; font-family: arial, helvetica, 'sans serif'; font-size: 13px; font-weight: bold; line-height: 18px; margin-bottom: 10px; margin-left: 10px; margin-right: 0px; margin-top: 0px;"&gt;
Your categories and demographics&lt;/div&gt;
&lt;div class="BAd8jb GSDaYc" style="background-color: white; color: #222222; font-family: arial, helvetica, 'sans serif'; font-size: 13px; line-height: 18px; margin-bottom: 12px; margin-left: 10px; width: 650px;"&gt;
No interest or demographic categories are associated with your ads preferences so far. You can&amp;nbsp;&lt;a href="https://www.google.com/ads/preferences/view?sig=ACi0TCj5EwRjE3HNCJXHZCueZHwezKpZxibZIWI8ldpHV_PVxikoOsKI2_A1eG-rlHfKHYQKu4Fqnb6tHABpcF4l_xTFLuJMxeo11d10pdqRPkQqmqOXMdF9-YyhQz9pRumt4QQvFyvOEjzHHsAu8Kht5jMAP638KGPp3Vkteot5CtHWZ9WfcXM&amp;amp;hl=en" style="color: #1155cc; text-decoration: none;"&gt;add or edit&lt;/a&gt;&amp;nbsp;interests and demographics at any time.&lt;/div&gt;
&lt;br /&gt;
(4) Here's who they think I am according to IE on my laptop:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="r5qKKd"&gt;
&lt;b&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Your categories&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class="BAd8jb GSDaYc"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Below you can review the interests and inferred 
demographics that Google has associated with your cookie. You can &lt;a href="http://www.google.com/ads/preferences/view?sig=ACi0TChWm4JIakcfSw0-2Eix-gTDcOO_7KuT775iv7PHf11hW0EPOMA6ZS14DvxC_MoEqj34e112KAcr60jGjqJ57Voq39qmA6MJABnTSgOaMq7_led1iEHFnVhl_Yv6JpJuEPOwTgSj09PXDyHKxZhac6_Zlb8TTxRkPCgQ2_ActvG1CVy9nLk&amp;amp;hl=en"&gt;remove 
or edit&lt;/a&gt; these at any time.&lt;/span&gt;&lt;/div&gt;
&lt;div class="lgLFDc BAd8jb"&gt;

&lt;div class="wXI9Cb"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Computers &amp;amp; Electronics - Computer Security - Antivirus 
&amp;amp; Malware&lt;/span&gt;&lt;/div&gt;
&lt;div class="wXI9Cb"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Computers &amp;amp; Electronics - Software - Freeware &amp;amp; 
Shareware&lt;/span&gt;&lt;/div&gt;
&lt;div class="wXI9Cb"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Computers &amp;amp; Electronics - Software - Software 
Utilities&lt;/span&gt;&lt;/div&gt;
&lt;div class="wXI9Cb"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Online Communities - File Sharing &amp;amp; Hosting&lt;/span&gt;&lt;/div&gt;
&lt;div class="wXI9Cb"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Reference - General Reference - Time &amp;amp; 
Calendars&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div class="r5qKKd"&gt;
&lt;b&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Your demographics&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class="BAd8jb GSDaYc"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;We infer your age and gender based on the websites 
you've visited. You can &lt;a href="http://www.google.com/ads/preferences/view?sig=ACi0TChWm4JIakcfSw0-2Eix-gTDcOO_7KuT775iv7PHf11hW0EPOMA6ZS14DvxC_MoEqj34e112KAcr60jGjqJ57Voq39qmA6MJABnTSgOaMq7_led1iEHFnVhl_Yv6JpJuEPOwTgSj09PXDyHKxZhac6_Zlb8TTxRkPCgQ2_ActvG1CVy9nLk&amp;amp;hl=en"&gt;remove 
or edit&lt;/a&gt; these at any time.&lt;/span&gt;&lt;/div&gt;
&lt;div class="OlcKGb BAd8jb"&gt;

&lt;div class="v0kaSb"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Age: 25-34&lt;/span&gt;&lt;/div&gt;
&lt;div class="v0kaSb"&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Gender: Male&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;Frankly, I'm glad that Google has multiple fragmented profiles on me (at least for this usage models of this ad service they sell). If I was to see the exact same data across all apps and devices) I'd be chilled to the bone.&lt;br /&gt;
&lt;br /&gt;
But I'm not naive enough to think they're not deliberately and inevitably taking us (along for the ride) there. The closer try get to a single, unified, aggregated view of my behaviour and interests, the more they'll be able to charge their advertisers for every impression and click-through (or whatever new metrics they're currently stewing up).&lt;br /&gt;
&lt;br /&gt;
Share that revenue stream with me? &amp;nbsp;Then I'm all for the kind of surreptitious gathering that you're doing. &amp;nbsp;Steal that from me and pretend that "more relevant advertising" is fair compensation (legal: "consideration")? &amp;nbsp;You know where you can stuff it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-7904800267561913812?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/7904800267561913812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=7904800267561913812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7904800267561913812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7904800267561913812'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2012/01/stalk-googles-stalking-of-you.html' title='Stalk Google&apos;s stalking of you'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-5221978739256037682</id><published>2012-01-20T10:55:00.000-08:00</published><updated>2012-01-20T10:55:08.873-08:00</updated><title type='text'>Got the "2012 security suite" infection?  This should fix it</title><content type='html'>I heard from colleagues who've been infected with the "2012 security suite" - yet another in a long line of malware that pretends to be an antivirus program, able to shut down legitimate antimalware like McAfee, and gets itself embedded deeply in your system.&lt;br /&gt;
&lt;br /&gt;
Another colleague posted the following instructions on how they got rid of the "2012 security suite" infection. &amp;nbsp;I'm posting as-is with no firsthand knowledge of how well this would work for others, but in the spirit of sharing whatever smarter people have tried in hopes it helps a few others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;"I had to fix this one for a friend recently. &amp;nbsp;I had to use 3 different tools and it took several passes to get in entirely cleaned out. &amp;nbsp;Here’s what worked in the end (I make no guarantees of course):&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Download, install, and update &lt;a href="http://www.malwarebytes.org/products/malwarebytes_free" target="_blank"&gt;Malwarebytes &lt;/a&gt;and &lt;a href="http://www.safer-networking.org/en/mirrors/index.html" target="_blank"&gt;SpyBot Search &amp;amp; Destroy&lt;/a&gt;. &amp;nbsp;They are free. Do this on two computers, the one that’s infected and another one.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Remove the drive from the system and connect it to the other system as a secondary drive. Boot that system into Safe Mode with Networking. &amp;nbsp;Scan with Malwarebytes and allow it to remove anything it finds. &amp;nbsp;Reboot into Safe Mode with Networking and run SpyBot and allow it to remove anything it finds.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;DO NOT REBOOT YET (if you reboot at this point you will be re-infected). &amp;nbsp;First delete the following:&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;%AllUsersProfile%\Application Data\ LocalAppData\kdn.exe&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;%LocalAppData%\Temp\%UserProfile%\Templates&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;All files in c:\windows\temp (Yes you will lose your browsing history and cookies, sorry)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Your Temporary Internet Files (on the infected drive, not the system you’re running on)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Now remove the drive from the second computer and put it back in the original computer.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Boot into Safe Mode with Networking&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Turn off System Restore.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;7.&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Delete the following registry keys if they exist:&lt;/span&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;HKEY_USERS\.DEFAULT\Software\Microsoft\Internet Explorer\BrowserEmulation "TLDUpdates" = '1'&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;HKEY_CURRENT_USER\Software\Classes\.exe\shell\open\command "(Default)" = '"%LocalAppData%\kdn.exe" -a "%1" %*'&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;HKEY_CURRENT_USER\Software\Classes\exefile\shell\open\command "(Default)" = '"%LocalAppData%\kdn.exe" -a "%1" %*'&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;HKEY_CLASSES_ROOT\.exe\shell\open\command "(Default)" = '"%LocalAppData%\kdn.exe" -a "%1" %*'&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\FIREFOX.EXE\shell\open\command "(Default)" = '"%LocalAppData%\kdn.exe" -a "C:\Program Files\Mozilla Firefox\firefox.exe"'&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\FIREFOX.EXE\shell\safemode\command "(Default)" = '"%LocalAppData%\kdn.exe" -a "C:\Program Files\Mozilla Firefox\firefox.exe" -safe-mode'&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\IEXPLORE.EXE\shell\open\command "(Default)" = '"%LocalAppData%\kdn.exe" -a "C:\Program Files\Internet Explorer\iexplore.exe"'&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Security Center "AntiVirusOverride" = '1'&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Security Center "FirewallOverride" = '1'&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Run Malwarebytes and allow it to clean anything it finds.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Reboot into Safe Mode with Networking&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Run Spybot and allow it to clean anything it finds.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Assuming you are able to run your antivirus software, run a full scan of your system.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Reboot normally.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Scan with both tools and your anti-virus software.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Re-enable system restore.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;NOTE: If at any time during this process you find you can no longer start your applications, follow the instructions here: &lt;a href="http://www.techerator.com/2010/03/virus-blocks-exe-files-from-opening-2/"&gt;http://www.techerator.com/2010/03/virus-blocks-exe-files-from-opening-2/&lt;/a&gt; You’ll find a fix that you can download and run."&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-5221978739256037682?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/5221978739256037682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=5221978739256037682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5221978739256037682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5221978739256037682'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2012/01/got-2012-security-suite-infection-this.html' title='Got the &quot;2012 security suite&quot; infection?  This should fix it'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-5914254170275643937</id><published>2012-01-06T21:43:00.001-08:00</published><updated>2012-01-06T21:43:02.411-08:00</updated><title type='text'>2012 Manifesto</title><content type='html'>Here is my manifesto for 2012: to move in a more creative career direction, I will think more visually by working more visually.&lt;br /&gt;
&lt;br /&gt;
I will become my own style of visual designer, user experience engineer, crackpot scientist of ideas. This will happen by spending more of my working day more visually - drawing, whiteboarding, illustrating the noise in my head.  I will create sketches, wireframes, storyboards, flow charts, ideographs, gonzo business apps, unintelligible charts and results that scare the shit out of me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-5914254170275643937?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/5914254170275643937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=5914254170275643937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5914254170275643937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5914254170275643937'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2012/01/2012-manifesto.html' title='2012 Manifesto'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-3056328322133215906</id><published>2011-10-26T09:04:00.001-07:00</published><updated>2011-10-26T09:04:45.276-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='XAML'/><category scheme='http://www.blogger.com/atom/ns#' term='CacheMyWork'/><title type='text'>Status and failure of CacheMyWork development</title><content type='html'>Every month or so I get an email like the following:&lt;br /&gt;
&lt;br /&gt;
Hi, Love your app CacheMyWork. Left some suggestions for improvement on your website a while ago. Any chance you'll release an updated version with more functionality any time soon? Seems to my it has huge potential once it's updated.&lt;br /&gt;
&lt;br /&gt;
I get this kind of email - wondering when I'll finish the app, asking about status, wondering why it seems incomplete or why I haven't integrated [easy fix "X"] - for only one of the open source projects I ever released: http://CacheMyWork.codeplex.com.&lt;br /&gt;
&lt;br /&gt;
Every time I get one of these, I feel like a jerk for not finishing (or continuing) what I started, and I realize that if I was just a better coder, I'd have a lot of happy people out there.&lt;br /&gt;
&lt;br /&gt;
I could never get my head around the databinding that is necessary to connect the WPF front end i built for the "version 2" of my app to the well-formed, totally functional app-finding algorithm I built literally years ago. &lt;br /&gt;
&lt;br /&gt;
I feel like I'm disappointing a lot of people by not getting this back underway, but I really don't have a clue how to fix the damned thing. I think my failure to maintain/improve this project is one reason why I'm giving up on my dream to ever be a professional coder.&lt;br /&gt;
&lt;br /&gt;
I swear something must be wrong with my brain - every time I try to re-learn databinding concepts for .NET they look like they're pretty simple for the author, but when I try to apply the ideas to my code, it never seems to work. I've coded three different data classes, I've tried every combination of parameters in the binding (both the XAML and the code-behind) I could find, but at best I get code parameters in the UI - never anything that hints that the bound data is leaking through (even though I can clearly see the data in the data class when I set breakpoints in the debugger).  It's like I'm not "getting" something about how this is supposed to work - it reminds me of how I was a week or two behind in introductory calculus class, when my brain couldn't visualize what it was we were manipulating with those damned equations. (I finally got the calculus, though I think by now I'd have to start all over again.)&lt;br /&gt;
&lt;br /&gt;
What would you do in this situation?  I'd really like to get this going again - at least make good on the unfinished "new" release, and give myself some closure on that chapter of my geek life.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-3056328322133215906?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/3056328322133215906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=3056328322133215906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3056328322133215906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3056328322133215906'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/10/status-and-failure-of-cachemywork.html' title='Status and failure of CacheMyWork development'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-5463351763594858472</id><published>2011-10-23T12:49:00.003-07:00</published><updated>2011-10-23T12:49:21.263-07:00</updated><title type='text'>Review: Jinx</title><content type='html'>
      &lt;a style='float: left; padding-right: 20px' href='http://www.goodreads.com/book/show/1304291'&gt;&lt;img alt='Jinx' border='0' src='http://photo.goodreads.com/books/1182627752m/1304291.jpg'/&gt;&lt;/a&gt;
      &lt;a href='http://www.goodreads.com/book/show/1304291'&gt;Jinx&lt;/a&gt; by &lt;a href='http://www.goodreads.com/author/show/12424'&gt;Brian Michael Bendis&lt;/a&gt;&lt;br/&gt;
      My rating: &lt;a href='http://www.goodreads.com/review/show/226182220'&gt;4 of 5 stars&lt;/a&gt;
      &lt;br/&gt;&lt;br/&gt;
      I picked this up at a book signing by Bendis last week.  I haven't read it in years and years, and I've read so much of Bendis since that time, I wasn't sure how this would hold up.

As indie comics go, this is a winner.  It's amazing how much of Bendis' talent for dialogue was already there in the beginning, and how well he tuned into that talent and focused on it.  I'm also impressed by the art renderings - I totally forgot that Bendis used to do the art for his books, and I would've encouraged him to keep up this side of it (there's much worse from non-writing artists out there, believe me), had his career not taken off so much as a writer.

The story is pretty thin - just a few set pieces in which to let his characters breathe - but there's three more books' worth of plot after this too, so it's hard to judge the full merits of this fraction of the story arc (and I don't remember the rest of the storyline so I won't embarrass myself by guessing at it).

Most of all, this reminds me why I like Bendis' work so much - he tunes in closely to how people act around each other, and what happens when unusually unlike personalities synthesize into something unlike either of them.
      &lt;br/&gt;&lt;br/&gt;
      &lt;a href='http://www.goodreads.com/review/show/226182220'&gt;View all my reviews&lt;/a&gt;
    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-5463351763594858472?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/5463351763594858472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=5463351763594858472' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5463351763594858472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5463351763594858472'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/10/review-jinx_23.html' title='Review: Jinx'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-6170282145424704534</id><published>2011-10-22T15:40:00.000-07:00</published><updated>2011-10-22T15:41:07.432-07:00</updated><title type='text'>Excommunicating myself from the Church of Alan Moore</title><content type='html'>I'm coming out of the closet: I actively dislike Alan Moore's "masterpieces".&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://upload.wikimedia.org/wikipedia/en/b/b9/Watchmencovers.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="153" src="http://upload.wikimedia.org/wikipedia/en/b/b9/Watchmencovers.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
As a kid I drank up works like Watchmen (fresh! Post-modern capes!), but even then I secretly struggled to enjoy V for Vendetta - simply getting through it without losing any grip on a sense of a cohesive story was a challenge, and I worried there was something wrong with me.&lt;br /&gt;
&lt;br /&gt;
As I returned to comics as an adult, I quickly revisited Moore (elder respected statesmen are supposed to be admired, revered and read, so I did my duty to god and the queen) and slogged through Watchmen (again), then Promethea (directionless softcore), Top Ten (interesting and enjoyable but probably due more to Gene Ha's art) and then League of Extraordinary Gentlemen (curious, teasing with its layers of detail, but ultimately thinly veneered story - more like a series of staged scenes in which to scatter all his historical research).&lt;br /&gt;
&lt;br /&gt;
I told myself I was enjoying it (I really needed to believe I saw what everyone else was talking about), but eventually I got to a point where I saw how many times I would put V on the pile of books but dig underneath it to something I was enjoying - and berating myself for not doing my "required reading". &amp;nbsp;Then I realized that if I didn't enjoy something *that* much, there's actually no good reason why I *should* force myself to finish it. &amp;nbsp;So I didn't. &amp;nbsp;And felt liberated for the epiphany.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://upload.wikimedia.org/wikipedia/en/c/c0/V_for_vendettax.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://upload.wikimedia.org/wikipedia/en/c/c0/V_for_vendettax.jpg" width="131" /&gt;&lt;/a&gt;&lt;/div&gt;
My &lt;a href="http://www.goodreads.com/review/show/120523415"&gt;review on Goodreads of V for Vendetta&lt;/a&gt;&amp;nbsp;is simply this: "Awful, stilted writing. Reads like an assigned book from a first-year Literature class - not something to be enjoyed but to be excruciatingly endured. Should be required reading for the Guantanamo set."&lt;br /&gt;
&lt;br /&gt;
My opinions on Alan Moore's masterpieces started to turn when I started to read &lt;a href="http://www.goodreads.com/review/show/192507436"&gt;some&lt;/a&gt; &lt;a href="http://www.goodreads.com/review/show/192510042"&gt;dissent&lt;/a&gt; from fellow readers/reviewers on Goodreads and really crystallized when I started commenting in &lt;a href="http://www.goodreads.com/topic/show/649045-optional-book-club-discussion-watchmen-by-alan-moore-sept-12-oct-11"&gt;the recent "book club discussion" on Goodreads&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The more I think about Watchmen the book vs. Watchmen the movie, the more I realise that Moore's greatest achievements are writing the wordy equivalent of a Where's Waldo puzzle. His dialogue's not bad and at least the plots aren't telegraphed from page 1, but his characterisations are absurdly inhuman and the work is needlessly overwritten with irrelevant trivia. &amp;nbsp;It's like an artist who has a bad case of OCD - he can't put the damned brush down, even after he's layered on so much paint that the original picture is completely inscrutable underneath the layers of random strokes and irrelevant tangents, that all look pretty but have destroyed anything worth rendering to the world.&lt;br /&gt;
&lt;br /&gt;
Hiding your pretty storyline behind (or burying it under) details that don't advance the story is a way of teasing the smarties in the audience and making making them feel smarter than "other readers", but the conceit falls down once you realise that "other readers" don't care to crack an encyclopaedia every page or two - we lose the rhythm of the plot (if there is one) in trying to figure out what that next metal trap is all about.&lt;br /&gt;
&lt;br /&gt;
As a kid I loved how I could feel smarter than my peers while reading this kind of stuff (even though truthfully I only understood about 1/4 of the references and just imagined that there was weighty importance to the rest).  Now, I find things like Watchmen, LoXG or that turgid thesis V just tiresome and laborious to slog through, especially when trying to ignore Moore's desperate pleas to "look at how smart I am" and find the underlying story that's still worth enjoying.  Somehow the movies were able to emulate Moore's staging and still find a way to *connect* with the moviegoer - but just barely, considering how slavish they were to nearly every page of layout and dialogue.&lt;br /&gt;
&lt;br /&gt;
I feel at once brave and stupid for putting this out to the world - like I'm going to lose a number of people who would've otherwise tried to like me, but are put off because I just called their favourite baby ugly. &amp;nbsp;I can only offer that my standards have changed since I first started reading comics, and this no longer holds the line for most exciting works in comics for me. "At the time his work was amazing" is an historical conceit, but if that's the best reason I can come up with to convince myself to like it, I'll move onto something I just *naturally* enjoy today. There's a wide world of books and tastes out there these days, and for me I'm glad to have more than Moore to choose from.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-gABcZUJsL68/TqNE0rgzQLI/AAAAAAAAAeM/em-316Hx3UA/s1600/fight-club.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-gABcZUJsL68/TqNE0rgzQLI/AAAAAAAAAeM/em-316Hx3UA/s1600/fight-club.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
I still like Moore's &lt;a href="http://www.imdb.com/title/tt0137523/quotes?qt=qt0479131"&gt;cleverness&lt;/a&gt; (despite my self-consciousness at &lt;i&gt;why &lt;/i&gt;I like it), and what I don't like about his work, many others do. We don't have to agree on what's best, nor would I enjoy the medium as much if there was no variety to choose from or be surprised by. I appreciate that others don't agree with me, and in many cases I'm ready to understand something I've missed that others see. I've thought a lot about Moore's work over the years and my opinions have evolved - but hasn't entirely stagnated. Who knows? Maybe in another ten years I'll see something there that isn't apparent to me now, and I might be horribly embarrassed by these current opinions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-6170282145424704534?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/6170282145424704534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=6170282145424704534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6170282145424704534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6170282145424704534'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/10/blasphemy-disagreeing-with-church-of.html' title='Excommunicating myself from the Church of Alan Moore'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-gABcZUJsL68/TqNE0rgzQLI/AAAAAAAAAeM/em-316Hx3UA/s72-c/fight-club.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-3801906691481653792</id><published>2011-10-22T13:11:00.000-07:00</published><updated>2011-10-22T13:12:56.756-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Considering learning Python - idle thought (until something catalyses it)</title><content type='html'>&lt;br /&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
A friend-of-a-friend asked me this week:&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;blockquote&gt;
Hi Mike, [mutual friend] referred me to you as a good person to ask: what's the best way to learn Python for someone like me, whose programming skills are essentially 1990-era (I know Perl and C, but haven't made the leep to object oriented stuff)? I'd like to leapfrog into the present era, and make web 2.0-ish-looking sites and experiments. Is there a particular web hosting service I should use? Thanks for any advice you might have.&lt;/blockquote&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
Funny you should ask - I was just wondering this week whether I shouldn't dive into Python as a quick-and-dirty prototyping language. &amp;nbsp;I'd fancied myself for years as someone who might be able to reinvent myself as a programmer, and I've muddled around with C# and VB for a few years now - but only in short spurts. &amp;nbsp;Every time I come back to it, I feel like I'm climbing a steep hill all over again.&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
For some reason, I get the impression that &amp;nbsp;for folks that are just whipping something together quickly, interpreted scripting languages like Python, Perl or Javascript are easier to deal with - less overhead, less setup, just diving in and getting to the business of making something happen. &amp;nbsp;I've always felt like if I wanted to call myself a coder, that I'd be "cheating" by taking this route, so I never allowed myself the freedom to try this out. &amp;nbsp;But at the same time, I was never brave/patient enough to mess around with low-level code like C or C++ (who wants to write hundreds of lines of memory-handling routines that managed code gives you for 'free'?), so I guess I've left myself between a rock and hard place - not quite as easy as "just do it" but not really forcing myself to learn the really "worthy" stuff either.&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
How to learn Python? &amp;nbsp;An almost-colleague of mine took the leap and blogged his process for going deep - start at the bottom:&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
&lt;a href="http://www.curphey.com/category/python/"&gt;http://www.curphey.com/category/python/&lt;/a&gt;&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
I've never done it myself, but I trust that Mark is a smart guy who doesn't muck around for the sake of making himself "look smart" (feel miserable).&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
For me, forcing myself to learn to code was an exercise in frustrating false starts - until I found a problem I couldn't solve any way but coding it myself, and a problem that pissed me off enough to keep slogging through failures and dead ends until I got something working.&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
Web hosting? &amp;nbsp;No idea. &amp;nbsp;I know a few big names (AWS, Rackspace, Google Apps) but I have no clue where to get the pre-built infrastructure to just upload .py and let fly.&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: arial; font-size: small;"&gt;
Is this helpful? &amp;nbsp;Do you have something specific in mind? &amp;nbsp;If you're working on something specific and looking to work loosely with one or a few others, I'd be interested in hearing what it is and whether it fires my "that sucks!" instinct enough to want to contribute/walk alongside.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-3801906691481653792?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/3801906691481653792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=3801906691481653792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3801906691481653792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3801906691481653792'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/10/considering-learning-python-idle.html' title='Considering learning Python - idle thought (until something catalyses it)'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-1700901237053383390</id><published>2011-10-14T23:53:00.000-07:00</published><updated>2011-10-23T22:41:53.168-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>Got a new iPhone 4S? Worried about how to "maximize the battery"? Me too</title><content type='html'>Just got the iPhone 4S today, and before I even *powered it up*, I made a point of digging around the Interwebs to find out whether I should (a) drain the battery &amp;amp; fully charge it a few times (to 'condition' it), or (b) charge it as much and as frequently as I can. &amp;nbsp;I've literally heard both urban legends over the years, and even though I keep buying Li-ion battery'd devices, I can simply never keep it straight (or feel confident that the story is true and consistent).&lt;br /&gt;
&lt;br /&gt;
Today's research yielded a couple of great links, and while I'm sure this isn't 100% definitive (I didn't even go through the 2nd page of Google results), it's compelling enough for me:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://forums.macrumors.com/showthread.php?t=943276"&gt;http://forums.macrumors.com/showthread.php?t=943276&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
"&lt;span class="Apple-style-span" style="background-color: #eeeeee; font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px;"&gt;Preparing new lithium-ion for use&lt;/span&gt;&lt;br /&gt;
&lt;br style="background-color: #eeeeee; font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px;" /&gt;&lt;span class="Apple-style-span" style="background-color: #eeeeee; font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px;"&gt;Unlike nickel and lead-based batteries, a new lithium-ion pack does not need cycling through charging and discharging. Priming will make little difference because the maximum capacity of lithium-ion is available right from the beginning. Neither does a full discharge improve the capacity of a faded pack. However, a full discharge/charge will reset the digital circuit of a 'smart' battery to improve the state-of-charge estimation&lt;/span&gt;"&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://batteryuniversity.com/learn/article/how_to_prolong_lithium_based_batteries"&gt;http://batteryuniversity.com/learn/article/how_to_prolong_lithium_based_batteries&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
"&lt;span class="Apple-style-span" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: x-small; line-height: 18px;"&gt;Similar to a mechanical device that wears out faster with heavy use, so also does the depth of discharge (DoD) determine the cycle count. The smaller the depth of discharge, the longer the battery will last. If at all possible, avoid frequent full discharges and charge more often between uses. If full discharges cannot be avoided, try utilizing a larger battery. Partial discharge on Li-ion is fine; there is no memory and the battery does not need periodic full discharge cycles other than to calibrate the fuel gauge on a smart battery.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px;"&gt;A partial discharge reduces stress and prolongs battery life. Elevated temperature and high currents also affect cycle life.&lt;/span&gt;"&lt;br /&gt;
&lt;br /&gt;
Somehow the battery lasts *longer* and retains a *greater* maximum charge if you fully discharge it as *little* as possible. &amp;nbsp;"Topping it off" as much as possible is the best way to keep it from running down.&lt;br /&gt;
&lt;br /&gt;
Further, these articles made it clear to me that there's no such thing as "conditioning" a Li-ion battery - unlike a car engine, which urban legends make clear should be run at lower speeds for the first XXX miles, the Li-ion battery seems to be as good as it gets when it leaves the factory, and needs no special handling.&lt;br /&gt;
&lt;br /&gt;
Suh-weet - just act like I always have with my previous phone and I'll be laughing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-1700901237053383390?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/1700901237053383390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=1700901237053383390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1700901237053383390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1700901237053383390'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/10/got-new-iphone-4s-worried-about-how-to.html' title='Got a new iPhone 4S? Worried about how to &amp;quot;maximize the battery&amp;quot;? Me too'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-3625276895497395249</id><published>2011-10-12T16:43:00.000-07:00</published><updated>2011-10-12T16:53:28.643-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='ux'/><category scheme='http://www.blogger.com/atom/ns#' term='career'/><title type='text'>Usability and UX - are you a practitioner?  How to hone my instincts?</title><content type='html'>My career has been veering for a couple of years now towards the  squishy-but-satisfying creative arenas of Usability &amp;amp; UX (User Experience),  and I'd like to make this an explicit career direction.  That means (a) meeting  other folks already practicing these disciplines, (b) learning how to behave  more like them, and (c) sharing my experiences with any who are looking to learn  from newer practitioners.  I expect the full transition to take a number of  years, but where I have creative freedom in my job to flex in these directions  I'll be taking advantage of every chance I get.&lt;br /&gt;
As for immediate changes:&lt;br /&gt;
&lt;ul sizcache="39" sizset="90"&gt;
&lt;li&gt;I'm joining some local user groups here in Portland (&lt;a href="https://groups.google.com/forum/?hl=en#!forum/pdx-ux"&gt;PDX UX&lt;/a&gt; already, &lt;a href="http://www.chifoo.org/"&gt;Chifoo &lt;/a&gt; and &lt;a href="http://www.ixda.org/local/ixda-portland"&gt;IxDA&lt;/a&gt; next)  &lt;/li&gt;
&lt;li&gt;I've been re-reading "Don't Make Me Think" from my iPhone while commuting&lt;/li&gt;
&lt;li&gt;I've bookmarked &lt;a href="http://ask.slashdot.org/story/11/10/06/1939224/Ask-Slashdot-Good-Relevant-Usability-Book?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+Slashdot%2Fslashdot+%28Slashdot%29"&gt;this discussion&lt;/a&gt; on Slashdot (! yes, ironic to find Linux geeks who can spell UX)&lt;/li&gt;
&lt;/ul&gt;
What's next?  Who should I be talking to?  Where should I seek out  like-minded folks?  What should I be reading/doing/learning next?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-3625276895497395249?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/3625276895497395249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=3625276895497395249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3625276895497395249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3625276895497395249'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/10/usability-and-ux-are-you-practitioner.html' title='Usability and UX - are you a practitioner?  How to hone my instincts?'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-3841186959828192037</id><published>2011-09-08T19:07:00.001-07:00</published><updated>2011-09-08T19:07:12.722-07:00</updated><title type='text'>Review: S.H.I.E.L.D.: Architects of Forever</title><content type='html'>
      &lt;a style='float: left; padding-right: 20px' href='http://www.goodreads.com/book/show/11296959'&gt;&lt;img alt='S.H.I.E.L.D.: Architects of Forever' border='0' src='http://www.goodreads.com/images/nocover-111x148.jpg'/&gt;&lt;/a&gt;
      &lt;a href='http://www.goodreads.com/book/show/11296959'&gt;S.H.I.E.L.D.: Architects of Forever&lt;/a&gt; by &lt;a href='http://www.goodreads.com/author/show/356424'&gt;Jonathan Hickman&lt;/a&gt;&lt;br/&gt;
      My rating: &lt;a href='http://www.goodreads.com/review/show/200587175'&gt;5 of 5 stars&lt;/a&gt;
      &lt;br/&gt;&lt;br/&gt;
      Fantastic ideas incorporated into this series. No one is investing more into re-imagining the Marvel Universe's already well-established history, and boy is Hickman pouring real effort into this and the Secret Warriors. What with all the multiple-titles-per-month writing going on in Marvel these days, it's a rare treat to get someone who sits down and thinks up more than appears on the page. &lt;br/&gt;&lt;br/&gt;Weaver's gorgeous artwork lavishly renders each panel, and he does some Big Scenery well.

This book for me demanded a careful read and a number of flips back and forth to make sense of all the details. Some may say this isn't a good story or that they didn't like it; for me this is exactly the kind of work I've been looking for, and I enjoyed the challenge, the surprises and the sheer force of imagination that this book brought to me. I borrowed this book from the library but I'm going out to buy it now, and I'll put the next book on my wish list too.  This deserves a place of honor among my most prized graphic novels, and I'll happily re-read it just for the "better than petty men" inspiration.
      &lt;br/&gt;&lt;br/&gt;
      &lt;a href='http://www.goodreads.com/review/show/200587175'&gt;View all my reviews&lt;/a&gt;
    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-3841186959828192037?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/3841186959828192037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=3841186959828192037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3841186959828192037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3841186959828192037'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/09/review-shield-architects-of-forever.html' title='Review: S.H.I.E.L.D.: Architects of Forever'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-4654709378204168645</id><published>2011-08-27T14:48:00.001-07:00</published><updated>2011-08-27T14:48:51.736-07:00</updated><title type='text'>Review: The Other Side</title><content type='html'>
      &lt;a style='float: left; padding-right: 20px' href='http://www.goodreads.com/book/show/1235226'&gt;&lt;img alt='The Other Side' border='0' src='http://photo.goodreads.com/books/1309914061m/1235226.jpg'/&gt;&lt;/a&gt;
      &lt;a href='http://www.goodreads.com/book/show/1235226'&gt;The Other Side&lt;/a&gt; by &lt;a href='http://www.goodreads.com/author/show/580494'&gt;Jason Aaron&lt;/a&gt;&lt;br/&gt;
      My rating: &lt;a href='http://www.goodreads.com/review/show/129297142'&gt;5 of 5 stars&lt;/a&gt;
      &lt;br/&gt;&lt;br/&gt;
      Fascinating insights into two very different training &amp;amp; motivational approaches to mustering an army, and how it affects not only the individual actions of soldiers but also the outcome of the whole war.

Then the real slog hits - holy god is this hard to get through, unrelenting, painful, numbing stuff.  I had to put it down about 2/3 the way through, take a break, read some funny stuff on the Internet, grab a snack.  It was *that* hard for me to experience just how unrelentingly depressing, inhumane and soul-crushing the actual *experience* of fighting this war was for the boys on the ground.

Which makes this an all-star, kudos-earning, compelling storytelling effort on the part of the creators.  When I'm that repulsed by the work, that means they did an incredible job reaching out from the pages and hitting me square in the emotive muscle.
      &lt;br/&gt;&lt;br/&gt;
      &lt;a href='http://www.goodreads.com/review/show/129297142'&gt;View all my reviews&lt;/a&gt;
    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-4654709378204168645?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/4654709378204168645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=4654709378204168645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/4654709378204168645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/4654709378204168645'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/08/review-other-side.html' title='Review: The Other Side'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-1313345769133870925</id><published>2011-08-14T16:33:00.001-07:00</published><updated>2011-08-14T16:33:39.361-07:00</updated><title type='text'>Review: Atomic Robo Vol. 3: Atomic Robo and the Shadow from Beyond Time</title><content type='html'>
      &lt;a style='float: left; padding-right: 20px' href='http://www.goodreads.com/book/show/7296120'&gt;&lt;img alt='Atomic Robo Vol. 3: Atomic Robo and the Shadow from Beyond Time' border='0' src='http://photo.goodreads.com/books/1279838947m/7296120.jpg'/&gt;&lt;/a&gt;
      &lt;a href='http://www.goodreads.com/book/show/7296120'&gt;Atomic Robo Vol. 3: Atomic Robo and the Shadow from Beyond Time&lt;/a&gt; by &lt;a href='http://www.goodreads.com/author/show/510757'&gt;Brian Clevinger&lt;/a&gt;&lt;br/&gt;
      My rating: &lt;a href='http://www.goodreads.com/review/show/185012915'&gt;5 of 5 stars&lt;/a&gt;
      &lt;br/&gt;&lt;br/&gt;
      Funny. Inventive. And the word &amp;amp;quot;fresh&amp;amp;quot; just keeps coming to me, even though my subconscious critic knows somehow all these stories are regurgitated.  What Clevinger does with Lovecraft is just slightly insane and wonderful.&lt;br/&gt;&lt;br/&gt;What he does with the later chapters are mind-blowing - combining insane scenes with an incredible fluency with science and science fiction. My brain actually *thinks* while reading this one, and wonders how real &amp;amp;amp; bleeding edge some of these ideas really are.  That happens so rarely and my intellectual standards in comics are so low, that this is a real gem.
      &lt;br/&gt;&lt;br/&gt;
      &lt;a href='http://www.goodreads.com/review/show/185012915'&gt;View all my reviews&lt;/a&gt;
    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-1313345769133870925?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/1313345769133870925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=1313345769133870925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1313345769133870925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1313345769133870925'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/08/review-atomic-robo-vol-3-atomic-robo.html' title='Review: Atomic Robo Vol. 3: Atomic Robo and the Shadow from Beyond Time'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-8810939561733652720</id><published>2011-07-30T14:52:00.001-07:00</published><updated>2011-07-30T15:55:54.892-07:00</updated><title type='text'>How can I automatically crosspost/publish Google Reader "shares" to Google+, Facebook or Twitter?</title><content type='html'>Google Reader is such a great, simple way as a desktop user to keep up with dozens or hundreds of RSS feeds - but even moreso, to be able to selectively share and comment on the blog articles in those feeds with your friends and with various "external" social services (Facebook, Twitter, Delicious, Stumbleupon, and lots of even-more-ancient-sounding services).&lt;div&gt;
&lt;/div&gt;&lt;div&gt;What *isn't* Google Reader great at?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;sharing your favourite articles (with commentary) via a purely mobile experience&lt;/li&gt;&lt;li&gt;sharing those same faves with your burgeoning Google+ circles&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Mobile: the Google Reader team have added a tiny number of widgets for sharing to the mobile web experience.  Other third-party iPhone apps have done a better job of integrating to the foreign services' APIs, but it's not like they voraciously keep up or try to stay ahead of the next wave.  [Reeder's been good to me but hardly stellar - the FB integration works, but I guess I'd rather it just added this as a background operation for all sharing rather than me having to take the time and extra steps to bother sharing outside of the native Google Reader/Buzz feed.]&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;G+: And what the heck is with Google leaving no clues as to the status of Google Buzz, and whether/when they'll move operations (like automatic posting of your Google Reader "sharing" activity to the Buzz feed) over to a native G+ implementation?  After a year on Buzz, I accumulated no further "organic" growth of friends &amp;amp; followers than the folks that I originally scraped together on day one.  I'm seeing a little better "natural uptick" of followers on G+, but still nothing like I see on Twitter - though to be fair, I think if I got new bot followers every time I posted to the Public feed on G+, I'd probably lose my mind.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;So what's up with Google Reader?  Has it effectively been zombied, or starved of any reasonable squad of hungry developers and Product Owners?  Or is this still a feature with a future?  Hell, if I have to find yet *another* place to host my RSS feeds I'm probably gonna lose my mind.  And that's likely the reason why Google has starved the Reader team of any serious developer resources: there's no competition left.  Google is the last place to offer free, voluminous RSS scraping and it shows in their complacency.  Up to the rest of us to kludge together some pretty Rube Goldbergian workflows to make it worth reading/sharing on Reader in the first place.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;So what does *your* Goldberg machine look like?&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;So far, the furthest I've gotten is to ensure that Sharing &amp;amp; Notes are still working from the mobile Reader and the Reeder iPhone app.  Nothing in the Reader "Send To" list even seems to hint at a G+ interaction - and I haven't gotten creative enough yet to figure out how to make a 'custom link' post to one place, that will eventually (and richly - i.e. without cryptically condensing and stripping good content off the original shares) end up on FB, G+ &amp;amp; Twitter without me having to take a half-dozen manual steps at each post.  Last I looked, Friendfeed does a cryptic job; does Seesmic have anything to offer here?  Any new services from Silicon Valley that I should be looking into?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-8810939561733652720?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/8810939561733652720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=8810939561733652720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/8810939561733652720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/8810939561733652720'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/07/how-can-i-automatically.html' title='How can I automatically crosspost/publish Google Reader &quot;shares&quot; to Google+, Facebook or Twitter?'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-7094545733353829378</id><published>2011-07-30T14:47:00.001-07:00</published><updated>2011-07-30T14:47:05.653-07:00</updated><title type='text'>Review: 52: Vol. 4</title><content type='html'>
      &lt;a style='float: left; padding-right: 20px' href='http://www.goodreads.com/book/show/1119046'&gt;&lt;img alt='52: Vol. 4' border='0' src='http://photo.goodreads.com/books/1197004158m/1119046.jpg'/&gt;&lt;/a&gt;
      &lt;a href='http://www.goodreads.com/book/show/1119046'&gt;52: Vol. 4&lt;/a&gt; by &lt;a href='http://www.goodreads.com/author/show/10305'&gt;Geoff Johns&lt;/a&gt;&lt;br/&gt;
      My rating: &lt;a href='http://www.goodreads.com/review/show/177241003'&gt;4 of 5 stars&lt;/a&gt;
      &lt;br/&gt;&lt;br/&gt;
      Summary:  too bad about the never-say-die multiverse addiction at DC. 

Dibny's story? Awesome. Week 43 Day 1? Like a five-year-old wrote it.&lt;br/&gt;&lt;br/&gt;Black Adam's finale was not written by that five-year-old, and works much better.&lt;br/&gt;&lt;br/&gt;And the build-up to the final climax? Cool. I felt like I participated in something actually pretty wondrous.&lt;br/&gt;&lt;br/&gt;Too bad about bringing back the multiverse tho. Seems like DC is just addicted to its easy outs - the many, many variations on the same themes that make it so easy to explain away any discontinuities.  Is DC just fundamentally lazy?  Some describe it as &amp;amp;quot;enabling creativity&amp;amp;quot;, but sometimes endless possibilities leave you without having to think hard, make choices or come up with elegant solutions.&lt;br/&gt;&lt;br/&gt;DC is the brute force method of writing superhero stories. Just keep bashing on the same characters until one of the iterations finally comes out with something good.&lt;br/&gt;&lt;br/&gt;I still liked the ending to 52, but it sure reminds me of how tiring these &amp;amp;quot;restarts&amp;amp;quot; get every time DC lets its writers paint them into a corner.
      &lt;br/&gt;&lt;br/&gt;
      &lt;a href='http://www.goodreads.com/review/show/177241003'&gt;View all my reviews&lt;/a&gt;
    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-7094545733353829378?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/7094545733353829378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=7094545733353829378' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7094545733353829378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7094545733353829378'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/07/review-52-vol-4.html' title='Review: 52: Vol. 4'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-6422129809144076169</id><published>2011-07-30T11:54:00.001-07:00</published><updated>2011-07-30T13:15:49.456-07:00</updated><title type='text'>How can I publish GoodReads reviews on Google+, Facebook or Twitter?</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px; line-height: 18px; background-color: rgb(255, 255, 255); "&gt;Hey all my geeky friends: I'm trying to figure out the most automated way (least number of extra steps) to enable all the reviews I write on GoodReads to show up on my Google+ and/or Facebook streams.  I realize that with the amount of effort I've put into these reviews over the last year or two, I might as well be getting more value out of the postings than from the dozen or so 'friends' I've accumulated on GoodReads itself.

Has anyone come up with a good scheme for pulling or pushing GoodReads reviews to their social walls?  I'm currently experimenting with ways to pull or push reviews using this blog as a staging ground - see if I can find a way to pull or push from Blogger to G+ or Facebook.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px; line-height: 18px; background-color: rgb(255, 255, 255); "&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;Right now, I do all my reviewing from the GoodReads iPhone app, and based on my previous experiments, it looks like all of the automation is still just "semi-automated", and only really available from a desktop browser.  That is, GoodReads will certainly cache the locations and credentials necessary to cross-post from GR to the 'foreign' services; however, it still requires me to (a) fire up my laptop, (b) browse to GR, (c) find the review I just published via GR on iPhone, (d) click the checkbox for the 'foreign service' to which I want to post, and (e) push the review to that service.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;My ideal behaviour: I'd LOVE GoodReads if they could enable the following scenario:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;I write a review on GoodReads via the iPhone app&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;I switch the "shelf" from "currently-reading" to "read"&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;GoodReads publishes the review automatically (with no further actions on my part) to all previously-configured social platforms: Blogger, Facebook, Twitter (and in the near future, Google+)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"  &gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;Who do I have to get drunk to make this happen?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-6422129809144076169?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/6422129809144076169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=6422129809144076169' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6422129809144076169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6422129809144076169'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/07/how-can-i-publish-goodreads-reviews-on.html' title='How can I publish GoodReads reviews on Google+, Facebook or Twitter?'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-3276261333696890331</id><published>2011-07-30T11:42:00.001-07:00</published><updated>2011-07-30T11:42:26.357-07:00</updated><title type='text'>Review: Final Crisis</title><content type='html'>
      &lt;a style='float: left; padding-right: 20px' href='http://www.goodreads.com/book/show/5173602'&gt;&lt;img alt='Final Crisis' border='0' src='http://photo.goodreads.com/books/1267344779m/5173602.jpg'/&gt;&lt;/a&gt;
      &lt;a href='http://www.goodreads.com/book/show/5173602'&gt;Final Crisis&lt;/a&gt; by &lt;a href='http://www.goodreads.com/author/show/12732'&gt;Grant Morrison&lt;/a&gt;&lt;br/&gt;
      My rating: &lt;a href='http://www.goodreads.com/review/show/135140558'&gt;2 of 5 stars&lt;/a&gt;
      &lt;br/&gt;&lt;br/&gt;
      Found the first few pages waaaaay too abstract to bother reading the rest.  However it keeps coming back at me, and after realizing it was the linchpin between Batman RIP and Batman Reborn, I finally gave in.&lt;br/&gt;&lt;br/&gt;This book feels like it's all over the place - intentionally. That's good for the DC geeks who know every minor character or sub-plot that gets a cameo here, but holy hell is it uninteresting to a DC amateur like me.&lt;br/&gt;&lt;br/&gt;And frankly the hardest part of reading this book was trying to find and follow the narrative. I mean, there's good mind-bending storytelling that Morrison is famous for, and then there's just putting the plot points, characters and dialogue in a blender and simply churning until it's an unrecognizable mass.&lt;br/&gt;&lt;br/&gt;I'm sure if I read it again I'd get much more out of it, and maybe I will someday after I've spent a couple of years catching up on the DC universe (after five years I've focused so much on Marvel).&lt;br/&gt;&lt;br/&gt;Until then I'm going to lament Morrison's dubious decision to narrate most dialogue in that most insipid and stilted style that was popular back when comic books were still printed using droplet ink.

I totally felt duped into reading this when I saw how little airtime Batman and his "death" actually got. I didn't know anything more about the continuity jump between Batman RIP and Batman Reborn than before I'd read this unholy mess.
      &lt;br/&gt;&lt;br/&gt;
      &lt;a href='http://www.goodreads.com/review/show/135140558'&gt;View all my reviews&lt;/a&gt;
    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-3276261333696890331?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/3276261333696890331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=3276261333696890331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3276261333696890331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3276261333696890331'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2011/07/review-final-crisis.html' title='Review: Final Crisis'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-4068399647211827491</id><published>2010-10-31T14:55:00.001-07:00</published><updated>2010-10-31T14:55:39.778-07:00</updated><title type='text'>Building an Outlook add-in: troubleshooting an add-in that won’t start</title><content type='html'>&lt;p&gt;I made some changes to my code a couple of weeks ago and didn’t document them for myself, nor did I try to debug the code for a week or so.&amp;#160; So by the time I did try it out, I didn’t remember what I’ve done, and of course there’s some reason the add-in isn’t loading anymore.&amp;#160; It’s still listed among the 14 add-ins listed as “Loading Add-ins” as Outlook starts up, but the context menu isn’t available where it should be anymore.&lt;/p&gt;  &lt;p&gt;Digging deep into Outlook 2010 to see what goes on with the add-in (Outlook File menu &amp;gt; Options &amp;gt; Add-Ins &amp;gt; COM Add-ins Go… button &amp;gt; click on the add-in in the list), the Load Behavior text says the following:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Not loaded. A runtime error occurred during the loading of the COM Add-in.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Google that error message, a few articles come back, and I bookmarked a couple to check on later.&amp;#160; I’ve reviewed them and tried the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/vsod/archive/2008/04/22/troubleshooting-com-add-in-load-failures.aspx"&gt;http://blogs.msdn.com/b/vsod/archive/2008/04/22/troubleshooting-com-add-in-load-failures.aspx&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Examined Registry entry (HKCU\…\Outlook\Addins\) to confirm two things:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;LoadBehaviour setting is still = 3 (it is)&lt;/li&gt;      &lt;li&gt;file path listed in Manifest value is still valid (it is)&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Ensured add-in isn’t on the Disabled list (it isn’t)&lt;/li&gt;    &lt;li&gt;Ran Dbgview.exe while loading Outlook to see if there are any obvious errors being thrown that aren’t otherwise being noticed (there aren’t any entries remotely related to my add-in)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://social.msdn.microsoft.com/forums/en-US/vsto/thread/f2f2a8f6-3ed5-4c1f-ab6b-17120e64f13d/"&gt;http://social.msdn.microsoft.com/forums/en-US/vsto/thread/f2f2a8f6-3ed5-4c1f-ab6b-17120e64f13d/&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Set the VSTO_SUPPRESSDISPLAYALERTS=0&lt;/li&gt;    &lt;li&gt;Observed the following error:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Microsoft Office Application Add-In       &lt;br /&gt;An add-in could not be found or could not be loaded.&lt;/li&gt;      &lt;li&gt;Details button:       &lt;br /&gt;        &lt;br /&gt;Exception from HRESULT: 0x8004063E&lt;/li&gt;      &lt;p&gt;************** Exception Text **************       &lt;br /&gt;System.Runtime.InteropServices.COMException (0x8004063E): Exception from HRESULT: 0x8004063E        &lt;br /&gt;&amp;#160;&amp;#160; at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)        &lt;br /&gt;&amp;#160;&amp;#160; at System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode, IntPtr errorInfo)        &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.VisualStudio.Tools.Office.Runtime.DomainCreator.CreateCustomizationDomainInternal(String solutionLocation, String manifestName, String documentName, Boolean showUIDuringDeployment, IntPtr hostServiceProvider, IntPtr&amp;amp; executor)        &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.VisualStudio.Tools.Office.Runtime.DomainCreator.Microsoft.VisualStudio.Tools.Office.Runtime.Interop.IDomainCreator.CreateCustomizationDomain(String solutionLocation, String manifestName, String documentName, Boolean showUIDuringDeployment, IntPtr hostServiceProvider, IntPtr&amp;amp; executor)&lt;/p&gt;   &lt;/ul&gt;    &lt;li&gt;Found a bunch of discussions referencing this error, and started with the first result: &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/d0ffb791-43bb-41f3-a2ca-c22bd959f4c3"&gt;http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/d0ffb791-43bb-41f3-a2ca-c22bd959f4c3&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Per instructions, I shut down Outlook, started VS2010, chose “Clean [project]” from the Build menu – this seems to have removed the HKCU registry entry for the add-in&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Worked like a charm – next time I debugged the add-in, it came up exactly as I expected it to.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Additional Reference&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Debugging in Application-Level Projects &lt;a href="http://msdn.microsoft.com/en-us/library/ms269003.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms269003.aspx&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-4068399647211827491?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/4068399647211827491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=4068399647211827491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/4068399647211827491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/4068399647211827491'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2010/10/building-outlook-add-in-troubleshooting.html' title='Building an Outlook add-in: troubleshooting an add-in that won’t start'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-2473357418771920068</id><published>2010-10-19T22:26:00.001-07:00</published><updated>2010-10-19T22:26:46.475-07:00</updated><title type='text'>Building an Outlook add-in: binding data to XAML (questions)</title><content type='html'>&lt;h4&gt;ToDo’s (from last post)&lt;/h4&gt;  &lt;p&gt;Need to figure out how to bind the NameValueCollection to the XAML for my WPF-based add-in.&amp;#160; Then I need to find my a** with two hands and a map.&amp;#160; And after that, perhaps I’ll look into the complexity of referral chasing to get the non-GC-replicated user attributes.&lt;/p&gt;  &lt;h3&gt;Bind AD Data to XAML&lt;/h3&gt;  &lt;p&gt;The more I look at this snarl of code I’ve pieced together from different samples, the more worried I get that I’ve created an intractable problem.&amp;#160; I have three major classes developed so far (plus the XAML):&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;ContextMenuItem.cs – inherits Office.IRibbonExtensibility, and implements the IRibbon extensibility member and the Ribbon callbacks (i.e. the context menu click handler).&amp;#160; The click handler instantiates the Pop-Up window, converts the Outlook contact to an email address and runs the AD query.&lt;/li&gt;    &lt;li&gt;UserDetailsPopup.cs – implements the ElementHost WinForms object that wraps the WPF control.&lt;/li&gt;    &lt;li&gt;ActiveDirectoryUser.cs – implements the query against the Global Catalog, and returns a collection of requested data.&lt;/li&gt;    &lt;li&gt;UserDetailsLayout.xaml – implements the XAML UI in which we’d like to drop the requested data.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;How should I store the data, and how can I get the XAML to consume it (and ensure it gets displayed in the UI)?&lt;/p&gt;  &lt;h4&gt;Where to Store the Data?&lt;/h4&gt;  &lt;p&gt;Let’s assume for the moment that the ContextMenuItem class gets instantiated when the user right-clicks on a contact, and doesn’t die until the context menu and/or the pop-up window it generates are all dead.&amp;#160; That means any Property of the ContextMenuItem will exist during that timeframe, and can be read by other members of the add-in.&lt;/p&gt;  &lt;p&gt;So exposing the data the add-in needs as a read-only Property of the ContextMenuItem class seems the only smart way to go here.&lt;/p&gt;  &lt;h4&gt;How to “Push” Data to UI?&lt;/h4&gt;  &lt;p&gt;Next, we need some way to cause something in the pop-up window (the XAML, the C# code-behind for the XAML, and/or the WinForms ElementHost that contains the WPF control) to consume the Property’s data, and then refresh the UI of the pop-up window if necessary.&lt;/p&gt;  &lt;p&gt;I’m used to the fairly simple .NET app development model, where the first class instantiated is the UI, and it “pulls” in all code calls until the UI receives a callback (user click or some other event) that performs an atomic function.&amp;#160; The best approach I can think of at the moment (given the classes I’ve constructed) is to create some function in either the UserDetailsPopup or the UserDetailsLayout (whichever’s code can cause the intended effect) that reads the ContextMenuItem’s property and then… what, “paints” the data into the XAML labels?&amp;#160; Writes it to a class-local collection to which the XAML is already bound at design time?&amp;#160; Or is there some other elegant feature of VSTO, WPF or .NET 4 that I am totally missing?&lt;/p&gt;  &lt;p&gt;Here’s where my inexperience with (1) sophisticated design patterns or (2) WPF is coming to bite me on the butt.&amp;#160; However, it occurs to me that the fundamental problem isn’t WPF but rather a VSTO-and-Outlook-centric design pattern that ferries remote data to local content-driven UI.&amp;#160; Getting the data to the WinForms equivalent in this model must be the majority of the problem; pushing the data the last mile through the WinForms-to-WPF wrapper can’t be all that hard, can it?&lt;/p&gt;  &lt;h3&gt;Next Steps&lt;/h3&gt;  &lt;p&gt;So I guess my next quest is to find an Outlook VSTO code sample that creates a new WinForms object in response to user input (rather than all the examples that just graft VSTO code into an existing Outlook “Form” such as an email window, Appointment item and the like).&lt;/p&gt;  &lt;p&gt;The final quest in making a functional object is to re-examine the WPF-in-ElementHost examples for Outlook VSTO add-ins, to see how external data gets bound or otherwise propagated into the XAML.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-2473357418771920068?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/2473357418771920068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=2473357418771920068' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/2473357418771920068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/2473357418771920068'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2010/10/building-outlook-add-in-binding-data-to.html' title='Building an Outlook add-in: binding data to XAML (questions)'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-3184206887042208999</id><published>2010-10-18T20:51:00.001-07:00</published><updated>2010-10-18T20:51:21.166-07:00</updated><title type='text'>Found: Minimum permissions to edit Site Columns in SharePoint 2010</title><content type='html'>&lt;p&gt;Our organization has a requirement to delegate the maintenance of a number of Site Columns (re-used throughout our business application) to colleagues who do not have Site-wide responsibilities or authority.&amp;#160; We didn’t want to simply grant one of the all-powerful permissions/groups (such as Site Collection Administrators, Site Collection Owner, [Site] Owners, or just granting Full Control) as that would leave them open to accusatory questions every time the site or application started behaving badly.&amp;#160; We’d like them to be able to act fairly autonomously, without having to worry that they could cause unintentional damage to the site or application due to excessive permissions.&lt;/p&gt;  &lt;p&gt;Knowing that most every Microsoft product has a rich, granular set of DACLs applied at every object level, and having exercised some of the rich permissions available in SharePoint 2010, I was pretty sure there should be a way to combine some permissions together to enable Site Column edits, without giving away the farm.&amp;#160; However I was unable to find any &lt;a href="&amp;bull; http://www.sharepointdev.net/sharepoint--general-question-answers-discussion/create-new-site-column--full-control--access-denied-error-2479.shtml"&gt;documentation&lt;/a&gt; or &lt;a href="https://utiait.tennessee.edu/team/Knowledge%20Base/SharePointListsPart1.docx"&gt;research&lt;/a&gt; that definitively asserted they knew what those permissions were.&lt;/p&gt;  &lt;p&gt;Finally I asked my colleague &lt;a href="http://dalecox99.blogspot.com"&gt;Dale Cox&lt;/a&gt; to pair up with me and, together with four hours and an experimental sub-site, we were able to work out a tight sub-set of permissions that (a) definitely allow Site Columns edits to propagate to inheriting Lists and (b) were ratcheted down stepwise until we were comfortable there was no place lower to go.&lt;/p&gt;  &lt;h3&gt;Permissions: Summary&lt;/h3&gt;  &lt;p&gt;There are two sets of permissions we tested for: site-level permissions needed to edit an existing Site Column (that is being used as a column in one or more Lists in the SharePoint site), and List-level permissions needed to propagate Site Column changes down to inheriting columns in a List.&lt;/p&gt;  &lt;p&gt;The former permissions *only* exist at the site level (even though some permissions in the permissions set are labelled “site permissions” and others “list permissions”) – we’ve found there are *no* permissions that can be managed directly related to Site Columns, but only indirectly via the site-level permissions.&lt;/p&gt;  &lt;p&gt;That we also require the latter permissions was surprising at first (once we configured the inheritance, why should we need ongoing permissions on every inheriting List?), but that’s just a design decision that Microsoft’s SharePoint team made.&amp;#160; It means we have to manually *track* all the Lists that inherit changes from Site Columns, and make sure our site column maintenance people have enough permissions to the Lists.&lt;/p&gt;  &lt;h4&gt;Site-level Permissions&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Manage Lists (labelled “List Permissions”) &lt;/li&gt;    &lt;li&gt;View Items (labelled “List Permissions”) &lt;/li&gt;    &lt;li&gt;Add and Customize Pages (labelled “Site Permissions”) &lt;/li&gt;    &lt;li&gt;Browse Directories (labelled “Site Permissions”) &lt;/li&gt;    &lt;li&gt;View Pages (labelled “Site Permissions”) &lt;/li&gt;    &lt;li&gt;Open (labelled “Site Permissions”) &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;List-level Permissions&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Manage Lists (individual permission – which includes View Items, View Pages and Open) &lt;/li&gt;    &lt;li&gt;Contribute (permission set) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There is one case we did *not* explicitly test for, but found was part of the resultant permissions we arrived at: creating a new Site Column.&amp;#160; While we believe this probably requires only a subset of the site-level (site and/or List) permissions, we didn’t spend the extra cycles to isolate the minimum permissions needed there.&amp;#160; Perhaps it’s implied in the results, and if we need to know we’ll pursue it, but it’s not something we needed to know right now.&lt;/p&gt;  &lt;h3&gt;Steps We Followed To Distill These Permissions&lt;/h3&gt;  &lt;p&gt;We had to work as a team to test each permissions combination, as I’d found early on that as soon as I removed myself from the all-powerful groups, I was unable to restore myself or change permissions later on.&amp;#160; I manipulated the permissions, and Dale ran the test cases.&amp;#160; I pre-created the following groups in our experimental site and assigned them specific site-level permissions, to make it easy to switch from one permission set to another:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="562"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="202"&gt;         &lt;p align="center"&gt;&lt;strong&gt;Group name&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="358"&gt;         &lt;p align="center"&gt;&lt;strong&gt;Permission Levels assigned to group (custom permissions included)&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="218"&gt;Approve&lt;/td&gt;        &lt;td valign="top" width="372"&gt;Approve&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="223"&gt;Design&lt;/td&gt;        &lt;td valign="top" width="374"&gt;Design&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="225"&gt;Manage lists&lt;/td&gt;        &lt;td valign="top" width="373"&gt;Manage Lists (Manage Lists, View Items, View Pages, Open, Manage Personal Views)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="227"&gt;Manage web site&lt;/td&gt;        &lt;td valign="top" width="372"&gt;Manage Web Site (View Items, Manage Web Site, Add and Customize Pages, Browse Directories, View Pages, Enumerate Permissions, Browse User Information, Open)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="228"&gt;Site viewers&lt;/td&gt;        &lt;td valign="top" width="372"&gt;Contribute, Read, View Only&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="228"&gt;Edit Site Columns&lt;/td&gt;        &lt;td valign="top" width="372"&gt;(Add and Customize Pages, Browse Directories, View Pages, Open)&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Dale’s starting position:      &lt;ul&gt;       &lt;li&gt;Permissions: member of Site Viewers group &lt;/li&gt;        &lt;li&gt;Result: can view site Libraries and Lists but cannot even load the Site Columns page (/_layouts/mngfield.aspx) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Added Dale to “Manage Lists” group      &lt;ul&gt;       &lt;li&gt;Result: can load Site Settings page but still cannot access Site Columns page &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Removed Dale from “Manage Lists” group, added to “Manage web site” group      &lt;ul&gt;       &lt;li&gt;Result: Can load Site Columns page but cannot edit site columns &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Granted Dale the Contribute permission on one of the Lists that inherits a Column definition from the Site Column being tested.      &lt;ul&gt;       &lt;li&gt;Result: can still load Site Columns page but still cannot edit the site column being tested &lt;/li&gt;        &lt;li&gt;Dale even tried just updating the site column definition without propagating the change to the inheriting Lists, but that still didn’t work &lt;/li&gt;        &lt;li&gt;NOTE: from here onwards we started making a point of trying to separate out the ability to edit the site column definition from the ability for that site column definition to propagate to inheriting lists &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Removed Dale from “Manage web site” group, added to “Approve” group      &lt;ul&gt;       &lt;li&gt;Result: Dale cannot load Site Columns page &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Added “Manage Web Site” permission to a new permission group called “Approve + MWS”      &lt;ul&gt;       &lt;li&gt;That is, copied the “Approve” permission group, then checked the “Manage Web Site” permission (and left the dependent permissions that came with it) &lt;/li&gt;        &lt;li&gt;Result: Dale can load the Site Columns page, but cannot commit changes to any Site Columns &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Removed Dale from “Approve + MWS”, added Dale to “Manage Hierarchy” group      &lt;ul&gt;       &lt;li&gt;Note: while the difference in included permissions between “Manage Web Site” and “Manage Hierarchy” is large, still the “Manage Hierarchy” permission set is a superset of “Manage Web Site” &lt;/li&gt;        &lt;li&gt;Result: Dale can access the Site Columns page, but cannot commit changes to Site Columns &lt;/li&gt;        &lt;li&gt;However, we noticed that Dale can create a &lt;strong&gt;new&lt;/strong&gt; Site Column, and can edit that new Site Column &lt;/li&gt;        &lt;li&gt;Dale attempted just a non-propagating edit with one of the existing Site Columns, and was successful. &lt;/li&gt;        &lt;li&gt;Theory: current permissions on the Lists that inherit from the existing Site Columns are what’s blocking the previous Site Column edits &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Granted to Dale “Contribute” permission on all of the three Lists which inherit from the existing Site Columns      &lt;ul&gt;       &lt;li&gt;Result: Dale cannot commit a propagating edit on an existing, inherited Site Column &lt;/li&gt;        &lt;li&gt;Theory: the individual permission “Manage Lists” is what’s needed on each inheriting List for the Site Column propagation to succeed &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Granted to Dale “Design” permission (which includes the individual “Manage Lists” permission) to &lt;em&gt;one&lt;/em&gt; of the three inheriting Lists       &lt;ul&gt;       &lt;li&gt;Result: Dale could not commit a propagating edit on an existing, inherited Site Column.&amp;#160; Further, the change did not even inherit to the inheriting List (where the permissions needed for propagation &lt;strong&gt;could&lt;/strong&gt; have allowed the change). &lt;/li&gt;        &lt;li&gt;Theory: propagating edits to a Site Column are a transactional request – if the request doesn’t succeed on every inheriting List, then the edit “transaction” is rolled back, rather than partially succeeding. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Changed the following permissions to all three inheriting Lists: changed from “Design” + “Contribute” to “Manage Lists” + “Contribute”      &lt;ul&gt;       &lt;li&gt;Result: Dale’s propagating edit finally succeeded! &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Decided to go back over the site-level permissions to determine whether there was an unknown interaction between the site-level and list-level permissions that we didn’t account for. &lt;/li&gt;    &lt;li&gt;Kept the List-level permissions as-is, but changed Dale’s site-level permissions – removed him from “Manage Hierarchy” and added him to “Approve + MWS” group.      &lt;ul&gt;       &lt;li&gt;Result: propagating edit failed, and non-propagating edit failed. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Removed Dale from “Approve + MWS” group, added Dale to Design group (which has Design permissions set).      &lt;ul&gt;       &lt;li&gt;Result: propagating edit succeeded. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Compared the permissions between the “Design” and the “Manage Hierarchy” permissions groups, and found the following eight permissions in common:      &lt;ul&gt;       &lt;li&gt;Add and Customize Pages &lt;/li&gt;        &lt;li&gt;Browse Directories &lt;/li&gt;        &lt;li&gt;View Pages &lt;/li&gt;        &lt;li&gt;Browse User Information &lt;/li&gt;        &lt;li&gt;Use Remote Interfaces &lt;/li&gt;        &lt;li&gt;Use Client Integration Features &lt;/li&gt;        &lt;li&gt;Open &lt;/li&gt;        &lt;li&gt;Edit Personal User Information &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Analysis of these permissions, looking for the “secret sauce” that they share:      &lt;ul&gt;       &lt;li&gt;The “Manage Web Site” site-level individual permission isn’t the one that Dale needs (as it isn’t part of the Design permission set, and yet Dale was still able to propagate the edit when he had the Design permission) &lt;/li&gt;        &lt;li&gt;Based on the descriptions of each individual permission listed above, the most likely candidate is “Add and Customize Pages” &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Created a new Group called “Edit Site Columns”.&amp;#160; Created a new permissions set called “Edit Site Columns”.&amp;#160; To that permissions set, we added only “Add and Customize Pages”.&amp;#160; Removed Dale from Design group, added him to Edit Site Columns group.      &lt;ul&gt;       &lt;li&gt;Note: when “Add and Customize Pages” is checked, the following permissions were automatically checked: “Browse Directories”, “View Pages”, “Open”, “View Items”. &lt;/li&gt;        &lt;li&gt;Result: propagating and non-propagating edits failed.&amp;#160; Adding a new Site Column also failed.&amp;#160; Dale could access the Site Columns page. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Added back all eight site-level permissions that were in common between the Design and Manage Hierarchy permissions sets.      &lt;ul&gt;       &lt;li&gt;Note: the “Edit Site Columns” permission set at this point doesn’t include any of the List-level permissions that I’ve so far ignored.&amp;#160; Continued failure means that to edit Site Columns, a user needs some of these “list permissions” assigned at the site level.&amp;#160; [Confused yet?] &lt;/li&gt;        &lt;li&gt;Result: propagating and non-propagating edits failed.&amp;#160; Dale is still able to access the Site Columns page. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Re-examined the “list permissions” that were included in both of the site-level permissions sets (Design and Manage Hierarchy) that were successful for Dale:      &lt;ul&gt;       &lt;li&gt;Manage Lists&amp;#160; -&amp;#160; Create and delete lists, add or remove columns in a list, and add or remove public views of a list.&amp;#160; &lt;/li&gt;        &lt;li&gt;Override Check Out&amp;#160; -&amp;#160; Discard or check in a document which is checked out to another user.&amp;#160; &lt;/li&gt;        &lt;li&gt;Add Items&amp;#160; -&amp;#160; Add items to lists and add documents to document libraries.&amp;#160; &lt;/li&gt;        &lt;li&gt;Edit Items&amp;#160; -&amp;#160; Edit items in lists, edit documents in document libraries, and customize Web Part Pages in document libraries.&amp;#160; &lt;/li&gt;        &lt;li&gt;Delete Items&amp;#160; -&amp;#160; Delete items from a list and documents from a document library.&amp;#160; &lt;/li&gt;        &lt;li&gt;View Items&amp;#160; -&amp;#160; View items in lists and documents in document libraries.&amp;#160; &lt;/li&gt;        &lt;li&gt;Open Items&amp;#160; -&amp;#160; View the source of documents with server-side file handlers.&amp;#160; &lt;/li&gt;        &lt;li&gt;View Versions&amp;#160; -&amp;#160; View past versions of a list item or document.&amp;#160; &lt;/li&gt;        &lt;li&gt;Delete Versions&amp;#160; -&amp;#160; Delete past versions of a list item or document.&amp;#160; &lt;/li&gt;        &lt;li&gt;Create Alerts&amp;#160; -&amp;#160; Create alerts.&amp;#160; &lt;/li&gt;        &lt;li&gt;View Application Pages&amp;#160; -&amp;#160; View forms, views, and application pages. Enumerate lists.&amp;#160; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Added all of the above permissions to the “Edit Site Columns” permission set except View Items.      &lt;ul&gt;       &lt;li&gt;Result: propagating edits were successful. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Stripped down the site permissions from the “Edit Site Columns” permission set to leave only the following: ACP, Browse Directories, View Pages, Open.      &lt;ul&gt;       &lt;li&gt;Result: propagating edits were successful. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Stripped out a number of List-level permissions from the “Edit Site Columns” permission set to leave only the following: ML, VI.&amp;#160; Left the site permissions as in the last step.      &lt;ul&gt;       &lt;li&gt;Result: propagating edits were successful. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Wanted to ensure this result is reproducible, so we created a new permissions set “Edit Site Columns – Confirmation”, added the same permissions to this new set (i.e. ML, VI, ACP, BD, VP, Open),&amp;#160; created new group “Edit Site Columns – Confirmation”, granted the new permission set to the new group, added Dale to the new group and removed him from the older “Edit Site Columns” group.      &lt;ul&gt;       &lt;li&gt;Result: all operations were successful – view Site Columns page, commit propagating and non-propagating edit of inherited Site Columns, add new Site Column. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-3184206887042208999?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/3184206887042208999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=3184206887042208999' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3184206887042208999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3184206887042208999'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2010/10/found-minimum-permissions-to-edit-site.html' title='Found: Minimum permissions to edit Site Columns in SharePoint 2010'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-1569274462769153673</id><published>2010-10-17T22:57:00.001-07:00</published><updated>2010-10-17T22:57:32.341-07:00</updated><title type='text'>Building an Outlook Add-in: completing work on the Active Directory query</title><content type='html'>&lt;h4&gt;ToDo’s (from last post):&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Implement the GC (domain-less) query, rather than orient to the current implicit binding to the user's current domain &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Big question to answer: are all the fields of interest being replicated in the AD GC?&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Implement a reasonable collection that will be useful to the calling code, and return the user info in the return value      &lt;ul&gt;       &lt;li&gt;After 15 minutes in MSDN Library and some wide-swath google searches, it sounds like the NameValueCollection class is fairly suitable: hashtable-based, strings-only, and allows multiple values for a single key (which may come in handy later for multi-value directory data, of which AD allows a few)&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Start testing this beast against the company AD&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;…&lt;/p&gt;  &lt;p&gt;Y’see, this is one of the problems with doing code development in your spare time – I’m facing a major uphill climb, trying to remember (1) where I was going next, (2) where the next layer of function calls was supposed to get plugged into, and (3) which article I was reading that headed me down this design path.&amp;#160; Arrgh.&lt;/p&gt;  &lt;p&gt;So I’m starting over with the first “article” (actually MSDN video demo) that caught my fancy, and downloaded the sample code.&amp;#160; I have an idea of (1) – to plug the utility class that scrapes AD for user data into the code that calls the Winforms-wrapping-WPF control, and display the user data in that blank context menu window I’ve already sketched out.&amp;#160; By wandering around the sample code, I’m hoping to figure out (2) without having to review every line of code and compare to my own design “pattern”.&amp;#160; Presumably by retracing the steps outlined in my blogs, I’ll be able to quickly stumble across (3) – again, without having to review every word I’ve written.&lt;/p&gt;  &lt;p&gt;God I hope this works.&lt;/p&gt;  &lt;h3&gt;Acquiring the user’s Email Address&lt;/h3&gt;  &lt;p&gt;Fortunately, by looking in the sample code’s ThisAddIn.vb class, I’ve already discovered a helpful Function that I knew I needed somewhere.&amp;#160; A quick trip to a VB-to-C# converter and I’ll drop this into my own ThisAddIn.cs class.&lt;/p&gt;  &lt;p&gt;However, there’s no direct property of an IMsoContactCard object that corresponds to the contact’s email address – for that I had to find &lt;a href="http://msdn.microsoft.com/en-us/library/ee692172.aspx#OfficeOLExtendingUI_PersonaContextMenuforaSenderorRecipient"&gt;this sample code that does a conversion&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;D’oh! Nope, even that just ends up returning the X.500 version of the Exchange mail address.&amp;#160; Instead, I ended up back at &lt;a href="http://msdn.microsoft.com/en-us/library/ee909466.aspx"&gt;this article&lt;/a&gt; that I’d read before, which provides a great GetSmtpAddress() function in VB.&amp;#160; Oh, *right* – which I’d already implemented in my project’s code a few weeks ago.&amp;#160; See what I mean about this “once a week coding” nonsense?&lt;/p&gt;  &lt;p&gt;Here’s my completed OnClick() method for the Contact context menu item, that calls into my ActiveDirectoryUser class:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;onGetUserDetailsClick(Office.&lt;span style="color: #2b91af"&gt;IRibbonControl &lt;/span&gt;control)
{
    &lt;span style="color: blue"&gt;try
    &lt;/span&gt;{
        Office.&lt;span style="color: #2b91af"&gt;IMsoContactCard &lt;/span&gt;card = control.Context &lt;span style="color: blue"&gt;as &lt;/span&gt;Office.&lt;span style="color: #2b91af"&gt;IMsoContactCard&lt;/span&gt;;

        &lt;span style="color: blue"&gt;if &lt;/span&gt;(card != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
        {
            &lt;span style="color: green"&gt;// Here's where we need to instantiate the UserDetailsPopup() object
            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UserDetailsPopup &lt;/span&gt;UserDetailsInfoForm = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UserDetailsPopup&lt;/span&gt;();
            UserDetailsInfoForm.Show();

            &lt;span style="color: blue"&gt;string &lt;/span&gt;emailAddress = GetSmtpAddress(card);
            &lt;span style="color: #2b91af"&gt;ActiveDirectoryUser &lt;/span&gt;user = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ActiveDirectoryUser&lt;/span&gt;();
            
            &lt;span style="color: #2b91af"&gt;NameValueCollection &lt;/span&gt;coll = user.getGcUserData(emailAddress);&lt;span style="color: green"&gt;
        &lt;/span&gt;}
        &lt;span style="color: blue"&gt;else
        &lt;/span&gt;{
            &lt;span style="color: green"&gt;// Here's where we handle this edge case
        &lt;/span&gt;}
    }
    &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Exception &lt;/span&gt;ex)
    {
        &lt;span style="color: green"&gt;// Handle the exceptions
        &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Error spat out&amp;quot; &lt;/span&gt;+ ex.Message);
    }
}&lt;/pre&gt;
&lt;/blockquote&gt;


&lt;p&gt;…&lt;/p&gt;

&lt;p&gt;Much later, after a couple of hours of debugging this slapped-together code, I’ve finally arrived at a method that’s finally deriving the output of live queries against AD.&amp;#160; And I have an answer to the big question: no, not all of the really useful attributes are being replicated to the GC.&amp;#160; The most obvious one that’s missing would be the job description-oriented attribute.&amp;#160; Of all the User object custom attributes *not* to replicate, why did they pick on this one?&amp;#160; Is it really so hard to believe that someone would want to query this value in a global directory?&amp;#160; Looks like I’m going to have to implement some referral chasing and see if that doesn’t tank the performance of the add-in.&lt;/p&gt;

&lt;h3&gt;Completed GC-querying Method&lt;/h3&gt;

&lt;p&gt;Here’s my GC-querying method call to derive the GC-replicated attributes (using “department” as substitute for the the custom attributes internal to the organization that I’m going after):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NameValueCollection &lt;/span&gt;getGcUserData(&lt;span style="color: blue"&gt;string &lt;/span&gt;emailAddress)
{
    &lt;span style="color: #2b91af"&gt;NameValueCollection &lt;/span&gt;returnValue = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NameValueCollection&lt;/span&gt;();
    
    &lt;span style="color: #2b91af"&gt;DirectoryEntry &lt;/span&gt;gc = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DirectoryEntry&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;GC: &amp;quot;&lt;/span&gt;);
    &lt;span style="color: #2b91af"&gt;DirectoryEntry &lt;/span&gt;_root = &lt;span style="color: blue"&gt;null&lt;/span&gt;;
    &lt;span style="color: blue"&gt;using &lt;/span&gt;(gc)
    {
        &lt;span style="color: green"&gt;//there is only 1 child under &amp;quot;GC: &amp;quot;
        &lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;DirectoryEntry &lt;/span&gt;root &lt;span style="color: blue"&gt;in &lt;/span&gt;gc.Children)
        {
            _root = root;
            &lt;span style="color: blue"&gt;break&lt;/span&gt;;
        }
    }

    &lt;span style="color: green"&gt;//Note: the filter must be searching for a GC replicated attribute!
    &lt;/span&gt;&lt;span style="color: blue"&gt;string &lt;/span&gt;filter = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(
        &lt;span style="color: #a31515"&gt;&amp;quot;(mail={0}) &amp;quot;&lt;/span&gt;,
        emailAddress
        );

    &lt;span style="color: #2b91af"&gt;DirectorySearcher &lt;/span&gt;ds = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DirectorySearcher&lt;/span&gt;(
        _root,
        filter,
        &lt;span style="color: blue"&gt;null&lt;/span&gt;,
        &lt;span style="color: #2b91af"&gt;SearchScope&lt;/span&gt;.Subtree
        );

    &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;SearchResultCollection &lt;/span&gt;src = ds.FindAll())
    {
        &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;SearchResult &lt;/span&gt;sr &lt;span style="color: blue"&gt;in &lt;/span&gt;src)
        {
&lt;span style="color: green"&gt;            &lt;/span&gt;returnValue.Add(&lt;span style="color: #a31515"&gt;&amp;quot;department&amp;quot;&lt;/span&gt;, sr.Properties[&lt;span style="color: #a31515"&gt;&amp;quot;department&amp;quot;&lt;/span&gt;].ToString());
        }
    }
    &lt;span style="color: blue"&gt;return &lt;/span&gt;returnValue;
}&lt;/pre&gt;
&lt;/blockquote&gt;


&lt;h3&gt;Next Steps&lt;/h3&gt;

&lt;p&gt;Need to figure out how to bind the NameValueCollection to the XAML for my WPF-based add-in.&amp;#160; Then I need to find my ass with two hands and a map.&amp;#160; And after that, perhaps I’ll look into the complexity of referral chasing to get the non-GC-replicated user attributes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Acknowledged: the two simple articles that saved my ass twice now&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee692172.aspx#OfficeOLExtendingUI_PersonaContextMenuforaSenderorRecipient"&gt;Extending the User Interface in Outlook 2010&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee909466.aspx"&gt;Customizing the Context Menu of a Contact Card in Outlook 2010&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-1569274462769153673?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/1569274462769153673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=1569274462769153673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1569274462769153673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1569274462769153673'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2010/10/building-outlook-add-in-completing-work.html' title='Building an Outlook Add-in: completing work on the Active Directory query'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-3998881480573126614</id><published>2010-09-27T22:35:00.001-07:00</published><updated>2010-09-27T22:35:25.508-07:00</updated><title type='text'>Building an Outlook add-in: Context Menu of Contact Card in Outlook 2010</title><content type='html'>&lt;p&gt;Before going *any* further with VSTO code, I am taking some very good advice I gave myself a couple of years ago and installing some of the &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=46B6BF86-E35D-4870-B214-4D7B72B02BF9&amp;amp;displaylang=en"&gt;VSTO Power Tools&lt;/a&gt; (just the VSTO_PT.exe package) – specifically to obtain the VSTO Developer Cleaner and the VSTO Troubleshooter.&amp;#160; I recall both of these being very helpful, the last time I went down this path.&lt;/p&gt;  &lt;p&gt;Note also: I am *not* going to pursue the Office Interop API Extensions.&amp;#160; I am aware they’re targeted specifically at easing C# development of VSTO apps in Word, Excel and Outlook.&amp;#160; However, after reading &lt;a href="http://blogs.msdn.com/b/philliphoff/"&gt;PhillipHoff’s blog&lt;/a&gt; that “documented” them, the &lt;a href="http://blogs.msdn.com/b/philliphoff/archive/2008/02/21/office-interop-api-extensions-now-available.aspx"&gt;near-total lack of a deployment story&lt;/a&gt; is enough to encourage me to tough it out without ‘em:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“You are correct in that the User Guide does not explicitly state that you cannot use VSTO_PTExtLibs.exe to redistribute the extension assemblies, but as you found, the installer has a dependency check which prevents it from being used for that purpose.&lt;/p&gt;    &lt;p&gt;“You have two basic options for distributing the extension assembly: either a custom installer that places it in the GAC or another common location, or side-by-side the referencing assembly.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Heh, yeah right.&amp;#160; A year or two ago I feel down the rabbit hole of developing a custom setup package for a Word VSTO app add-in.&amp;#160; That sucked me dry for months, and I never got any satisfaction out of it (tho it’ll probably save me a couple of months this time around).&amp;#160; *Voluntarily* adding to my pain by trying to install a helper assembly of dubious provenance and poor support?&amp;#160; Not bloody likely my friends.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Creating a WPF Control for use within Outlook 2010&lt;/h3&gt;  &lt;p&gt;Diving back into &lt;a href="http://msdn.microsoft.com/en-us/office/ff461260.aspx"&gt;this video tutorial&lt;/a&gt;.&amp;#160; Already stuck on one of the first steps – adding the WPF “User Control” to the ElementHost winforms container.&amp;#160; Even though I’m able to successfully build the project, there’s no WPF user control to add to the ElementHost (at least that’s what the ElementHost “Select Hosted Content” taskpane is indicating.&amp;#160; Google it is… searching on &lt;em&gt;elementhost &amp;quot;select hosted content&amp;quot; none&lt;/em&gt;:&lt;/p&gt;  &lt;p&gt;…actually, I just remembered how many articles I’ve been skimming are focused so strongly on .NET Framework 4, so first I decided to re-target the VSTO project to .NET 4.&amp;#160; For some reason that seems to have wiped out the piece of code that contained the ElementHost-including form, so perhaps that’ll clear up the problem I’ve been having.&lt;/p&gt;  &lt;p&gt;I ended up Building the project and failing, needing to add a Reference to System.Xaml (from the .NET 4 namepsace) to one of the .CS files.&amp;#160; Once I did that, magically I was able to add either of the XAML user controls I’d tried to create as children of the ElementHost object.&amp;#160; Amazing.&lt;/p&gt;  &lt;p&gt;I’m re-trying this approach with an Office Ribbon (XML) item as is outlined in &lt;a href="http://msdn.microsoft.com/en-us/library/ee909466.aspx"&gt;Customizing the Context Menu of a Contact Card in Outlook 2010&lt;/a&gt;.&amp;#160; I change the button element’s &lt;strong&gt;id&lt;/strong&gt;, &lt;strong&gt;label&lt;/strong&gt;, and &lt;strong&gt;onAction&lt;/strong&gt; XML parameters, then run this article’s VB-only code through a VB-to-C# converter to import into my code.&amp;#160; Each time I have to fill in a few blanks along the way – figuring out which method to add to my code, to which CS library, and matching some undeclared variable names and using statements up with orphaned code in the sample.&amp;#160; What moron would expect a “Visual How To” from Microsoft to ever run without a ton of band-aid work to actually fill in boring-but-essential components?&lt;/p&gt;  &lt;p&gt;Once I figured out how this sample code would instantiate the Ribbon (XML) item, I only have two more tasks before I start binding the XAML to its data source:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;instantiating the XAML-encapsulated-in-WinForms control, and &lt;/li&gt;    &lt;li&gt;creating the Callback Methods that are hinted at (but not spelled out) in the Ribbon (XML) //TODO section (automatically generated by Visual Studio when I created the Ribbon (XML) object. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Yeah, that should be easy.&amp;#160; Callbacks – is that like in the theatre?&amp;#160; Hell, for all *I* know, (2) is where I *implement* (1).&lt;/p&gt;  &lt;p&gt;Aha!&amp;#160; Apparently I’m not far off from the truth – the &lt;a href="http://msdn.microsoft.com/en-us/library/aa942955.aspx"&gt;Walkthrough: Creating a Custom Tab by Using Ribbon XML&lt;/a&gt; says:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;You must add onAction callback methods for the Insert Text and Insert Table buttons to perform actions when the user clicks them.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Right right right – so the meaning of “callbacks” is coming slowly back to me – at least in the context of button pushing. :)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Problem: UserControl doesn’t Show()&lt;/h3&gt;  &lt;p&gt;I spent some time looking for a suitable approach to rendering the WPF Element Host-ing user control, and tried a couple of approaches, but none work so far.&amp;#160; The approach I’ve landed on instantiates a new instance of the Class that hosts the ElementHost (here called “DataDetails”), then calls the .Show() method for the object instance, like so:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;DataDetails dataDisplay = new DataDetails();&lt;br /&gt;dataDisplay.Show();&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;However nothing appears visible when I click the new context menu item in Outlook 2010.&amp;#160; Here’s what I’ve tried, none of which tells me why this won’t display:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;follow the .Show() call with calling the BringToFront() method, in case somehow the user control was being hidden behind Outlook &lt;/li&gt;

  &lt;li&gt;added a straight System.Windows.Forms class to the project (called it my Debug window), then instantiate it as for the DataDetails class instance and call the ShowDialog() or Show() method [which works] &lt;/li&gt;

  &lt;li&gt;did a line-by-line debug of this area of my code [which proves that every line of code is being called – nothing skipped – but the ElementHost is still not showing up] &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Re-examining the Debug vs. DataDetails objects, I’m pretty convinced that using the Form class is easy, but there’s some step I’m still missing when using the UserControl class.&amp;#160; This is borne out when I merely substitute “Form” in place of the original “UserControl” for the partial inheritance, like so:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font face="Courier New"&gt;public partial class DataDetails : Form 
      &lt;br /&gt;{ 

      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public DataDetails() {&amp;#160; InitializeComponent(); } 

      &lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;Further Research References &lt;/h3&gt;

&lt;p&gt;Aside: the specific Context Menu I’m manipulating here is sometimes called the &lt;strong&gt;Persona Context Menu&lt;/strong&gt; (at least by the article &lt;a href="http://msdn.microsoft.com/en-us/library/ee692172.aspx"&gt;Extending the User Interface in Outlook 2010&lt;/a&gt;).&amp;#160; I have a feeling that will be a very useful phrases in my current research.&lt;/p&gt;

&lt;p&gt;Other articles I’ll probably need to almost immediately:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee691832(office.14).aspx"&gt;Customizing Context Menus in Office 2010&lt;/a&gt;&amp;#160; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ff468686.aspx"&gt;Customize the Office user interface in Office 2010&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/office/ff461260.aspx"&gt;How Do I: Create a WPF Control for Use Within Outlook 2010?&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/bethmassi/archive/2009/12/21/build-wpf-data-controls-for-outlook-addins-easily-with-vs2010.aspx"&gt;Building WPF Data Controls for Outlook Addins Easily with VS2010&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some other articles I expect I’ll need in the future:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/vsto/archive/2010/03/10/changes-in-the-security-model-for-office-solutions.aspx"&gt;Changes in the Security Model for Office Solutions&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/1666d2b0-a4d0-41e8-ad86-5eab3542de1e"&gt;Deploying Office Solutions to End User Computers&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/vsto/archive/2010/08/19/deploying-microsoft-office-solutions-by-using-visual-studio-2010-and-windows-installer.aspx"&gt;Deploying Microsoft Office Solutions by Using Visual Studio 2010 and Windows Installer&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/vsto/archive/2010/06/24/channel-9-interview-office-add-in-vsto-performance-tips-amp-tricks-beth-massi-stephen-peters.aspx"&gt;Office Add-in (VSTO) Performance Tips &amp;amp; Tricks&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blogs.msdn.com/b/vsto/archive/2010/06/21/troubleshoot-vsto-add-in-load-failures-navneet-gupta.aspx"&gt;Troubleshoot VSTO Add-In Load Failures&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, here are some possible sources of working code that I’ve found in my travels:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/contextmenusaddin"&gt;ContextMenus Add-in for Office 2010&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/Communicator4Outlook"&gt;Communicator Add In for Outlook 2007&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/OutLoudForOutlook"&gt;Out Loud for Outlook&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/adcrmresolver"&gt;Outlook 2007 Add-in: Active Directory &amp;amp; CRM Resolver&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/OfficeDevFuture"&gt;Office Development in Visual Studio 2010&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/VSTO2010MSI"&gt;Deploying a VSTO 2010 solution for Office 2007/2010 using Windows Installer&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=5d57c998-b630-4f38-afaa-b79747a3da06&amp;amp;displaylang=en"&gt;Microsoft Office 2010 Primary Interop Assemblies Bootstrapper Package&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://splusoutlookaddin.codeplex.com/"&gt;SPlus Convert email thread to a follow-up Meeting Request&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://inboxzero.codeplex.com/"&gt;Inbox Zero Outlook 2007 Addins&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://oar.codeplex.com/"&gt;Outlook Attachment Reminder for Outlook 2007/2010&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-3998881480573126614?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/3998881480573126614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=3998881480573126614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3998881480573126614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3998881480573126614'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2010/09/building-outlook-add-in-context-menu-of.html' title='Building an Outlook add-in: Context Menu of Contact Card in Outlook 2010'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-6291767815553290064</id><published>2010-09-25T17:53:00.001-07:00</published><updated>2010-10-01T16:25:04.103-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSTO'/><category scheme='http://www.blogger.com/atom/ns#' term='Outlook'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Building an Outlook Add-in: customizing the Contact Card, other options?</title><content type='html'>&lt;p&gt;[&lt;em&gt;I’m working on an app for work – enable me to pull job title, team name, etc. from a proprietary internal database, since our Exchange Address Book doesn’t contain that info.&amp;#160; Just to set the context for what the h*** I’m up to.&lt;/em&gt;]&lt;/p&gt;  &lt;p&gt;Did a broad search for “Outlook 2010 VSTO” to find some beginners’ guide to writing something that will run in Outlook 2010.&amp;#160; Lots of possible stuff to read, but this 20-minute video seemed like my best bet:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/office/ff461260.aspx"&gt;How Do I: Create a WPF Control for Use Within Outlook 2010&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Yes the question should be asked: are you better off writing an Outlook 2010 add-in using WPF or a Windows Forms?&amp;#160; I haven’t yet found a definitive answer, and they may both be supported to some degree, but the majority of articles I stumbled across were using WPF not Windows Forms.&amp;#160; That *may* just be a tyrannical bias coming from Microsoft, where XAML is all the rage and you’re ‘not allowed’ to talk about legacy development there anymore.&amp;#160; Regardless, if I see WPF and Outlook 2010 mentioned more than a half-dozen times, that *has* to be supported pretty well, so I’ll go with that for now.&lt;/p&gt;  &lt;h3&gt;Contact Card&lt;/h3&gt;  &lt;p&gt;Next I need to know what kind of Outlook “object” I’m trying to attach to.&amp;#160; I am aiming for that new intermediate Contact panel that shows up when you double-click the email address of an email in your Inbox (this example borrowed from &lt;a href="http://support.microsoft.com/library/images/support/kbgraphics/Public/en-us/office/981022_ss01.png"&gt;Microsoft Support&lt;/a&gt;):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_rwORjiC6Rv4/TJ6ZoB6huvI/AAAAAAAAACo/05T2eainRb4/s1600-h/Contact%20Card%20example%5B2%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Contact Card example" border="0" alt="Contact Card example" src="http://lh4.ggpht.com/_rwORjiC6Rv4/TJ6Zo1YGGsI/AAAAAAAAACs/kO0R9xqWikM/Contact%20Card%20example_thumb.png?imgmax=800" width="232" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;It already has a tabbed interface, so adding another tab makes intuitive sense as a user. &lt;/li&gt;    &lt;li&gt;It’s the first interface you get to detailed info on a user, so it’s the fewest clicks to get to an extended UI I could add. &lt;/li&gt;    &lt;li&gt;It’s new in Outlook 2010, which (I hope) means that the Outlook Interop object model has implemented first-class .NET support for interacting with that object.&amp;#160; [As opposed to some of the legacy objects in Outlook for which there is pretty crappy support in the .NET Interop model.] &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Searches for “Outlook 2010 new features” take me to pages &lt;a href="http://office.microsoft.com/en-us/outlook/outlook-2010-features-and-benefits-HA101810016.aspx"&gt;like this&lt;/a&gt;, which refer to this new interface as “a new easy-to-access contact card”.&amp;#160; Digging into the official Outlook blog there’s a detailed article “&lt;a href="http://blogs.msdn.com/b/outlook/archive/2010/06/03/using-the-contact-card-to-learn-who-someone-is.aspx"&gt;Using the contact card to learn who someone is&lt;/a&gt;”, so I’m definitely on the right track.&amp;#160; Now if only this was the same nomenclature used in the Outlook object model (developer side of the world) – it’s rare that the underlying code and the marketing names ever get aligned, so I’m not surprised much anymore if I don’t get that fantasy fulfilled.&amp;#160; [Heh, and just to show how easy it could’ve been, I realize now that the Contact Card is available as a context menu item when you right-click the email address.]&lt;/p&gt;  &lt;p&gt;So my next search – Outlook 2010 “contact card” “object model” – turned up an article called “&lt;a href="http://msdn.microsoft.com/en-us/library/ee909466.aspx"&gt;Customizing the Context Menu of a Contact Card in Outlook 2010&lt;/a&gt;”.&amp;#160; Among other things, this article states that “The &lt;strong&gt;IMsoContactCard&lt;/strong&gt; object is defined in the primary interop assembly, Office.dll, of the Microsoft Office object library, not in Outlook 2010.”&amp;#160; So this is apparently an Office-wide object, available to other Office apps – not just Outlook (though it’s entirely possible Outlook is the only app that bothered).&lt;/p&gt;  &lt;p&gt;Which also happens to lead to a Code Gallery sample called “&lt;a href="http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=odcol14h2&amp;amp;ReleaseId=3697"&gt;Outlook 2010: Visual How Tos: Code Samples&lt;/a&gt;” that includes the sample code.&amp;#160; Unfortuately the sample is adding a new entry to the context menu, not to the Contact Card itself (which is a mite confusing, as the object model doesn’t make a really clear distinction between the two).&amp;#160; HOwever, this gives me a great lead on what area of the object model to focus my attention on.&amp;#160; And worse come to worst, I can always start with a really crude hack of adding a context menu selection that just pulls up the internal directory data for the selected user (or as I’m seeing from the code sample, the “Recipient” – gotta get your nomenclature aligned when you dive into an Office object model exploration).&lt;/p&gt;  &lt;p&gt;Next let’s see if anyone out there has been monkeying with this object or this part of the object model – searches on Stack Overflow turn up nothing, but MSDN Social Forums hits some info on:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/outlookdev/thread/36e31587-2e8c-4b20-9ee2-cefa3b32edc5"&gt;Customizing the contact hover card&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/outlookdev/thread/b68b2c3e-9610-480a-89b4-d77813b6d917"&gt;Customizing the contact card in Outlook 2010&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And a search of MSDN Library for IMsoContactCard led to one non-reference article: &lt;a href="http://msdn.microsoft.com/en-us/library/ee692172.aspx"&gt;Extending the User Interface in Outlook 2010&lt;/a&gt;.&amp;#160; According to this article, adding a new item to the context menu when you right-click an email sender or recipient is done using the ContextMenuContactCardRecipient context menu.&lt;/p&gt;  &lt;p&gt;Given that these articles all seem to say that it’s impossible to extend the contact card itself, I find myself with two alternatives:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Add a right-click menu option that pulls the internal directory info for the selected recipient. &lt;/li&gt;    &lt;li&gt;Add another tab to the ‘legacy’ Outlook Properties window (which was the default in Outlook 2007 &amp;amp; 2003 when you double-click on a user). &lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;Context Menu vs. Properties window&lt;/h3&gt;  &lt;p&gt;Comparing Option (1) and (2), I come to these benefits &amp;amp; drawbacks:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The programming for the Contact Card context menu was just added in 2010, which probably makes it behave more consistently and robustly than the COM-based crap that comes with legacy Outlook features. &lt;/li&gt;    &lt;li&gt;Adding a tab to the Properties window (form) would assist me more easily if I wanted to “crawl up the address book” (i.e. look for the same information on the managers of the recipient I’m exploring).&amp;#160; I find I *can* get to a context menu for the recipient’s manager, but it’s hellishly buried and I’d probably be one of three people who’d find it (or who’d bother taking this path). &lt;/li&gt;    &lt;li&gt;From my recollection, Office (and Outlook in particular) can be really picky about exactly how and when to dispose of objects – generally resulting (from &amp;lt;100% perfect code) in deadlocks, memory leaks or difficulties in shutting down the hosting app.&amp;#160; I would imagine the Interop Assemblies have a harder time communicating reliably with the legacy COM object model (e.g. Properties window) than with objects only recently introduced (e.g. Fluent UI). &lt;/li&gt;    &lt;li&gt;While the Office Interop Assemblies have been incredibly forgiving about providing backwards-compatibility to all the COM objects that have been accumulated over the decades, I have to believe that Fluent UI customizations have a better future in coming versions of Office than COM-based customizations.&amp;#160; This should be especially true of Outlook, since that team took a “wait and see” approach to the Fluent UI in the Outlook 2007 generation.&amp;#160; If they’re still on board, they’ve benefited from the delay *and* it is likely they’re more committed than if they’d gotten burned by jumping in early. &lt;/li&gt;    &lt;li&gt;If I’m reading this right, Office Communicator (probably 2007 R2 and later) implements support for the IMsoContactCard – so a Fluent UI approach might actually give us coverage in Outlook *and* Communicator.&amp;#160; I don’t know how useful that really would be, but it *sounds* cool. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Thinking as an end user, I’d find another tab on the Outlook Properties window more intuitive, but I’d also be extremely unforgiving if my Outlook user experience slowed down or destabilized.&amp;#160; I don’t like the Context Menu approach that I seem to be left with in customizing the Fluent UI, but I can be optimistic that a more integrated approach will become apparent as my research continues – and in the meantime I’ll have a Fluent UI-compatible set of code to build on.&lt;/p&gt;  &lt;h4&gt;Details: Fluent UI&lt;/h4&gt;  &lt;p&gt;All these articles I’m finding talk about these Contact Card customizations in terms of customizing the “Fluent UI”.&amp;#160; I’m not sure, but I had believed that this Fluent UI was primarily introduced as a wrapping layer of menu/ribbon ‘cleanup’ of the Office UI that was long overdue by Office 2007.&amp;#160; These references make it sound as if the Fluent UI is where all new UI improvements are “homed” in Outlook 2010.&lt;/p&gt;  &lt;p&gt;As I dig a little further, there are some pretty clear indications this is true:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ff468686.aspx"&gt;Customize the Office UI&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;In Office 2010, the Office Fluent UI is fully customizable. This includes the ribbon, the Quick Access Toolbar, and the built-in context menus. By using the flexible XML-based markup and callbacks, you can create context menus by updating Open XML Format files or by using add-ins that are created in Microsoft Visual Studio.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee691832(office.14).aspx"&gt;Customizing Context Menus in Office 2010&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;In Office 2010, you can customize built-in context menus just as you can the other components of the Ribbon UI. This XML-based context menu extensibility model is based on the familiar Ribbon extensibility model. This means that you can use the same XML markup and callbacks that you currently use to customize the Ribbon UI.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Encouraging, but not specifically helpful other than a lot of hand-waving and empty promises.&amp;#160; Having clear documentation on what the object model does is the critical piece, and all I’ve got here so far is a Context menu (which is hardly an intuitive UI approach).&amp;#160; However, if that’s what I’ve got then it’ll have to do.&amp;#160; Off to implement code based on &lt;a href="http://msdn.microsoft.com/en-us/library/ee909466.aspx"&gt;Customizing the Context Menu of a Contact Card in Outlook 2010&lt;/a&gt; and see how well that treats me.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-6291767815553290064?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/6291767815553290064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=6291767815553290064' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6291767815553290064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6291767815553290064'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2010/09/building-outlook-add-in-customizing.html' title='Building an Outlook Add-in: customizing the Contact Card, other options?'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_rwORjiC6Rv4/TJ6Zo1YGGsI/AAAAAAAAACs/kO0R9xqWikM/s72-c/Contact%20Card%20example_thumb.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-6175467583622667631</id><published>2010-03-09T10:55:00.000-08:00</published><updated>2010-03-09T11:09:06.251-08:00</updated><title type='text'>Silverlight training, note to self: adding non-default Assemblies for additional controls</title><content type='html'>&lt;strong&gt;Problem&lt;/strong&gt;: In my Silverlight training class, we were instructed to try using a TabControl in a newspaper Silverlight app.  I followed part of the instructions to add the Assembly as an xmlns reference in the page code, but I couldn't get the sucker to compile.

Here's the line of code I added to the page:

&lt;blockquote&gt;xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"&lt;/blockquote&gt;

It was giving me this error:
&lt;blockquote&gt;The type or namespace name 'TabControl' does not exist in the namespace 'System.Windows.Controls' (are you missing an assembly reference?)&lt;/blockquote&gt;

&lt;strong&gt;Solution&lt;/strong&gt;: (Big forehead slap)  Every single time I try to get back into .NET code, I keep having to learn this ridiculously, embarrassingly simple lesson: for whatever reason, when I add a reference to a .NET assembly in my code, I also have to add a reference to the References tree in the Solution Explorer:
&lt;ul&gt;&lt;li&gt;In the Solution Explorer, browse to the Project where this code is failing&lt;/li&gt;&lt;li&gt;Right-click the References folder, choose Add Reference, and add System.Windows.Controls from the .NET tab&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-6175467583622667631?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/6175467583622667631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=6175467583622667631' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6175467583622667631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6175467583622667631'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2010/03/silverlight-training-note-to-self.html' title='Silverlight training, note to self: adding non-default Assemblies for additional controls'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-8146706860151901789</id><published>2010-03-09T10:34:00.000-08:00</published><updated>2010-03-09T11:13:45.543-08:00</updated><title type='text'>Silverlight training, note to self: blank page</title><content type='html'>&lt;strong&gt;Problem&lt;/strong&gt;: Every time I try to debug a new project that's derived from training materials, I end up with a blank page.

When I "View Source" on the debugging page, all I see is this:

&lt;blockquote&gt;&lt;code&gt;&amp;lt;form id="form1" method="post" name="form1" action="default.aspx"&amp;gt;

&amp;lt;div&amp;gt;

&amp;lt;input id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZGlFdbf1fP59jHcHgqEoRgovlZBY" type="hidden" name="__VIEWSTATE"&amp;gt;

&amp;lt;/div&amp;gt;

&amp;lt;div&amp;gt;

&amp;lt;/div&amp;gt;

&amp;lt;/form&amp;gt; &lt;/code&gt;&lt;/blockquote&gt;

&lt;strong&gt;Solution&lt;/strong&gt;: need to set the default page in the Web project:
&lt;ul&gt;&lt;li&gt;In Solution Explorer, browse the Project suffixed with ".Web"&lt;/li&gt;&lt;li&gt;Right-click on the .aspx page you wish to launch by default, and choose "Set As Start Page"&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-8146706860151901789?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/8146706860151901789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=8146706860151901789' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/8146706860151901789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/8146706860151901789'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2010/03/silverlight-training-note-to-self-blank.html' title='Silverlight training, note to self: blank page'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-5851738507874438813</id><published>2010-02-15T18:43:00.001-08:00</published><updated>2010-02-15T18:43:53.006-08:00</updated><title type='text'>Lenovo T61? High CPU usage? Look for bad drivers (…spewing hardware interrupts)</title><content type='html'>&lt;p&gt;For a couple of months, I noticed some pretty unusual CPU utilization on my Lenovo T61 Thinkpad (running Windows XP SP3).&amp;#160; I run &lt;a href="http://technet.microsoft.com/sysinternals/bb896653.aspx"&gt;Process Explorer&lt;/a&gt; (ProcExp) in the background all day, to keep an eye out for unusual system performance behaviour, and lately I’ve noticed that almost an entire “core” on my Intel dual-core system is consumed by something running in Kernel space.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_rwORjiC6Rv4/S3oGXaVZVRI/AAAAAAAAABs/j_gJiSqYBX4/s1600-h/notificationArea4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="notificationArea" border="0" alt="notificationArea" align="right" src="http://lh5.ggpht.com/_rwORjiC6Rv4/S3oGYFga41I/AAAAAAAAABw/vhUGffESMBg/notificationArea_thumb2.png?imgmax=800" width="232" height="72" /&gt;&lt;/a&gt;I have ProcExp configured to display the CPU meter in the “systray” (aka notification area), and it’s really easy to know when there’s a kernel-consumer on your system – that’s when the CPU utilization graph will show a sizeable proportion of the line graph in red, rather than its more typical green (for User space consumers).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_rwORjiC6Rv4/S3oGYh1_O9I/AAAAAAAAAB0/qvIYn-NDUUQ/s1600-h/procexp4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="procexp" border="0" alt="procexp" align="right" src="http://lh4.ggpht.com/_rwORjiC6Rv4/S3oGZMyZMJI/AAAAAAAAAB4/v_eDY2o7qr8/procexp_thumb2.png?imgmax=800" width="445" height="167" /&gt;&lt;/a&gt; Pop open ProcExp under this condition, and if you’ve spent as much time watching these behaviour profiles as I have, and you’ll be as surprised as I was to find the “Interrupts” process (really, just an abstract aggregate) reporting CPU utilization in the 30’s or 40’s.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Summary of the solution: bad drivers, needed to be updated.&amp;#160; In my case it was a network driver that had just been updated by the vendor; for others the culprits seem to be video drivers.&amp;#160; I’m sure other failures exist, but these are the two most common.&lt;/p&gt;  &lt;h2&gt;Step 1: Device Manager&lt;/h2&gt;  &lt;p&gt;When hardware and/or drivers are acting up like this, check to make sure your drivers are loading properly in Windows:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Open the Device Manager control panel applet (e.g. run “devmgmt.msc”) &lt;/li&gt;    &lt;li&gt;Look at the list to see if any categories are expanded &lt;/li&gt;    &lt;li&gt;In every expanded category, examine the details of any device that has a yellow exclamation mark (indicating there is some problem with the driver).&amp;#160; If at all possible, resolve the issue that’s been identified. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Until all driver issues have been resolved, any other suggestions you follow below could be moot.&amp;#160; If you really can’t fix the problem(s) that Device Manager is presenting, but want to try other approaches, then there are a couple of tactical workarounds you may wish to try:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Install a newer (or older) version of the driver, to see if it’s just the current driver version that’s having problems. &lt;/li&gt;    &lt;li&gt;Disable the device temporarily, and make sure you are still seeing the excessive hardware interrupts being generated for a sustained period.&amp;#160; (If not, then perhaps that was the offending driver, and perhaps you’ll be able to run with the device disabled while the vendor addresses the issue in a later version of the driver.&amp;#160; Lucky you.) &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Step 2: KernRate&lt;/h2&gt;  &lt;p&gt;Microsoft has an interesting little package, developed for use on Windows XP, to dig into a little detail on the Kernel-related activity on the system.&amp;#160; It’s not exactly a wizard I’d send to my mom, but it’s helped at least narrow the potential issues to track down for me.&lt;/p&gt;  &lt;p&gt;You can &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=d6e95259-8d9d-4c22-89c4-fad382eddcd1&amp;amp;displaylang=en"&gt;download KernRate from here&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;2.1 Setup &amp;amp; Config for a valid KernRate result&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Install &lt;a href="http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx"&gt;Windows Debugging Tools&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Install KernRate &lt;/li&gt;    &lt;li&gt;Configure valid symbols PATH variable – see &lt;a href="http://forum.sysinternals.com/forum_posts.asp?TID=14768"&gt;this thread&lt;/a&gt; for details       &lt;ul&gt;       &lt;li&gt;Create a new directory &lt;strong&gt;C:\Symbols&lt;/strong&gt; &lt;/li&gt;        &lt;li&gt;Create a new environment variable by clicking on: Start menu &amp;gt; Control Panel &amp;gt; System &amp;gt; Advanced &amp;gt; Environment Variables &amp;gt; click New under &amp;quot;user variables for …&amp;quot;, then type:          &lt;ul&gt;           &lt;li&gt;Variable name: _NT_SYMBOL_PATH &lt;/li&gt;            &lt;li&gt;Variable value: &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Copy DBGHELP.DLL and SYMSRV.DLL from the install location for Windows Debugging Tools (usually &lt;strong&gt;C:\Program Files\Debugging Tools for Windows (x86)&lt;/strong&gt;) to the install location for KernRate (usually &lt;strong&gt;C:\Program Files\KrView\Kernrates&lt;/strong&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;2.2 Use KernRate to profile kernel activity&lt;/h3&gt;  &lt;p&gt;Once it’s installed and configured correctly, you can just fire up &lt;strong&gt;Kernrate_i386_xp.exe&lt;/strong&gt;, let it run for a few minutes (during the period when the Kernel activity is not what you’d expect), and then hit &lt;strong&gt;[Ctrl]-C&lt;/strong&gt; to get the results of the Kernrate run.&lt;/p&gt;  &lt;p&gt;Here’s a typical output from my system during &lt;strong&gt;&lt;em&gt;normal&lt;/em&gt;&lt;/strong&gt; operating conditions&amp;#160; (&lt;em&gt;NOTE: for every Kernrate output, I’ve left out the entries from the final table that have no significant “hits” i.e. no significant volume of kernel events&lt;/em&gt;):&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;C:\Program Files\KrView\Kernrates&amp;gt;Kernrate_i386_XP.exe      &lt;br /&gt;/==============================\       &lt;br /&gt;&amp;lt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; KERNRATE LOG&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;gt;       &lt;br /&gt;\==============================/       &lt;br /&gt;Date: 2009/06/09&amp;#160;&amp;#160; Time: 13:50:38       &lt;br /&gt;Machine Name: MIKESL-MOBL1       &lt;br /&gt;Number of Processors: 2       &lt;br /&gt;PROCESSOR_ARCHITECTURE: x86       &lt;br /&gt;PROCESSOR_LEVEL: 6       &lt;br /&gt;PROCESSOR_REVISION: 0f0b       &lt;br /&gt;Physical Memory: 2007 MB       &lt;br /&gt;Pagefile Total: 3856 MB       &lt;br /&gt;Virtual Total: 2047 MB       &lt;br /&gt;PageFile1: \??\C:\pagefile.sys, 2006MB       &lt;br /&gt;OS Version: 5.1 Build 2600 Service-Pack: 3.0       &lt;br /&gt;WinDir: C:\WINDOWS &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernrate User-Specified Command Line:      &lt;br /&gt;Kernrate_i386_XP.exe &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernel Profile (PID = 0): Source= Time,      &lt;br /&gt;Using Kernrate Default Rate of 25000 events/hit       &lt;br /&gt;Starting to collect profile data &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;***&amp;gt; Press ctrl-c to finish collecting profile data      &lt;br /&gt;===&amp;gt; Finished Collecting Data, Starting to Process Results &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;------------Overall Summary:-------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P0&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:00:11.296 (17.7%)&amp;#160; U 0:00:06.171 ( 9.7%)&amp;#160; I 0:00:46.328 (72.6%)&amp;#160; DPC      &lt;br /&gt;0:00:00.078 ( 0.1%)&amp;#160; Interrupt 0:00:00.031 ( 0.0%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 76929, Interrupt Rate= 1206/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P1&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:00:12.328 (19.3%)&amp;#160; U 0:00:07.718 (12.1%)&amp;#160; I 0:00:43.750 (68.6%)&amp;#160; DPC      &lt;br /&gt;0:00:00.109 ( 0.2%)&amp;#160; Interrupt 0:00:00.531 ( 0.8%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 15687, Interrupt Rate= 246/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;TOTAL&amp;#160; K 0:00:23.625 (18.5%)&amp;#160; U 0:00:13.890 (10.9%)&amp;#160; I 0:01:30.078 (70.6%)&amp;#160; DPC      &lt;br /&gt;0:00:00.187 ( 0.1%)&amp;#160; Interrupt 0:00:00.562 ( 0.4%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total Interrupts= 92616, Total Interrupt Rate= 1452/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Total Profile Time = 63796 msec &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStart&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStop&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Byt      &lt;br /&gt;esDiff.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Physical Memory&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 184655872,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 180600832,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -4055       &lt;br /&gt;040       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Pagefile(s)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1075990528,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1069088768,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -6901       &lt;br /&gt;760       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Virtual&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2132107264,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2131058688,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -1048       &lt;br /&gt;576       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Extended Virtual&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,       &lt;br /&gt;&amp;#160; 0 &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Avg. Rate      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Context Switches&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 949736,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 14887/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System Calls&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2754324,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 43173/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Page Faults&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 799583,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 12533/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Operations&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5382,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 84/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4657,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 73/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 92064,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1443/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160; 15853022,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2946/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1968451,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 423/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 9179346,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 100/ I/O &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;----------------------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Results for Kernel Mode:      &lt;br /&gt;----------------------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;OutputResults: KernelModuleCount = 229      &lt;br /&gt;Percentage in the following table is based on the Total Hits for the Kernel &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Time&amp;#160;&amp;#160; 11604 hits, 25000 events per hit --------      &lt;br /&gt;Module&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hits&amp;#160;&amp;#160; msec&amp;#160; %Total&amp;#160; Events/Sec       &lt;br /&gt;ntkrnlpa&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 9041&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 63796&amp;#160;&amp;#160;&amp;#160; 77 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3542933       &lt;br /&gt;hal&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1155&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 63796&amp;#160;&amp;#160;&amp;#160;&amp;#160; 9 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 452614       &lt;br /&gt;win32k&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 604&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 63796&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 236691       &lt;br /&gt;mfehidk&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 179&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 63796&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 70145       &lt;br /&gt;intelppm&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 163&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 63796&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 63875       &lt;br /&gt;igxpmp32&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 112&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 63796&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 43889       &lt;br /&gt;HIPK&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 98&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 63796&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 38403&amp;#160; &lt;br /&gt;…… &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;================================= END OF RUN ==================================      &lt;br /&gt;============================== NORMAL END OF RUN ==============================&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;And here’s the output from my system during one of these &lt;font color="#ff0000"&gt;CPU over-consumption cases&lt;/font&gt;:&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;C:\Program Files\KrView\Kernrates&amp;gt;Kernrate_i386_XP.exe      &lt;br /&gt;/==============================\       &lt;br /&gt;&amp;lt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; KERNRATE LOG&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;gt;       &lt;br /&gt;\==============================/       &lt;br /&gt;Date: 2009/06/10&amp;#160;&amp;#160; Time:&amp;#160; 8:41:26       &lt;br /&gt;Machine Name: MIKESL-MOBL1       &lt;br /&gt;Number of Processors: 2       &lt;br /&gt;PROCESSOR_ARCHITECTURE: x86       &lt;br /&gt;PROCESSOR_LEVEL: 6       &lt;br /&gt;PROCESSOR_REVISION: 0f0b       &lt;br /&gt;Physical Memory: 2007 MB       &lt;br /&gt;Pagefile Total: 3856 MB       &lt;br /&gt;Virtual Total: 2047 MB       &lt;br /&gt;PageFile1: \??\C:\pagefile.sys, 2006MB       &lt;br /&gt;OS Version: 5.1 Build 2600 Service-Pack: 3.0       &lt;br /&gt;WinDir: C:\WINDOWS &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernrate User-Specified Command Line:      &lt;br /&gt;Kernrate_i386_XP.exe &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernel Profile (PID = 0): Source= Time,      &lt;br /&gt;Using Kernrate Default Rate of 25000 events/hit       &lt;br /&gt;Starting to collect profile data &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;***&amp;gt; Press ctrl-c to finish collecting profile data      &lt;br /&gt;===&amp;gt; Finished Collecting Data, Starting to Process Results &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;------------Overall Summary:-------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P0&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:02:26.906 (80.8%)&amp;#160; U 0:00:21.640 (11.9%)&amp;#160; I 0:00:13.328 ( 7.3%)&amp;#160; DPC      &lt;br /&gt;0:00:01.078 ( 0.6%)&amp;#160; Interrupt 0:01:18.406 (43.1%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 3919032, Interrupt Rate= 21548/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P1&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:02:14.000 (73.7%)&amp;#160; U 0:00:32.703 (18.0%)&amp;#160; I 0:00:15.171 ( 8.3%)&amp;#160; DPC      &lt;br /&gt;0:00:00.640 ( 0.4%)&amp;#160; Interrupt 0:01:02.890 (34.6%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 3837550, Interrupt Rate= 21100/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;TOTAL&amp;#160; K 0:04:40.906 (77.2%)&amp;#160; U 0:00:54.343 (14.9%)&amp;#160; I 0:00:28.500 ( 7.8%)&amp;#160; DPC      &lt;br /&gt;0:00:01.718 ( 0.5%)&amp;#160; Interrupt 0:02:21.296 (38.8%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total Interrupts= 7756582, Total Interrupt Rate= 42648/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Total Profile Time = 181875 msec &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStart&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStop&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; By      &lt;br /&gt;esDiff.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Physical Memory&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 564551680,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 571240448,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 668       &lt;br /&gt;768       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Pagefile(s)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2194202624,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2233167872,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3896       &lt;br /&gt;248       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Virtual&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2132402176,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2131353600,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -104       &lt;br /&gt;576       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Extended Virtual&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,       &lt;br /&gt;&amp;#160; 0 &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Avg. Rate      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Context Switches&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1764882,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 9704/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System Calls&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160; 14821228,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 81491/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Page Faults&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 188084,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1034/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Operations&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 31768,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 175/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 27985,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 154/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 321733,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1769/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160; 24755975,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 779/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160; 14122756,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 505/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160; 31150904,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 97/ I/O &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;-----------------------------      &lt;br /&gt;&lt;/font&gt;&lt;font face="Terminal"&gt;Results for Kernel Mode:      &lt;br /&gt;----------------------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;OutputResults: KernelModuleCount = 227      &lt;br /&gt;Percentage in the following table is based on the Total Hits for the Kernel &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Time&amp;#160;&amp;#160; 62240 hits, 25000 events per hit --------      &lt;br /&gt;Module&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hits&amp;#160;&amp;#160; msec&amp;#160; %Total&amp;#160; Events/Sec       &lt;br /&gt;ntkrnlpa&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 40159&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160; 64 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5520137       &lt;br /&gt;hal&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 10990&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160; 17 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1510652       &lt;br /&gt;igxpmp32&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2381&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 327285       &lt;br /&gt;HECI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2170&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 298281       &lt;br /&gt;win32k&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1495&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 205498       &lt;br /&gt;intelppm&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1335&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 183505       &lt;br /&gt;mfehidk&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 931&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 127972       &lt;br /&gt;HIPK&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 660&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 90721       &lt;br /&gt;Ntfs&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 361&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 49621       &lt;br /&gt;usbuhci&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 285&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 39175       &lt;br /&gt;PGPwded&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 223&amp;#160;&amp;#160;&amp;#160;&amp;#160; 181875&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 30652&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;……&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;================================= END OF RUN ==================================      &lt;br /&gt;============================== NORMAL END OF RUN ==============================&lt;/font&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;2.3 KernRate detailed profiling on individual modules&lt;/h3&gt;  &lt;p&gt;So what I’m seeing is (like many other folks on the ‘Net) that the NTKRNLPA module is consuming the lions’ share of the CPU (being consumed by Kernel-space threads).&amp;#160; Following &lt;a href="http://forum.sysinternals.com/forum_posts.asp?TID=14768"&gt;some&lt;/a&gt; of the threads on the Sysinternals message boards, I dug into the details of what images were being loaded by NTKRNLPA during these kernel events:&lt;/p&gt;  &lt;h4&gt;2.3.1 NTKRNLPA&lt;/h4&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;C:\Program Files\KrView\Kernrates&amp;gt;Kernrate_i386_XP.exe -s 5 -z ntkrnlpa      &lt;br /&gt;/==============================\       &lt;br /&gt;&amp;lt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; KERNRATE LOG&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;gt;       &lt;br /&gt;\==============================/       &lt;br /&gt;Date: 2009/06/10&amp;#160;&amp;#160; Time:&amp;#160; 8:49:42       &lt;br /&gt;Machine Name: MIKESL-MOBL1       &lt;br /&gt;Number of Processors: 2       &lt;br /&gt;PROCESSOR_ARCHITECTURE: x86       &lt;br /&gt;PROCESSOR_LEVEL: 6       &lt;br /&gt;PROCESSOR_REVISION: 0f0b       &lt;br /&gt;Physical Memory: 2007 MB       &lt;br /&gt;Pagefile Total: 3856 MB       &lt;br /&gt;Virtual Total: 2047 MB       &lt;br /&gt;PageFile1: \??\C:\pagefile.sys, 2006MB       &lt;br /&gt;OS Version: 5.1 Build 2600 Service-Pack: 3.0       &lt;br /&gt;WinDir: C:\WINDOWS &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernrate User-Specified Command Line:      &lt;br /&gt;Kernrate_i386_XP.exe -s 5 -z ntkrnlpa &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernel Profile (PID = 0): Source= Time,      &lt;br /&gt;Using Kernrate Default Rate of 25000 events/hit       &lt;br /&gt;CallBack: Finished Attempt to Load symbols for 804d7000 \WINDOWS\system32\ntkrnlpa.exe &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Starting to collect profile data &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Will collect profile data for 5 seconds      &lt;br /&gt;===&amp;gt; Finished Collecting Data, Starting to Process Results &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;------------Overall Summary:-------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P0&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:00:01.984 (39.7%)&amp;#160; U 0:00:00.406 ( 8.1%)&amp;#160; I 0:00:02.609 (52.2%)&amp;#160; DPC      &lt;br /&gt;0:00:00.031 ( 0.6%)&amp;#160; Interrupt 0:00:01.421 (28.4%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 97650, Interrupt Rate= 19530/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P1&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:00:02.125 (42.5%)&amp;#160; U 0:00:00.453 ( 9.1%)&amp;#160; I 0:00:02.421 (48.4%)&amp;#160; DPC      &lt;br /&gt;0:00:00.062 ( 1.3%)&amp;#160; Interrupt 0:00:01.406 (28.1%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 95410, Interrupt Rate= 19082/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;TOTAL&amp;#160; K 0:00:04.109 (41.1%)&amp;#160; U 0:00:00.859 ( 8.6%)&amp;#160; I 0:00:05.031 (50.3%)&amp;#160; DPC      &lt;br /&gt;0:00:00.093 ( 0.9%)&amp;#160; Interrupt 0:00:02.828 (28.3%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total Interrupts= 193060, Total Interrupt Rate= 38612/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Total Profile Time = 5000 msec &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStart&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStop&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Byt      &lt;br /&gt;esDiff.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Physical Memory&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 563130368,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 560410624,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -2719       &lt;br /&gt;744       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Pagefile(s)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2230300672,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2226749440,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -3551       &lt;br /&gt;232       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Virtual&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2132402176,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2104180736,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -28221       &lt;br /&gt;440       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Extended Virtual&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,       &lt;br /&gt;&amp;#160; 0 &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Avg. Rate      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Context Switches&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 73005,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 14601/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System Calls&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 214633,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 42927/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Page Faults&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3814,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 763/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Operations&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1175,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 235/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 433,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 87/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4569,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 914/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 776604,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 661/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 129278,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 299/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 575190,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 126/ I/O &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;-----------------------------      &lt;br /&gt;&lt;/font&gt;&lt;font face="Terminal"&gt;Results for Kernel Mode:      &lt;br /&gt;----------------------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;OutputResults: KernelModuleCount = 227      &lt;br /&gt;Percentage in the following table is based on the Total Hits for the Kernel &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Time&amp;#160;&amp;#160; 1762 hits, 25000 events per hit --------      &lt;br /&gt;Module&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hits&amp;#160;&amp;#160; msec&amp;#160; %Total&amp;#160; Events/Sec       &lt;br /&gt;ntkrnlpa&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1307&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160; 74 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 6555979       &lt;br /&gt;hal&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 246&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160; 13 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1233948       &lt;br /&gt;HECI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 44&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 220706       &lt;br /&gt;igxpmp32&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 38&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 190609       &lt;br /&gt;intelppm&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 36&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 180577       &lt;br /&gt;win32k&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 33&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 165000       &lt;br /&gt;mfehidk&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 15&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 75000       &lt;br /&gt;HIPK&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 12&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 60000       &lt;br /&gt;……&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;===&amp;gt; Processing Zoomed Module ntkrnlpa.exe... &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;----- Zoomed module ntkrnlpa.exe (Bucket size = 16 bytes, Rounding Down) -------      &lt;br /&gt;-       &lt;br /&gt;Percentage in the following table is based on the Total Hits for this Zoom Module &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Time&amp;#160;&amp;#160; 1307 hits, 25000 events per hit --------      &lt;br /&gt;Module&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hits&amp;#160;&amp;#160; msec&amp;#160; %Total&amp;#160; Events/Sec       &lt;br /&gt;KiDispatchInterrupt&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 787&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160; 46 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3947632       &lt;br /&gt;READ_REGISTER_USHORT&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 383&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160; 22 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1921147       &lt;br /&gt;READ_REGISTER_ULONG&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 342&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160; 20 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1715489       &lt;br /&gt;READ_REGISTER_UCHAR&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 41&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 205658       &lt;br /&gt;KeReleaseInStackQueuedSpinLockFromDpcLevel&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 13&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 65208       &lt;br /&gt;ZwYieldExecution&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 10&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4984&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 50160       &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;…… &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;================================= END OF RUN ==================================      &lt;br /&gt;============================== NORMAL END OF RUN ==============================&lt;/font&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;2.3.2 HAL&lt;/h4&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;C:\Program Files\KrView\Kernrates&amp;gt;Kernrate_i386_XP.exe -v -s 5 -z hal      &lt;br /&gt;/==============================\       &lt;br /&gt;&amp;lt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; KERNRATE LOG&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;gt;       &lt;br /&gt;\==============================/       &lt;br /&gt;Date: 2009/06/10&amp;#160;&amp;#160; Time: 18:25:00       &lt;br /&gt;Machine Name: MIKESL-MOBL1       &lt;br /&gt;Number of Processors: 2       &lt;br /&gt;PROCESSOR_ARCHITECTURE: x86       &lt;br /&gt;PROCESSOR_LEVEL: 6       &lt;br /&gt;PROCESSOR_REVISION: 0f0b       &lt;br /&gt;Physical Memory: 2007 MB       &lt;br /&gt;Pagefile Total: 3856 MB       &lt;br /&gt;Virtual Total: 2047 MB       &lt;br /&gt;PageFile1: \??\C:\pagefile.sys, 2006MB       &lt;br /&gt;OS Version: 5.1 Build 2600 Service-Pack: 3.0       &lt;br /&gt;WinDir: C:\WINDOWS &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernrate User-Specified Command Line:      &lt;br /&gt;Kernrate_i386_XP.exe -v -s 5 -z hal &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;KERNRATE: current IMAGEHLP SymOptions: UNDNAME DEBUG&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernel Profile (PID = 0): Source= Time,      &lt;br /&gt;Using Kernrate Default Rate of 25000 events/hit       &lt;br /&gt;KERNRATE: IMAGEHLP symbol search path is: .;symsrv*symsrv.dll*c:\symbols*&lt;/font&gt;&lt;a href="http://="&gt;&lt;font face="Terminal"&gt;http://&lt;/font&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font face="Terminal"&gt;msdl.microsoft.com/download/symbols;C:\WINDOWS\System32\Drivers;C:\WINDOWS\System32;C:\WINDOWS      &lt;br /&gt;CallBack: Loading symbols for hal.dll...       &lt;br /&gt;DBGHELP: No header for hal.dll.&amp;#160; Searching for image on disk       &lt;br /&gt;DBGHELP: C:\Program Files\KrView\Kernrates\hal.dll - file not found       &lt;br /&gt;DBGHELP: hal.dll not found in .       &lt;br /&gt;DBGHELP: hal.dll not found in C:\WINDOWS\System32\Drivers       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\hal.dll - OK       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\hal.dll found       &lt;br /&gt;DBGHELP: .\halmacpi.pdb - file not found       &lt;br /&gt;DBGHELP: .\dll\halmacpi.pdb - file not found       &lt;br /&gt;DBGHELP: .\symbols\dll\halmacpi.pdb - file not found       &lt;br /&gt;CallBack: Finished Attempt to Load symbols for 806e4000 \WINDOWS\system32\hal.dll &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;DBGHELP: hal - public symbols      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c:\symbols\halmacpi.pdb\9875FD697ECA4BBB8A475825F6BF885E1\halmacpi.pdb       &lt;br /&gt;Starting to collect profile data &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Will collect profile data for 5 seconds      &lt;br /&gt;===&amp;gt; Finished Collecting Data, Starting to Process Results &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;------------Overall Summary:-------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P0&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:00:02.531 (50.6%)&amp;#160; U 0:00:00.453 ( 9.1%)&amp;#160; I 0:00:02.015 (40.3%)&amp;#160; DPC      &lt;br /&gt;0:00:00.000 ( 0.0%)&amp;#160; Interrupt 0:00:01.890 (37.8%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 119072, Interrupt Rate= 23814/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P1&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:00:02.609 (52.2%)&amp;#160; U 0:00:00.656 (13.1%)&amp;#160; I 0:00:01.734 (34.7%)&amp;#160; DPC      &lt;br /&gt;0:00:00.031 ( 0.6%)&amp;#160; Interrupt 0:00:01.437 (28.7%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 114272, Interrupt Rate= 22854/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;TOTAL&amp;#160; K 0:00:05.140 (51.4%)&amp;#160; U 0:00:01.109 (11.1%)&amp;#160; I 0:00:03.750 (37.5%)&amp;#160; DPC      &lt;br /&gt;0:00:00.031 ( 0.3%)&amp;#160; Interrupt 0:00:03.328 (33.3%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total Interrupts= 233344, Total Interrupt Rate= 46669/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Total Profile Time = 5000 msec &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStart&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStop&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Byt      &lt;br /&gt;esDiff.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Physical Memory&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 111005696,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 117772288,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 6766       &lt;br /&gt;592       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Pagefile(s)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1635250176,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1639911424,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4661       &lt;br /&gt;248       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Virtual&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2132402176,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2131013632,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -1388       &lt;br /&gt;544       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Extended Virtual&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,       &lt;br /&gt;&amp;#160; 0 &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Avg. Rate      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Context Switches&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 82262,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 16452/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System Calls&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 292287,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 58457/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Page Faults&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 6431,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1286/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Operations&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1592,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 318/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 506,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 101/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 7687,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1537/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 344208,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 216/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 457023,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 903/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 951393,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 124/ I/O &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;----------------------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Results for Kernel Mode:      &lt;br /&gt;----------------------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;OutputResults: KernelModuleCount = 227      &lt;br /&gt;Percentage in the following table is based on the Total Hits for the Kernel &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Time&amp;#160;&amp;#160; 1761 hits, 25000 events per hit --------      &lt;br /&gt;Module&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hits&amp;#160;&amp;#160; msec&amp;#160; %Total&amp;#160; Events/Sec       &lt;br /&gt;ntkrnlpa&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1223&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160; 69 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 6115000       &lt;br /&gt;hal&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 258&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160; 14 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1290000       &lt;br /&gt;intelppm&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 74&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 370000       &lt;br /&gt;HECI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 55&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 275000       &lt;br /&gt;win32k&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 32&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 160000       &lt;br /&gt;igxpmp32&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 29&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 145000       &lt;br /&gt;HIPK&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 22&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 110000       &lt;br /&gt;mfehidk&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 15&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 75000       &lt;br /&gt;&lt;font face="Terminal"&gt;…… &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;===&amp;gt; Processing Zoomed Module hal.dll... &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;----- Zoomed module hal.dll (Bucket size = 16 bytes, Rounding Down) --------      &lt;br /&gt;Percentage in the following table is based on the Total Hits for this Zoom Module &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Time&amp;#160;&amp;#160; 258 hits, 25000 events per hit --------      &lt;br /&gt;Module&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hits&amp;#160;&amp;#160; msec&amp;#160; %Total&amp;#160; Events/Sec       &lt;br /&gt;READ_PORT_UCHAR&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 143&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160; 25 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 715000       &lt;br /&gt;READ_PORT_ULONG&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 139&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160; 24 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 695000       &lt;br /&gt;READ_PORT_USHORT&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 139&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160; 24 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 695000       &lt;br /&gt;HalpQueryPerformanceCounter&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 24&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 120000       &lt;br /&gt;KeReleaseQueuedSpinLock&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 21&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 105000       &lt;br /&gt;KeAcquireInStackQueuedSpinLock&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 21&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 105000       &lt;br /&gt;KfLowerIrql&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 8&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 40000       &lt;br /&gt;ExAcquireFastMutex&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 7&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 35000       &lt;br /&gt;KeGetCurrentIrql&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 7&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 35000       &lt;br /&gt;HalpGetCmosCenturyByte&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 7&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 35000       &lt;br /&gt;HalpReleaseSystemHardwareSpinLock&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 7&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 35000       &lt;br /&gt;HalBeginSystemInterrupt&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 6&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 30000       &lt;br /&gt;KeAcquireQueuedSpinLock&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 25000       &lt;br /&gt;&lt;font face="Terminal"&gt;…… &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;================================= END OF RUN ==================================      &lt;br /&gt;============================== NORMAL END OF RUN ==============================&lt;/font&gt; &lt;font face="Terminal"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;2.3.3 IGXPMP32&lt;/h4&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;C:\Program Files\KrView\Kernrates&amp;gt;Kernrate_i386_XP.exe -v -s 5 -z igxpmp32      &lt;br /&gt;/==============================\       &lt;br /&gt;&amp;lt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; KERNRATE LOG&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;gt;       &lt;br /&gt;\==============================/       &lt;br /&gt;Date: 2009/06/10&amp;#160;&amp;#160; Time: 18:25:11       &lt;br /&gt;Machine Name: MIKESL-MOBL1       &lt;br /&gt;Number of Processors: 2       &lt;br /&gt;PROCESSOR_ARCHITECTURE: x86       &lt;br /&gt;PROCESSOR_LEVEL: 6       &lt;br /&gt;PROCESSOR_REVISION: 0f0b       &lt;br /&gt;Physical Memory: 2007 MB       &lt;br /&gt;Pagefile Total: 3856 MB       &lt;br /&gt;Virtual Total: 2047 MB       &lt;br /&gt;PageFile1: \??\C:\pagefile.sys, 2006MB       &lt;br /&gt;OS Version: 5.1 Build 2600 Service-Pack: 3.0       &lt;br /&gt;WinDir: C:\WINDOWS &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernrate User-Specified Command Line:      &lt;br /&gt;Kernrate_i386_XP.exe -v -s 5 -z igxpmp32 &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;KERNRATE: current IMAGEHLP SymOptions: UNDNAME DEBUG &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernel Profile (PID = 0): Source= Time,      &lt;br /&gt;Using Kernrate Default Rate of 25000 events/hit       &lt;br /&gt;KERNRATE: IMAGEHLP symbol search path is: .;symsrv*symsrv.dll*c:\symbols*&lt;/font&gt;&lt;a href="http://&amp;lt;br&amp;gt;"&gt;&lt;font face="Terminal"&gt;&amp;quot;&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;gt;http://        &lt;br /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font face="Terminal"&gt;msdl.microsoft.com/download/symbols;C:\WINDOWS\System32\Drivers;C:\WINDOWS\System32;C:\WINDOWS      &lt;br /&gt;CallBack: Loading symbols for igxpmp32.sys...       &lt;br /&gt;DBGHELP: No header for igxpmp32.sys.&amp;#160; Searching for image on disk       &lt;br /&gt;DBGHELP: C:\Program Files\KrView\Kernrates\igxpmp32.sys - file not found       &lt;br /&gt;DBGHELP: igxpmp32.sys not found in .       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\igxpmp32.sys - OK       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\igxpmp32.sys found       &lt;br /&gt;DBGHELP: .\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: .\sys\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: .\symbols\sys\igxpmp32.pdb - file not found       &lt;br /&gt;SYMSRV:&amp;#160; The server name or address could not be resolved       &lt;br /&gt;SYMSRV:&amp;#160; The server name or address could not be resolved       &lt;br /&gt;SYMSRV:&amp;#160; c:\symbols\igxpmp32.pdb\01C98FF4DD054B6AB11509CF9CF04F171\igxpmp32.pdb       &lt;br /&gt;not found       &lt;br /&gt;SYMSRV:&amp;#160; &lt;/font&gt;&lt;a href="http://msdl.microsoft.com/download/symbols/igxpmp32.pdb/01C98FF4DD054B6"&gt;&lt;font face="Terminal"&gt;http://msdl.microsoft.com/download/symbols/igxpmp32.pdb/01C98FF4DD054B6&lt;/font&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font face="Terminal"&gt;AB11509CF9CF04F171/igxpmp32.pdb not found      &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\sys\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\symbols\sys\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\sys\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\symbols\sys\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\sys\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\symbols\sys\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\igxpmp32.pdb - file not found       &lt;br /&gt;DBGHELP: D:\ccViews\autobuild1_BR-0810-1787_14.36_Snapshot\gfx_Development\dump3       &lt;br /&gt;2\igfx\xp\gtune\AIM3Lib\igxpmp32.pdb - file not found       &lt;br /&gt;CallBack: Finished Attempt to Load symbols for b942f000 \SystemRoot\system32\DRI       &lt;br /&gt;VERS\igxpmp32.sys &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;DBGHELP: igxpmp32 - export symbols      &lt;br /&gt;Starting to collect profile data &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Will collect profile data for 5 seconds      &lt;br /&gt;===&amp;gt; Finished Collecting Data, Starting to Process Results &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;------------Overall Summary:-------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P0&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:00:02.812 (56.1%)&amp;#160; U 0:00:00.265 ( 5.3%)&amp;#160; I 0:00:01.937 (38.6%)&amp;#160; DPC      &lt;br /&gt;0:00:00.000 ( 0.0%)&amp;#160; Interrupt 0:00:01.812 (36.1%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 114753, Interrupt Rate= 22879/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P1&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:00:02.937 (58.8%)&amp;#160; U 0:00:00.562 (11.3%)&amp;#160; I 0:00:01.500 (30.0%)&amp;#160; DPC      &lt;br /&gt;0:00:00.062 ( 1.3%)&amp;#160; Interrupt 0:00:01.578 (31.6%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 109952, Interrupt Rate= 21990/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;TOTAL&amp;#160; K 0:00:05.750 (57.4%)&amp;#160; U 0:00:00.828 ( 8.3%)&amp;#160; I 0:00:03.437 (34.3%)&amp;#160; DPC      &lt;br /&gt;0:00:00.062 ( 0.6%)&amp;#160; Interrupt 0:00:03.390 (33.9%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total Interrupts= 224705, Total Interrupt Rate= 44941/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Total Profile Time = 5000 msec &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStart&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStop&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Byt      &lt;br /&gt;esDiff.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Physical Memory&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 119107584,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 107962368,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -11145       &lt;br /&gt;216       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Pagefile(s)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1640800256,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1629646848,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -11153       &lt;br /&gt;408       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Virtual&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2132402176,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2102800384,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -29601       &lt;br /&gt;792       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Extended Virtual&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,       &lt;br /&gt;&amp;#160; 0 &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Avg. Rate      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Context Switches&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 78959,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 15792/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System Calls&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 301466,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 60293/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Page Faults&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 8704,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1741/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Operations&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 711,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 142/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 197,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 39/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5430,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1086/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1212541,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1705/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 14701,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 75/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1486190,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 274/ I/O &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;----------------------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Results for Kernel Mode:      &lt;br /&gt;----------------------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;OutputResults: KernelModuleCount = 227      &lt;br /&gt;Percentage in the following table is based on the Total Hits for the Kernel &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Time&amp;#160;&amp;#160; 1764 hits, 25000 events per hit --------      &lt;br /&gt;Module&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hits&amp;#160;&amp;#160; msec&amp;#160; %Total&amp;#160; Events/Sec       &lt;br /&gt;ntkrnlpa&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1232&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160; 69 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 6160000       &lt;br /&gt;hal&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 235&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160; 13 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1175000       &lt;br /&gt;intelppm&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 93&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5015&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 463609       &lt;br /&gt;HECI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 42&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5015&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 209371       &lt;br /&gt;win32k&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 34&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 170000       &lt;br /&gt;igxpmp32&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 32&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5015&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 159521       &lt;br /&gt;mfehidk&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 23&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 115000       &lt;br /&gt;HIPK&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 21&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 105000       &lt;br /&gt;kmixer&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 11&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 55000       &lt;br /&gt;KSecDD&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 10&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5015&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 49850       &lt;br /&gt;&lt;font face="Terminal"&gt;…… &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;===&amp;gt; Processing Zoomed Module igxpmp32.sys... &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;----- Zoomed module igxpmp32.sys (Bucket size = 16 bytes, Rounding Down) -------      &lt;br /&gt;-       &lt;br /&gt;Percentage in the following table is based on the Total Hits for this Zoom Module &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Time&amp;#160;&amp;#160; 32 hits, 25000 events per hit --------      &lt;br /&gt;Module&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hits&amp;#160;&amp;#160; msec&amp;#160; %Total&amp;#160; Events/Sec       &lt;br /&gt;xc_copp_agent&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 30&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5015&amp;#160;&amp;#160;&amp;#160; 100 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 149551 &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;================================= END OF RUN ==================================      &lt;br /&gt;============================== NORMAL END OF RUN ==============================&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;2.3.4 HECI&lt;/h4&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;C:\Program Files\KrView\Kernrates&amp;gt;Kernrate_i386_XP.exe -v -s 5 -z heci      &lt;br /&gt;/==============================\       &lt;br /&gt;&amp;lt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; KERNRATE LOG&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;gt;       &lt;br /&gt;\==============================/       &lt;br /&gt;Date: 2009/06/10&amp;#160;&amp;#160; Time: 18:48:17       &lt;br /&gt;Machine Name: MIKESL-MOBL1       &lt;br /&gt;Number of Processors: 2       &lt;br /&gt;PROCESSOR_ARCHITECTURE: x86       &lt;br /&gt;PROCESSOR_LEVEL: 6       &lt;br /&gt;PROCESSOR_REVISION: 0f0b       &lt;br /&gt;Physical Memory: 2007 MB       &lt;br /&gt;Pagefile Total: 3856 MB       &lt;br /&gt;Virtual Total: 2047 MB       &lt;br /&gt;PageFile1: \??\C:\pagefile.sys, 2006MB       &lt;br /&gt;OS Version: 5.1 Build 2600 Service-Pack: 3.0       &lt;br /&gt;WinDir: C:\WINDOWS &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernrate User-Specified Command Line:      &lt;br /&gt;Kernrate_i386_XP.exe -v -s 5 -z heci &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;KERNRATE: current IMAGEHLP SymOptions: UNDNAME DEBUG &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Kernel Profile (PID = 0): Source= Time,      &lt;br /&gt;Using Kernrate Default Rate of 25000 events/hit       &lt;br /&gt;KERNRATE: IMAGEHLP symbol search path is: .;symsrv*symsrv.dll*c:\symbols*&lt;/font&gt;&lt;a href="http://&amp;lt;br&amp;gt;"&gt;&lt;font face="Terminal"&gt;&amp;quot;&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;gt;http://        &lt;br /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font face="Terminal"&gt;msdl.microsoft.com/download/symbols;C:\WINDOWS\System32\Drivers;C:\WINDOWS\System32;C:\WINDOWS      &lt;br /&gt;CallBack: Loading symbols for HECI.sys...       &lt;br /&gt;DBGHELP: No header for HECI.sys.&amp;#160; Searching for image on disk       &lt;br /&gt;DBGHELP: C:\Program Files\KrView\Kernrates\HECI.sys - file not found       &lt;br /&gt;DBGHELP: HECI.sys not found in .       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\HECI.sys - OK       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\HECI.sys found       &lt;br /&gt;DBGHELP: .\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: .\sys\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: .\symbols\sys\HECI.pdb - file not found       &lt;br /&gt;SYMSRV:&amp;#160; The server name or address could not be resolved       &lt;br /&gt;SYMSRV:&amp;#160; The server name or address could not be resolved       &lt;br /&gt;SYMSRV:&amp;#160; c:\symbols\HECI.pdb\0A57FC20FA904FB8BAEC77C53EE39C821\HECI.pdb not found       &lt;br /&gt;SYMSRV:&amp;#160; &lt;/font&gt;&lt;a href="http://msdl.microsoft.com/download/symbols/HECI.pdb/0A57FC20FA904FB8BAE"&gt;&lt;font face="Terminal"&gt;http://msdl.microsoft.com/download/symbols/HECI.pdb/0A57FC20FA904FB8BAE&lt;/font&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font face="Terminal"&gt;C77C53EE39C821/HECI.pdb not found      &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\sys\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\symbols\sys\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\sys\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\symbols\sys\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\sys\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\symbols\sys\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: C:\WINDOWS\System32\Drivers\HECI.pdb - file not found       &lt;br /&gt;DBGHELP: d:\ccviews\autobuild1_br-0707-1049_2.6_snapshot\amt_development\sw\src\       &lt;br /&gt;drivers\heci\driver\objfre_wxp_x86\i386\HECI.pdb - file not found       &lt;br /&gt;CallBack: Finished Attempt to Load symbols for ba308000 \SystemRoot\system32\DRI       &lt;br /&gt;VERS\HECI.sys &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;DBGHELP: HECI - no symbols loaded      &lt;br /&gt;Starting to collect profile data &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Will collect profile data for 5 seconds      &lt;br /&gt;===&amp;gt; Finished Collecting Data, Starting to Process Results &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;------------Overall Summary:-------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P0&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:00:02.296 (45.9%)&amp;#160; U 0:00:00.343 ( 6.9%)&amp;#160; I 0:00:02.359 (47.2%)&amp;#160; DPC      &lt;br /&gt;0:00:00.000 ( 0.0%)&amp;#160; Interrupt 0:00:01.359 (27.2%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 115350, Interrupt Rate= 23070/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;P1&amp;#160;&amp;#160;&amp;#160;&amp;#160; K 0:00:02.203 (44.1%)&amp;#160; U 0:00:00.531 (10.6%)&amp;#160; I 0:00:02.265 (45.3%)&amp;#160; DPC      &lt;br /&gt;0:00:00.015 ( 0.3%)&amp;#160; Interrupt 0:00:01.093 (21.9%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Interrupts= 110550, Interrupt Rate= 22110/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;TOTAL&amp;#160; K 0:00:04.500 (45.0%)&amp;#160; U 0:00:00.875 ( 8.8%)&amp;#160; I 0:00:04.625 (46.3%)&amp;#160; DPC      &lt;br /&gt;0:00:00.015 ( 0.2%)&amp;#160; Interrupt 0:00:02.453 (24.5%)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total Interrupts= 225900, Total Interrupt Rate= 45180/sec. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Total Profile Time = 5000 msec &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStart&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BytesStop&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Byt      &lt;br /&gt;esDiff.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Physical Memory&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 116039680,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 114077696,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -1961       &lt;br /&gt;984       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Pagefile(s)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1642790912,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1640251392,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -2539       &lt;br /&gt;520       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Virtual&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2132402176,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2105364480,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; -27037       &lt;br /&gt;696       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Available Extended Virtual&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0,       &lt;br /&gt;&amp;#160; 0 &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Total&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Avg. Rate      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Context Switches&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 91187,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 18237/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; System Calls&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 270278,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 54056/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Page Faults&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 6482,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1296/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Operations&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 269,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 54/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 41,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 8/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Operations ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5361,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1072/sec.       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Read Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1551742,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5769/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Write Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2836,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 69/ I/O       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; I/O Other Bytes&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2381876,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 444/ I/O &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;-----------------------------      &lt;br /&gt;&lt;/font&gt;&lt;font face="Terminal"&gt;Results for Kernel Mode:      &lt;br /&gt;----------------------------- &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;OutputResults: KernelModuleCount = 227      &lt;br /&gt;Percentage in the following table is based on the Total Hits for the Kernel &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Time&amp;#160;&amp;#160; 1754 hits, 25000 events per hit --------      &lt;br /&gt;Module&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Hits&amp;#160;&amp;#160; msec&amp;#160; %Total&amp;#160; Events/Sec       &lt;br /&gt;ntkrnlpa&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1273&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160; 72 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 6365000       &lt;br /&gt;hal&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 222&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160; 12 %&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1110000       &lt;br /&gt;intelppm&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 70&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 350000       &lt;br /&gt;HECI&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 47&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 235000       &lt;br /&gt;igxpmp32&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 34&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 170000       &lt;br /&gt;win32k&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 30&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 150000       &lt;br /&gt;mfehidk&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 14&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 70000       &lt;br /&gt;HIPK&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 12&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 60000       &lt;br /&gt;KSecDD&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 12&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 5000&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 %&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 60000       &lt;br /&gt;……&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;===&amp;gt; Processing Zoomed Module HECI.sys... &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Terminal"&gt;Symbol Enumeration failed (or no symbols found) on module HECI in CreateZoomedModuleList, Error Code= 0x000001e7      &lt;br /&gt;No Hits or No symbols found for module HECI.sys       &lt;br /&gt;================================= END OF RUN ==================================       &lt;br /&gt;============================== NORMAL END OF RUN ==============================&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Step 3: Analysis &amp;amp; Research&lt;/h3&gt;  &lt;p&gt;In my case, it appears that there’s some process (or processes) that’s calling the &lt;a href="http://msdn.microsoft.com/library/aa814462.aspx"&gt;RtlIpv6StringToAddressA&lt;/a&gt; kernel API an excessive number of times.&amp;#160; From &lt;font color="#ff0000"&gt;&lt;font color="#000000"&gt;what I’ve &lt;a href="http://forum.sysinternals.com/forum_posts.asp?TID=19138"&gt;seen&lt;/a&gt;&lt;/font&gt; in my research&lt;/font&gt;, not only is this a common complaint, but it’s been reported by at &lt;a href="http://forum.sysinternals.com/forum_posts.asp?TID=19138"&gt;least&lt;/a&gt; &lt;font color="#ff0000"&gt;two other T61 users &lt;/font&gt;in the last year or so – without any definitive solution.&lt;/p&gt;  &lt;p&gt;And what’s this RtlIpv6StringToAddressA API do exactly?&amp;#160; Well, it translates a string form of an IPv6 address to a more strongly-typed form of the address.&amp;#160; Here’s what I know (and what I don’t) about IPv6 in my T61 and Windows XP SP3:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The “teredo” driver hasn’t been installed in Windows XP SP3 (“teredo” is the code name used by the Microsoft Windows team that developed the IPv6 stack) &lt;/li&gt;    &lt;li&gt;There are a number of third-party packages on my system, but the newest to have been introduced are:      &lt;ul&gt;       &lt;li&gt;the AMT 2.6-supporting software and driver (v “2.6.30.1014 built by: WinDDK”, driver date 7/12/2007) &lt;/li&gt;        &lt;li&gt;the PGP whole disk encryption package &lt;/li&gt;        &lt;li&gt;the Intel 4965AGN wireless driver (v12.4.0.21), installed earlier &lt;/li&gt;        &lt;li&gt;the Intel PROSet/Wireless Wifi Software (v12.1.1.0), installed earlier &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Knowing that AMT is meant to provide a remote networking interface to Intel chipset functionality, and knowing that this problem didn’t occur before the AMT &amp;amp; PGP installs took place, my primary suspect (as the source of these excessive IPv6-related API calls) becomes the AMT software. &lt;/li&gt;    &lt;li&gt;However, I consulted with colleagues on my team that are intimately familiar with the internals of HECI.sys, and they have confirmed that it doesn’t call the RtlIpv6StringToAddressA() Win32 API &lt;/li&gt;    &lt;li&gt;That prompted me to search the strings embedded in all the drivers and libraries I could find in C:\Windows\System32.&amp;#160; Here were the files where FINDSTR.EXE could find that API call:      &lt;ul&gt;       &lt;li&gt;dnsapi.dll &lt;/li&gt;        &lt;li&gt;mswsock.dll &lt;/li&gt;        &lt;li&gt;ntdll.dll &lt;/li&gt;        &lt;li&gt;ntkrnlpa.exe &lt;/li&gt;        &lt;li&gt;ntoskrnl.exe &lt;/li&gt;        &lt;li&gt;Drivers\http.sys &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Disabled the following Devices (which didn’t help):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ricoh Memory Stick Controller &lt;/li&gt;    &lt;li&gt;Ricoh SD/MMC Host Controller &lt;/li&gt;    &lt;li&gt;Ricoh xD-Picture Card Controller &lt;/li&gt;    &lt;li&gt;OHCI Compliant IEEE 1394 Host Controller &lt;/li&gt;    &lt;li&gt;ThinkPad Modem &lt;/li&gt;    &lt;li&gt;Ricoh R/RL/5C476(II) or Compatible CardBus Controller &lt;/li&gt;    &lt;li&gt;SDA Standard Compliant SD Host Controller &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Downloaded and installed the following driver updates:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;bluetooth v5.5.09.6400 &lt;/li&gt;    &lt;li&gt;Ultranav v11.1.21.2 &lt;/li&gt;    &lt;li&gt;Power Manager v1.60 &lt;/li&gt;    &lt;li&gt;ACPI Power Management v1.53 &lt;/li&gt;    &lt;li&gt;Integrated camera v5.8.49004.0 &lt;/li&gt;    &lt;li&gt;Hotkey driver v2.20.0001 &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Step 4: Make sure you try later and earlier driver versions&lt;/h3&gt;  &lt;p&gt;Bottom line: I replaced the network driver on my system with one that appeared *months* after I started down this road, and I finally stopped seeing these CPU spews occur.&lt;/p&gt;  &lt;p&gt;I was lucky – the vendor dropped a new driver version that happened to resolve this error.&amp;#160; Until that point, I was stuck – nothing I could do to my OS to resolve it.&lt;/p&gt;  &lt;p&gt;And if your vendor hasn’t released a *later* driver that eliminates the issue, I’ll recommend something radical – try an *earlier* version of the driver (e.g. like &lt;a href="http://forums.lenovo.com/t5/T61-and-prior-T-series-ThinkPad/T61-Problems-with-Hardware-Interrupts-when-on-battery/m-p/128342#M35420"&gt;these folks here&lt;/a&gt;).&amp;#160; Sometimes programmers introduce errors that didn’t exist in previous versions of their code, even if they didn’t intend to affect such a broad issue.&amp;#160; (Especially when they didn’t intend to.)&amp;#160; You might find a 6-, 12- or 24-month-old driver that still works well enough (for the time being) and doesn’t exhibit the performance drag you’re seeing.&amp;#160; What’s worse – an older driver that works but doesn’t have the latest features, or a driver that has the features but also craters your system performance?&lt;/p&gt;  &lt;p&gt;Last resort: you may find that disabling the device in the OS will finally shut up a misbehaving driver (i.e. that the driver won’t load, so it won’t spawn all these excessive interrupts).&amp;#160; This isn’t a great long-term solution, and it’s only viable for hardware you don’t need to use (e.g. a &lt;a href="http://forums.lenovo.com/t5/X-Series-ThinkPad-Laptops/x200-Hardware-Interrupts-constantly-at-40-of-CPU-resources/m-p/181625#M12621"&gt;biometric device such as fingerprint reader&lt;/a&gt;), but it’s one last thing to consider before junking your whole system.&lt;/p&gt;  &lt;h2&gt;Notes: related articles&lt;/h2&gt;  &lt;h3&gt;Sysinternals Forums&lt;/h3&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://forum.sysinternals.com/forum_posts.asp?TID=11043&amp;amp;PN=2"&gt;Hardware interrupts using excessive CPU&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://forum.sysinternals.com/forum_posts.asp?TID=19138"&gt;Kernrate trace + RtlIpv6StringToAddressA (?)&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;Lenovo Forums&lt;/h3&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://forums.lenovo.com/t5/X-Series-ThinkPad-Laptops/x200-Hardware-Interrupts-constantly-at-40-of-CPU-resources/td-p/98869"&gt;x200 Hardware Interrupts constantly at 40% of CPU resources&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://forums.lenovo.com/t5/X-Series-ThinkPad-Laptops/X200-hardware-interrupts-causes-cpu-load/m-p/146575"&gt;X200: hardware interrupts causes cpu load?&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://forums.lenovo.com/t5/T61-and-prior-T-series-ThinkPad/T61-Problems-with-Hardware-Interrupts-when-on-battery/td-p/94148"&gt;T61: Problems with Hardware Interrupts when on battery&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://forums.lenovo.com/t5/IdeaPad-S-series-Netbooks/Problem-on-S12-with-flood-of-interrupts-from-Broadcom-wireless-G/m-p/153970"&gt;Problem on S12 with flood of interrupts from Broadcom wireless-G after Windows resume&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-5851738507874438813?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/5851738507874438813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=5851738507874438813' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5851738507874438813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5851738507874438813'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2010/02/lenovo-t61-high-cpu-usage-look-for-bad.html' title='Lenovo T61? High CPU usage? Look for bad drivers (…spewing hardware interrupts)'/><author><name>Mike Lonergan</name><uri>https://profiles.google.com/104259560417082707882</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-qs5m4nW4V_k/AAAAAAAAAAI/AAAAAAAAAQM/WE28i54azh0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_rwORjiC6Rv4/S3oGYFga41I/AAAAAAAAABw/vhUGffESMBg/s72-c/notificationArea_thumb2.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-4396383206716095723</id><published>2009-10-17T21:54:00.001-07:00</published><updated>2009-10-17T21:54:19.305-07:00</updated><title type='text'>My Mac Mini HTPC saga: TV tuners</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;Do I really *need* a tuner?&lt;/h2&gt;  &lt;p&gt;One of the major hang-ups I had – in making the switch from Windows Media Center to a Mac Mini – was worrying whether I’d be able to plug in enough TV tuners into the Mac Mini to be able to record all the TV I usually watch.&lt;/p&gt;  &lt;p&gt;However, after having been *without* an HTPC for almost a year, it’s amazing how little I feel like I *must* get record whatever current-run TV shows are being played.&amp;#160; What with the availability of almost every TV season on Netflix instant watch, or a full season on DVD, or (theoretically) a quick download via bittorrent, there’s almost no sense of urgency left to the act of watching TV, and if we happen to miss it – oh well, I’m sure I’ll be able to get it real soon. I’ve caught up on a year’s worth of The Big Bang Theory just recently, and I’m about to re-orient myself to two years’ worth of Supernatural (so I have the possibility of watching current-run episodes within the next few weeks).&lt;/p&gt;  &lt;p&gt;All that said, I can’t quite bring myself to give up my ability to accumulate a “taped” copy of the shows that were broadcast to me, for later viewing when I have more time.&amp;#160; Breaking the cycle of dependence between me and the timeslot the broadcaster decides to air the show is a powerful mental leap to make, and makes me feel less like a prisoner of the networks (and their increasingly hostile attitude towards their audience).&amp;#160; If only to make myself feel like I have a modicum of control over my TV habits, I’ve decided to drop another $200 on an Elgato EyeTV 250 Plus tuner.&lt;/p&gt;  &lt;p&gt;Why that brand and model?&amp;#160; Couple of reasons:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;My research into Mac-based HTPC’s and Mac-compatible tuners seems to mention the Elgato products more than any other brand.&amp;#160; It feels like what I saw with Hauppauge for Windows Media Center, and if my satisfaction with the Hauppauge products is any indication, the Elgato products should be good. &lt;/li&gt;    &lt;li&gt;It’s not just the hardware – apparently the EyeTV software is the best available for recording and managing playback of recordings on the Mac.&lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Finding all the digital channels available to be recorded with your tuner&lt;/h2&gt;  &lt;p&gt;If you’re going the OTA route, then this seems like a great way to see what all is available without a prescription (ha – I mean, subscription):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.equinux.com/us/products/tubestick/tuningmap.html"&gt;http://www.equinux.com/us/products/tubestick/tuningmap.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you’re stuck (like me) with wanting to get the few remaining channels that haven’t gone the full-streaming/Hulu/TV.com type of approach, and you *need* that subscription to bastards like Comcast, then your tuner has one of two uses:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Analog tuner (receiving the analog output from a DTA box), in which case be prepared to buy an “IR blaster” (device that allows your HTPC to direct “change channel” commands to the IR receiver of the DTA box).&amp;#160; This way, you get all the channels to which you’ve subscribed – whether the cable company is encrypting those QAM signals or not. &lt;/li&gt;    &lt;li&gt;Digital tuner (receiving whichever unencrypted (aka “clear QAM”) channels your cable company hasn’t yet obfuscated with the 56-bit DES encryption that (so far) is only supportably-decryptable by the DTA and/or full cable box solutions they hook up on your behalf).&amp;#160; This way, you get all the channels your cable company hasn’t yet encrypted – usually including the “extended basic” channels, and probably a few others that might not be high on their list of “must-have” channels. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The EyeTV software that comes with Elgato products includes a feature called “Exhaustive Scan”, which picks up the digital channels that aren’t sent out on the typical frequencies that are publicized by Comcast.&amp;#160; I was able to find about 80% of the non-local channels that I normally watch (and a bunch that I’ll *never* watch, no matter *how* high-def they are).&amp;#160; However it took me most of the afternoon to map those channels out.&lt;/p&gt;  &lt;p&gt;Be careful though: I don’t know why, but somehow all the configuration that I did to map those channels went up in smoke the next time I rebooted the Mini. Now maybe the system crashed before shutting down EyeTV – but is this software *really* so fragile that it doesn’t cache these settings as soon as they’re configured?&amp;#160; And make sure that the file that stores these settings doesn’t get wiped out by an errant half-open write operation or something?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Future question: &lt;/h4&gt;  &lt;p&gt;Is there a similar Plex plug-in for EyeTV as is &lt;a href="http://code.google.com/p/xbmc-addons/source/browse/#svn/trunk/plugins/video/XBMCEyetvParser"&gt;available for Boxee&lt;/a&gt;?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-4396383206716095723?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/4396383206716095723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=4396383206716095723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/4396383206716095723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/4396383206716095723'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2009/10/my-mac-mini-htpc-saga-tv-tuners.html' title='My Mac Mini HTPC saga: TV tuners'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-7203820015710058323</id><published>2009-10-08T23:54:00.001-07:00</published><updated>2009-10-08T23:54:22.686-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='netflix'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>What do you like? Your ratings in multiple places – do you want to sync them?</title><content type='html'>&lt;p&gt;The modern “what do you like?” systems are driving me nuts lately.&amp;#160; Every time I turn around, there’s a website offering to help me socialize, and what better way to find new friends (and new recommendations for media to consume) than by accumulating a bunch of ratings for the media I’ve already consumed?&lt;/p&gt;  &lt;p&gt;Friends (and hopefully, to some degree) passers-by can then peruse my virtual “media shelves”, see what I’ve rated and how, and either (a) get or (b) give recommendations for stuff that’s related to what they/I have already seen/read/heard and liked.&lt;/p&gt;  &lt;h2&gt;Web 1.0: Amazon Recommendations&lt;/h2&gt;  &lt;p&gt;I’ve got &amp;gt; 1000 ratings for graphic novels accumulated on Amazon.com – which was a great way for years for me to get recommendations on other books by the same authors, but even more importantly and gratifyingly – to get recommendations on other books by authors I hadn’t yet read.&amp;#160; (I’ve always assumed some sort of Bayesian analysis that results in “people who liked your 4- and 5-star books also bought/owned/rated these items”.)&lt;/p&gt;  &lt;p&gt;[I’d further tried to accumulate lists of ratings for music (for CDs I’ve purchased), but Amazon’s interface for this wasn’t nearly as sophisticated or predictive for music as it seems to be for books, so I’ve never gotten quite the same gratifying experience for music on Amazon.com.]&lt;/p&gt;  &lt;h2&gt;Web 1.0: Netflix Recommendations&lt;/h2&gt;  &lt;p&gt;I’ve got &amp;gt; 1000 ratings for movies accumulated on Netflix.com – which was a great way for years for me to get recommendations on other movies I’d like that have many of the same ephemeral qualities I enjoyed in the movies I rated most highly.&amp;#160; (Netflix has had a highly-publicized contest – which recently wrapped up – to come up with new ways of improving user recommendations, which to me meant that they’d exhausted all the available research into Bayesian and other mathematical analysis of the huge aggregations of data on what people liked, didn’t like, watched and marked “not interested”.)&lt;/p&gt;  &lt;p&gt;Long before I was a Netflix subscriber though, I was (and am) a diehard advocate for IMDB.com.&amp;#160; [Hell, I was one of the lunatic adopters in the early days back when you had to submit queries to the IMDB via email.&amp;#160; Yeah, imagine browsing your favourite actor’s movies [and forget about TV – that didn’t count] by submitting a cryptically-formed email message and waiting the minutes it took for their servers to generate a response.&amp;#160; Fred Flintstone-style browsing.]&amp;#160; I’ve occasionally submitted a rating for movie through that site too, though I haven’t gotten any real benefit from it (except the knowledge that I’m helping to build the geek-slanted ratings that are the killer data set available from IMDB).&lt;/p&gt;  &lt;h2&gt;Web 2.0: social + recommendations&lt;/h2&gt;  &lt;p&gt;In the past year or so, I’ve fallen deeply in love with Facebook, Twitter and all the most interesting integrations with these “social platforms”.&amp;#160; With these platforms have come brand-new applications that allow you to rate movies/TV/books/music/whatever and not only get some kind of recommendations back from “the system”, but also to get much more specific and immediate feedback from those of your friends (or even “friends”) who’ve also signed up to use the application.&amp;#160; They see what you’ve rated, then respond with comments/replies/their own ratings, and can make much more specific (and personal, though statistically less predictive) suggestions of other stuff they want you to see/read/hear.&lt;/p&gt;  &lt;p&gt;I love these – and while I’ve experimented with a bunch of these apps, I’ve gravitated to those apps that appear to have the greatest critical mass.&amp;#160; Not so much because I want a horde of strangers to help me find stuff, but because I’d like to reconnect with as many friends as possible and I hope they’re also at the apps I’ve picked.&lt;/p&gt;  &lt;p&gt;So I’ve got ratings slowly accumulating at Goodreads.com, Flixster and a couple of others.&amp;#160; Goodreads has a great mobile site that makes it dead-easy to post a rating “on the go” with very few excess clicks, and the Flixster iPhone app is awesome *and* easy.&amp;#160; And there are dozens of other great sites where lots and lots of people are accumulating lots and lots of ratings data.&lt;/p&gt;  &lt;h2&gt;Problems: stale data, incomplete data, spread-too-thin efforts&lt;/h2&gt;  &lt;p&gt;After a while, I’ve noticed I’m spread thin across multiple places where these ratings are being accumulated.&amp;#160; It’s an unfortunate consequence of the abundance of such great sites and platforms, that I’m finding it hard to keep my ratings “in sync” between multiple places at once.&amp;#160; I have good intentions – and occasionally I’ll even follow through on those good intentions. :)&lt;/p&gt;  &lt;p&gt;For example, I’ve got a ton of movie ratings in Netflix, but my primary interest for “sharing” movie ratings is moving to the Flixster app – mostly because it gives me a chance to get immediate feedback from a larger group of friends who catalogue their ratings and mini-reviews there via either Facebook or the iPhone app.&amp;#160; However, while I’m getting immediate gratification for my posts to Flixster, it’s not doing me any good in terms of system-generated (Bayesian) recommendations for other movies I want to watch. And when I go to my Netflix queue to add movies, I sometimes forget whether I’ve seen something (since I haven’t always rated those movies I’ve seen recently).&lt;/p&gt;  &lt;p&gt;Similarly, the primary place I currently capture my ratings for graphic novels is in GoodReads (usually via the mobile-optimized web site that I access from my iPhone).&amp;#160; I’m not even getting any instant feedback from friends there, nor have I found any way to use the “crowd” of GoodReads users as a source for new recommendations.&amp;#160; However, there’s no alternative in my Web 1.0 world: Amazon doesn’t seem to have any way to add ratings on the go.&amp;#160; If you’re not going through their full browser, then you’re SOL.&amp;#160; (The Amazon iPhone app doesn’t do squat here, and neither does the mobile browser version – it’s almost as if they don’t care whether their customers like what they bought.)&lt;/p&gt;  &lt;p&gt;I’m now split between worlds, and I suspect the world of Facebook/social media and other Web 3.0 apps will only make this worse – there’ll be more and more sites that all want you to provide some “sticky” information, that lures in more users ‘cause there’s a “crowd” there, and yet those ratings won’t be re-usable elsewhere.&lt;/p&gt;  &lt;h2&gt;This Ratings Data Ain’t Portable, My Friends&lt;/h2&gt;  &lt;p&gt;Yeah.&amp;#160; Twitter might have finally gotten religion that you “own” your Tweets, and Facebook *looks* like they’re convinced that you can and should have the ability to control your personal information/updates, but good luck trying to convince the thousands of little start-up apps out there, all hoping to lure you into their little walled garden and *keep* you there.&lt;/p&gt;  &lt;p&gt;I expect that in 5-10 years, all these systems will be able to freely consume and re-use this data – the business world will have finally gotten over thinking this is their only “value add” (and will have found some even more sexy way to separate you from your money).&lt;/p&gt;  &lt;p&gt;However, for the forseeable future, these multiple ratings systems will continue to live as non-interoperable data islands.&amp;#160; That means heavy “data generators” like me will have to make some pretty dopey (and unavoidable) decisions:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;When you find a new, even-more-attractive place to catalogue your consumption and how much you enjoyed it, do you abandon all the invested effort you put into the last one? &lt;/li&gt;    &lt;li&gt;If you don’t want to abandon all that “legacy data”, how will you migrate it to the new system? Just devote a freakin’ weekend to the prospect of clicking like a spastic lab rat, replicating each rating from one system to the other?&amp;#160; Or do you go even further down the rabbit hole and learn how to export the data (if that’s supported) from one and import to another – or go completely over the cliff edge into writing yourself some web-scraping scripts that pull the data by force out of systems that don’t have a supported import/export interface (API)? &lt;/li&gt;    &lt;li&gt;And if you actually *want* to maintain a presence in more than one system – e.g. if you find some ongoing benefit in having current presence in both Netflix and Flixster?&amp;#160; Well gods help you then – you’re screwed into a life of regular repeated self-inflicted punishment. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I’ve really lost my mind – thinking there’s got to be some way to actually pull off (3) without feeling like a character in a Kafka novel (and no, I’ve never read Kafka, so don’t crucify me for a misspoken cultural reference).&lt;/p&gt;  &lt;h2&gt;How’s About a Ratings Sync App?&lt;/h2&gt;  &lt;p&gt;Yeah, why the hell not?&amp;#160; Why not just burn the next years’ worth of weekends writing an extensible framework for us to be able to download, manipulate, upload and synchronize (i.e. manage and resolve the inevitable conflicts) the ratings data?&amp;#160; Isn’t is just like me, to think of doing some thankless job like this, in the hopes that some morsel of thanks comes through from some other hapless geek like me?&lt;/p&gt;  &lt;p&gt;Sure, what the hell.&lt;/p&gt;  &lt;p&gt;In fact, I’ve invested a whole bunch of time into this harebrained notion already.&amp;#160; Yes, I’ve written myself a bunch of code that attempts to provide an extensible, pluggable framework in which multiple “ratings” providers could be wired in, and between which synchronization could occur.&lt;/p&gt;  &lt;p&gt;I actually dream that one day, users like me could:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Fire up this app&lt;/li&gt;    &lt;li&gt;Connect to one of their ratings aggregating web sites&lt;/li&gt;    &lt;li&gt;Download all ratings for whatever “things” are rated on that site&lt;/li&gt;    &lt;li&gt;Select another compatible ratings web site (e.g. another books-rating web site if you just download book ratings)&lt;/li&gt;    &lt;li&gt;Configure a translation between the two web sites (e.g. one site rates 1-5, the other site rates 1-10, so map 1 = 2, 2 = 4, 3 = 6, 4 = 8, 5 = 10; or if you’d prefer, 1 = 1, 2 = 3, 3 = 5, 4 = 7, 5 = 9)&lt;/li&gt;    &lt;li&gt;Upload the translated ratings to the second site, thus synchronizing your ratings from one site to the next&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This’ll require mapping out the APIs for each ratings-aggregating site, implementing an incredible flexible and robust local schema for the data, and figuring out all the different ways that different sites identify what to the human mind is an easy-to-identify product.&lt;/p&gt;  &lt;p&gt;[And to think, this whole idea came about as a way to figure out how to migrate the ratings from my old Netflix account (to which I’ve still got access, but only just barely – due to the grace of an old housemate) to a new one that *I* own, and from which I could actually do Netflix Instant Watch in my own personality (and with my own IW queue).&amp;#160; I’m seriously considering just paying them for their subscription for the rest of my life, so I never have to lose those 2956 movie ratings.]&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Anyone out there got a better idea?&lt;/p&gt;  &lt;p&gt;Anyone else crazy enough to want to help out with this?&lt;/p&gt;  &lt;p&gt;Anyone out there want to see this app see the light of day?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-7203820015710058323?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/7203820015710058323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=7203820015710058323' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7203820015710058323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7203820015710058323'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2009/10/what-do-you-like-your-ratings-in.html' title='What do you like? Your ratings in multiple places – do you want to sync them?'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-1703245116840971560</id><published>2009-10-04T14:02:00.001-07:00</published><updated>2009-10-04T14:04:41.999-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac Mini'/><category scheme='http://www.blogger.com/atom/ns#' term='HTPC'/><title type='text'>My Mac Mini HTPC saga: software &amp; configurations</title><content type='html'>&lt;p&gt;Now that I’ve done the whole hardware upgrade and full, clean install of Mac OS X 10.6, I have to start all over again (this time with a little practice under my belt) on getting all the stuff assembled for a well-oiled home theatre machine.&lt;/p&gt;  &lt;h2&gt;Plex, Boxee, EyeTV, VLC, Transmission, Silverlight, MacTheRipper&lt;/h2&gt;  &lt;p&gt;Lots of software, so little attention span. :)&lt;/p&gt;  &lt;h3&gt;Plex&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;As my chosen media front-end, I intend to do as much as possible from here, and only veer into the other apps I’m using when necessary&lt;/li&gt;    &lt;li&gt;I choose to install the following apps: Hulu, Apple Movie Trailers, South Park, Netflix, The Daily Show, Pandora, PBS, Picasa Web, Trailer Addict, YouTube&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Boxee&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;I hear this is the only way to get full streaming of the CBS TV shows in a 10’ UI experience (rather than fire up Safari/Firefox and click away directly)&lt;/li&gt;    &lt;li&gt;So I logged into Boxee.tv, downloaded the Mac OS X alpha of Boxee (which is simply yet another XBMC fork/port) and started looking at the “Applications” – Videos &amp;gt; CBS &amp;gt; Full Episodes shows listings for How I Met Your Mother (which I watch) but not for The Big Bang Theory (which I *slavishly* watch)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;CBS: Fail.&lt;/p&gt;  &lt;h3&gt;EyeTV&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Once I decided to definitely get a tuner (more on that in another blog article), the overwhelming number of times I’ve heard Elgato’s products recommended (not just their tuner, but their pretty great EyeTV software app to manage the tuner) was the clincher&lt;/li&gt;    &lt;li&gt;The trickiest part was upgrading EyeTV from 3.0.x to 3.2 (which just came out a few days ago).&amp;#160; It turns out that on systems running Mac OS X 10.6, EyeTV 3.0.x won’t even launch – Apple in the infinite wisdom intentionally put a “block” in place so that it won’t start.&lt;/li&gt;    &lt;li&gt;It turns out there’s an “under the covers” way to bypass such Mac OS X “blocks”, by launching the application’s actual binary file, rather than using the “user friendly shortcut” that is presented in the Applications folder (and which I, like most Mac users, seem to happily use until something prevents us from getting in the easy way).&lt;/li&gt;    &lt;li&gt;I found an article at Elgato’s site that outlined the process: &lt;a href="http://support.elgato.com/index.php?_m=knowledgebase&amp;amp;_a=viewarticle&amp;amp;kbarticleid=3628"&gt;http://support.elgato.com/index.php?_m=knowledgebase&amp;amp;_a=viewarticle&amp;amp;kbarticleid=3628&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Once I got EyeTV 3.0.x (I think it was 3.0.3 that shipped with my EyeTV 250 Plus tuner) running, I was able to use the EyeTV “Check for Updates” menu option to get the 3.2 download and be back working like a charm.&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;VLC Media Player&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;I remembered that VLC was the easiest way to get access to all the significant codecs, and have a nice media player in the background in case any of the rest of ‘em weren’t working out for me.&lt;/li&gt;    &lt;li&gt;Downloaded, installed, and already confirmed that VLC can play VOB files that were copied directly off a DVD (for backup purposes, naturally – who wants to scratch their only copy of Robot Chicken?)&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Transmission BitTorrent client&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Ever since hearing about PeerGuardian for Windows (a piece of software that prevents your computer from connecting to “blacklisted” IP addresses – e.g. those servers setup by the RIAA, government agencies and others to track what you’re doing with your downloads and other torrent-like activity), I’ve been dreading the conversion over to my Mac Mini&lt;/li&gt;    &lt;li&gt;Then somehow today, my searches through Lifehacker’s archives for “p2p file sharing ‘mac os x’” turned up an article from 2008 on Transmission – a BitTorrent client for Mac OS X and Linux.&lt;/li&gt;    &lt;li&gt;It turns out that the friendly and nice folks at Transmission have integrated the PeerGuardian functionality into their app, including automatic downloads of the Bluetack blocklists&lt;/li&gt;    &lt;li&gt;That’s enough for me – I’ve already got Transmission installed and slurping down some great media for later watching.&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Silverlight 3.0 (for Netflix)&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Silverlight is necessary for playing the Netflix Instant Watch streaming movies, and it doesn’t seem to get installed “in the background” by Plex, Boxee or any of the other media-front-end apps that provide a Netflix wrapper&lt;/li&gt;    &lt;li&gt;Makes sense now that I think about it, but I can’t say I wasn’t disappointed by the fact that the Mac software community hasn’t made all this stuff entirely hidden from my relatively novice eyes.&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;MacTheRipper&lt;/h3&gt;  &lt;p&gt;Great little app for making backup copies of your DVDs onto a local hard drive.&amp;#160; Essential in this day and age.&lt;/p&gt;  &lt;h2&gt;Issue: Mac OS X 10.6 intercepts all Apple Remote commands&lt;/h2&gt;  &lt;p&gt;As of OS X 10.6, the operating system itself intercepts all Apple Remote commands, and cannot be overridden by application-specific configurations (as was apparently the case with Plex and probably others in the past).&amp;#160; Instead, hitting the Menu button on the Apple Remote will always bring up Front Row; hitting the volume buttons will always change the system-wide volume, and other irritating effects (for an HTPC user who’s using third-party HTPC-oriented software) are seen as well.&lt;/p&gt;  &lt;p&gt;While there’s no supported, by-design way in OS X to disable this “feature”, there are some known workarounds – which I’ve implemented:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://forums.plexapp.com/index.php?showtopic=8658"&gt;http://forums.plexapp.com/index.php?showtopic=8658&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;edited the /System/Library/LaunchAgents/com.apple.RemoteUI.plist file (after making a copy of the file in the same directory, in case I later want to revert back to the original settings)&lt;/li&gt;    &lt;li&gt;deleted the /System/Library/LoginPlugins/BezelServices.loginPlugin (after making a copy of the file – ibid)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://www.tech-recipes.com/rx/2754/os_x_edit_file_using_textedit_as_root_superuser/"&gt;http://www.tech-recipes.com/rx/2754/os_x_edit_file_using_textedit_as_root_superuser/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I had to use this article’s cluefulness to allow me to interactively edit the RemoteUI.plist file using TextEdit.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://support.apple.com/kb/TA25121"&gt;http://support.apple.com/kb/TA25121&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I also got bit by the “blank admin password” problem – wasn’t able to fire up sudo when my current account had a blank password.&amp;#160; So I changed it, did the sudo-enabled edit, and changed the password back.&lt;/p&gt;  &lt;h2&gt;Next Steps…&lt;/h2&gt;  &lt;p&gt;Wondering – do I really *need* a TV tuner, to enjoy the world’s best offerings of TV and other media?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-1703245116840971560?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/1703245116840971560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=1703245116840971560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1703245116840971560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1703245116840971560'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2009/10/my-mac-mini-htpc-saga-software.html' title='My Mac Mini HTPC saga: software &amp;amp; configurations'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-5255367179318082292</id><published>2009-09-30T16:55:00.001-07:00</published><updated>2009-09-30T16:55:28.478-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac Mini'/><category scheme='http://www.blogger.com/atom/ns#' term='HTPC'/><title type='text'>My Mac Mini HTPC saga: upgrading hardware, optimizations</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Replace RAM, Hard drive with beefier options I bought myself&lt;/h2&gt;  &lt;p&gt;I wanted to have the maximum available ‘headroom’ in this box before I committed a lot of time installing and configuring lots of software (e.g. if I wanted to run software-driven encoding, have multiple big apps running at the same time, or even to run a virtualized instance of Windows whenever I felt the ‘itch’).&amp;#160; &lt;/p&gt;  &lt;p&gt;So after reading about what some of the braver souls have done under the hood, I decided that I’d purchase the lowest-end Mac Mini (with the exception of getting the fastest processor, which aren’t upgradeable AFAIK) and then purchase 4 GB of RAM &amp;amp; a 320 GB 7200 RPM SATA drive.&lt;/p&gt;  &lt;h3&gt;4 GB of RAM (or 8?)&lt;/h3&gt;  &lt;p&gt;While deciding on a brand of RAM is usually a decision with way too many options, on what should be but sometimes isn’t a commodity purchase, I cheated.&amp;#160; When browsing around Amazon.com for what kinds of prices they had available for Mac Mini’s, I noticed their “what other people purchase with this item” was consistently coming up with one package of Corsair 2 x 2GB DDR3 (PC3-8500) RAM – this one, for (at the time I purchased) &lt;/p&gt;  &lt;p&gt;Note: I’ve done as much reading as I could about the new 64-bit capabilities unlocked by Mac OX 10.6 (Snow Leopard), and while there’s promising speculation that the Mac Mini could take 2 x 4GB RAM (i.e. 8GB total), the reality is the price of the 4GB PC3-8500 modules is astronomical compared to 2GB modules.&amp;#160; I’ll keep that in mind for the future, but for now the 4GB is plenty of extra capacity for now, and I can keep the extra couple hundred dollars for something else.&lt;/p&gt;  &lt;h3&gt;Which Hard Drive?&lt;/h3&gt;  &lt;p&gt;Over the decades, different hard drive manufacturers have produced drives of higher or lower quality, and I can never keep up with “which manufacturer is the king for each drive size and capacity”.&amp;#160; For this I trundled down to my local PC supply shop with two specifications in hand: it has to be a 2.5” drive (the bigger ‘desktop’ drives won’t fit) and it has to be a 7200 RPM drive (my reading suggests the faster drive speeds make a big difference in a Mac Mini HTPC).&lt;/p&gt;  &lt;p&gt;The dude behind the counter was very definitive – according to him, the most reliable and best-performing 2.5” 7200 rpm drive on the market today is from Western Digital (aka the “Scorpio Black” line of drives).&lt;/p&gt;  &lt;p&gt;If you’re looking at other brands, and you’d like to know if other Mac Mini owners have been successful upgrading with them, I found a really useful resource that could help: “Mac Drive Upgrades/Compatibility Database” at &lt;a href="http://forums.xlr8yourmac.com/drivedb/search.drivedb.lasso"&gt;http://forums.xlr8yourmac.com/drivedb/search.drivedb.lasso&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Procedure to Open the Mac and Upgrade the Components&lt;/h2&gt;  &lt;p&gt;Search Google for “Mac Mini RAM upgrade” and/or “Mac Mini hard drive upgrade” – there are many step-by-step guides available (e.g. &lt;a href="http://www.methodshop.com/gadgets/tutorials/macmini-ram/index.shtml"&gt;this one&lt;/a&gt;), and a number of great YouTube videos that take you visually through the process. I just followed the first couple that I found and everything seemed to work fine (at least, for this “old hat” at constructing my own PCs for so many years).&lt;/p&gt;  &lt;p&gt;For me, the only tools I needed were:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;a putty knife or scraper blade (anything thin, metal and long enough to wedge in a few inches into the Mac Mini case) &lt;/li&gt;    &lt;li&gt;a Philips (the “x” kind) screwdriver that is thin enough to get into a very narrow plastic tube (eyeglasses screwdrivers are usually good for this), and has a small/thin enough head that it can unscrew (and not strip) the screws with the very narrow “x” channel.      &lt;ul&gt;       &lt;li&gt;As some pointed out, magnetizing the screwdriver head is very handy for extracting those tiny little, fidgety screws – otherwise they tend to drop into the Mac Mini guts, and then you’re shaking it hard enough to get it loose (but not too hard so that you risk “damaging” some microscopic parts – not that I think there is any real danger of this with what I saw, but even an “old hat” gets worried there’s some new level of miniaturization that makes some part extremely sensitive to impact from even a 1/4-ounce screw. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Remember: Format your new Drive&lt;/h3&gt;  &lt;p&gt;Oh, and don’t forget to format the drive using Disk Utility (accessible from the top menu bar after the Mac OS X installer has asked which language you want to install).&amp;#160; I went through the install twice, both times wondering why the new 320GB disk wasn’t available as a selection for “where do you want to install Mac OS X&amp;quot;.&amp;#160; I figured that the installer was so smart that it recognized an unformatted disk, and would automatically format it for me.&amp;#160; (Soon, perhaps, but not at present.)&amp;#160; Embarrassing, but easily corrected – once I realized that I *had* checked all connections twice, and there was really very little that *could* prevent the drive from being recognized at the physical level.&lt;/p&gt;  &lt;h2&gt;Reinstalling Mac OS X and the rest of the bits from the two DVDs&lt;/h2&gt;  &lt;p&gt;This part was a freakin dream – so few questions, everything possible automated – it’s like Apple realizes that most people don’t care to fiddle, they just want the sucker to work.&lt;/p&gt;  &lt;p&gt;The only extra steps I had to take were installing the optional bits (mostly utilities, but also Safari, Mail, iCal and some other useful things) from the OS X install DVD, and then installing whatever comes on that DVD labelled “”.&amp;#160; (Heck, it only consumed 4GB of my new 320GB drive, and until I know more about what I *don’t* need, I’m pretty comfortable taking 4GB “just in case”.)&lt;/p&gt;  &lt;h2&gt;Misc optimizations:&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;enable SMB sharing in Mac OS X, so that Plex (or Boxee) can find and scour any locally-attached external drive for photos, music and video.&amp;#160; (Apparently the XBMC codebase always expected to find all media on a network-shared device, since the original XBox hardware itself couldn’t retrieve or store that much media locally on the puny 20GB XBox drive.) &lt;/li&gt;    &lt;li&gt;Add an entry point in the &lt;a href="http://forum.boxee.tv/showthread.php?t=1582&amp;amp;page=2"&gt;Front Row menu for Boxee&lt;/a&gt; – does this work for Plex as well? &lt;/li&gt;    &lt;li&gt;Added link to 10-foot-UI-friendly version of my Google Reader account (via &lt;a title="http://mymediaexperience.com/feeds-as-newspaper-in-your-living-room/" href="http://mymediaexperience.com/feeds-as-newspaper-in-your-living-room/"&gt;http://mymediaexperience.com/feeds-as-newspaper-in-your-living-room/&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;Something about reconfiguring audio for Plex: “As for setting up Plex with a DTS or DD receiver. Go Configure The System -&amp;gt; System -&amp;gt; Audio Hardware from the menu. Then change the audio output from analog to digital. ” (&lt;a title="http://www.123macmini.com/forums/viewtopic.php?t=20440&amp;amp;highlight=ntfs" href="http://www.123macmini.com/forums/viewtopic.php?t=20440"&gt;http://www.123macmini.com/forums/viewtopic.php?t=20440&lt;/a&gt;) &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-5255367179318082292?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/5255367179318082292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=5255367179318082292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5255367179318082292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5255367179318082292'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2009/09/my-mac-mini-htpc-saga-upgrading.html' title='My Mac Mini HTPC saga: upgrading hardware, optimizations'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-3081629335216050908</id><published>2009-09-17T22:57:00.001-07:00</published><updated>2009-09-17T22:57:58.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac Mini'/><category scheme='http://www.blogger.com/atom/ns#' term='HFS+'/><category scheme='http://www.blogger.com/atom/ns#' term='NTFS'/><category scheme='http://www.blogger.com/atom/ns#' term='HTPC'/><title type='text'>My Mac Mini HTPC saga: filesystem selection for external media drive</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Quest: best filesystem for my external hard drive&lt;/h2&gt;  &lt;p&gt;I have a 750 GB Seagate FreeAgent drive, where I’ve kept most of my media (photos, music, video, backups) for the past couple of years.&amp;#160; Until now, I was operating in an all-Windows world of my own design, and NTFS was the best (most reliable, performant, flexible) filesystem for that drive.&lt;/p&gt;  &lt;p&gt;Now that I’ve introduced a Mac into my life, and because I’m planning to plug it into the Mac Mini for the vast majority of the time (to host media I record from or wish to display via the Mini) I’m faced with what feels like an imperfect choice:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;FAT32 doesn’t support &amp;gt; 4 GB filesize, which in this day and age of recorded/downloaded TV (not to mention the potential for virtualization in my future, in case I want to keep experimenting/developing) is damned easy to exceed.&lt;/li&gt;    &lt;li&gt;NTFS isn’t natively supported in Mac OS X (at least, not for writes, though a read-only NTFS driver is available).&lt;/li&gt;    &lt;li&gt;Mac-only filesystems (e.g. HFS+) feel like a bit *too* much commitment to a platform that isn’t the dominant in my lifestyle yet – e.g. what if I want to unplug that drive from the Mac mini and hook it to my Windows box to do some USB 2.0-speed backups or other file transfers?&amp;#160; I know that most of my file transfers will probably work fine with an SMB share over the Wifi network (it’s all 802.11 g or better, in a pretty confined space), but sometimes I just want to get something done quickly.&amp;#160; Not to mention I’m not yet familiar with what steps I would have to take if I were to hook up my external drives (the 750GB – cleaned off now - and my backup one - FAT32), format the 750 gigger and try to copy over all my FAT32 data into reasonable facsimiles of the data I replicated off the 750 (before I repartitioned it).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There’s some fairly predictable chatter about lower performance of 3rd-party (R/W) NTFS drivers when used within Mac OS X (&lt;a title="http://www.123macmini.com/forums/viewtopic.php?t=23243&amp;amp;highlight=ntfs" href="http://www.123macmini.com/forums/viewtopic.php?t=23243&amp;amp;highlight=ntfs"&gt;http://www.123macmini.com/forums/viewtopic.php?t=23243&amp;amp;highlight=ntfs&lt;/a&gt;), and I’d expect similar concerns about 3rd-party HFS+ drivers (R/W) running in Windows.&amp;#160; I’m not worried about booting from the external drive, so that limitation of NTFS-3g isn’t a concern for me (&lt;a title="http://www.123macmini.com/forums/viewtopic.php?t=23057&amp;amp;highlight=ntfs" href="http://www.123macmini.com/forums/viewtopic.php?t=23057&amp;amp;highlight=ntfs"&gt;http://www.123macmini.com/forums/viewtopic.php?t=23057&amp;amp;highlight=ntfs&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;However, after thinking about what my *majority* usage will be, it’s clear to me that I’ll end up leaving the drive mounted to the Mac Mini 95% of the time, so I should optimize it for that scenario and not the “just in case” fear-based scenario.&amp;#160; If it turns out that I’m using the drive directly attached to my Windows box *that* often, I can always use a one-time read-only HFS+ driver in Windows to get the data off the drive, then reformat with NTFS.&amp;#160; Getting the data off the drive isn’t a worry of mine (these drivers all seem good enough for at least the “disaster recovery – get my data off the drive *eventually*” scenarios); so I’d be an idiot not to optimize for the day-to-day performance issues I’d otherwise be facing with a non-native filesystem for the host where it’ll be plugged in 95% of the time.&lt;/p&gt;  &lt;h2&gt;Next time&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Quest: a tuner I can “set and forget” (i.e. reliable, stable, robust performance)&lt;/li&gt;    &lt;li&gt;Quest: improve the screen drawing response time in “Screen Sharing” (aka VNC)&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-3081629335216050908?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/3081629335216050908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=3081629335216050908' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3081629335216050908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3081629335216050908'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2009/09/my-mac-mini-htpc-saga-filesystem.html' title='My Mac Mini HTPC saga: filesystem selection for external media drive'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-5544235043251142493</id><published>2009-09-14T09:39:00.001-07:00</published><updated>2009-09-14T09:39:17.592-07:00</updated><title type='text'>My Mac Mini HTPC saga: Plex or Boxee as the front-end?</title><content type='html'>&lt;p&gt;After opening my mind to the possibility that I could find in the Mac Mini a worthy replacement for the aging (and rotting) promise of Windows Media Center as an HTPC, it didn’t take long to find out just how far the Mac HTPC community has come.&amp;#160; Between the streaming media front ends like Plex &amp;amp; Boxee, and the first-class support from digital-TV-tuner manufacturers like Hauppauge, and the number of people who’ve blazed the trail ahead of me, it seemed like a no-brainer.&lt;/p&gt;  &lt;p&gt;However, unlike an Apple TV (a low-powered CPU ‘appliance’ that was intended merely to download movies and TV from the iTunes store), the Mac Mini isn’t specifically designed as a home theater PC (HTPC), and doesn’t present itself to the uninitiated user as a direct complement to their TV.&lt;/p&gt;  &lt;p&gt;That said, with not a whole lot of effort and a few add-on bits of hardware, this Mac Mini is easily the equal of the functionality of my old Windows Media Center system, and has the advantage of being a lot smaller and ridiculously quieter than a clunky monster PC.&amp;#160; [Outside of an extra $grand or two for a custom-designed HTPC, if you’ve got more money than brains.]&lt;/p&gt;  &lt;h2&gt;Which streaming media front end?&lt;/h2&gt;  &lt;p&gt;There are plenty of “Plex vs. Boxee” articles/forum chatter for anyone who’s looking (these are just the ones I found in my first couple of pages of Google results: &lt;a href="http://forums.macrumors.com/showthread.php?t=637135"&gt;1&lt;/a&gt;, &lt;a href="http://www.husar.us/blog/archives/4519?wscr=1440x900"&gt;2&lt;/a&gt;, &lt;a href="http://hicksdesign.co.uk/journal/boxee-and-plex"&gt;3&lt;/a&gt;, &lt;a href="http://forum.boxee.tv/showthread.php?t=8158"&gt;4&lt;/a&gt;, &lt;a href="http://www.revolution34.com/2009/07/13/its-a-mini-adventure-plex-vs-boxee/"&gt;5&lt;/a&gt;, &lt;a href="http://www.mahalo.com/answers/technology-and-internet/got-any-thoughts-on-plex-v-boxee-which-is-better"&gt;6&lt;/a&gt;, &lt;a href="http://smokingapples.com/featured/setting-up-a-mac-media-center-part-2-plex-vs-boxee/"&gt;7&lt;/a&gt;, &lt;a href="http://www.macworld.com/article/140413/2009/05/media_center_shared_network_media.html"&gt;8&lt;/a&gt;, &lt;a href="http://www.cultofmac.com/cult-of-mac-favorite-plex-media-center/10271"&gt;9&lt;/a&gt;, &lt;a href="http://blog.icypole.net/index_files/frontrow_plex_boxee.php"&gt;10&lt;/a&gt;, &lt;a href="http://www.123macmini.com/forums/viewtopic.php?t=23763&amp;amp;sid=7ee6798b1cdc3a42266a70d47523280c"&gt;11&lt;/a&gt;, &lt;a href="http://mydellmini.com/forum/general-mac-os-x-discussion/6405-plex-boxee.html"&gt;12&lt;/a&gt;).&amp;#160; There’s a lot of active development in both projects, and there’s a lot of enthusiasm for both, but there seem to be some common themes to the discussions I’ve read:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Plex is more “fiddly” to setup your library of existing, local content – finding the folders and assigning the metadata.&amp;#160; Boxee seems to have mastered the “point it at folders and it’ll organize it into a library” approach.&lt;/li&gt;    &lt;li&gt;Boxee is more socially oriented, as in it lets other members of Boxee find out what you’ve watched (at least among the online sources – presumably it doesn’t advertise what you’re watching of your locally-stored media).&lt;/li&gt;    &lt;li&gt;One covers the BBC online media; the other covers integration of the Netflix instant watch streaming. (Or at least that’s what I recall reading.)&lt;/li&gt;    &lt;li&gt;Since they’re both based on the XBMC codebase, they’ll both benefit tremendously from future enhancements to the &lt;/li&gt;    &lt;li&gt;Boxee seems to have already skewed towards/created a culture of “cut the cable” (i.e. “help me get rid of Comcast/Time Warner stat!”), while Plex (perhaps as a Mac-only product) has a little less of the prickly attitude.&lt;/li&gt;    &lt;li&gt;They’re both generally considered inferior to Front Row from a UI/usability perspective, but neither one is ever accused of being “unusuable”.&lt;/li&gt;    &lt;li&gt;They both integrate with the Apple Remote (or if you’re a Logitech weenie, with most Harmony remotes – personally, after trying and failing for over a year to get a Harmony to operate as a set-it-and-forget-it, “universal one-touch” remote, I’ll avoid those hack-jobs like the plague).&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;While my girlfriend is quite adept at her Macbook, our discussions so far have led me to believe that the less fiddly/quirky this setup is on a day-to-day basis, the more comfortable she’ll be at using this (and the less I’ll have to coach her down off the ledge and into the world of computer-based home media.&lt;/p&gt;  &lt;p&gt;Thus I’m convinced by what I’ve read to veer towards Plex (and not bother her with it until I’ve got the existing content adequately catalogued in the Plex library).&lt;/p&gt;  &lt;h2&gt;Next Steps: setting up Plex&lt;/h2&gt;  &lt;p&gt;Apparently, as &lt;a href="http://forums.macrumors.com/showthread.php?t=637135"&gt;one poster indicated&lt;/a&gt;, “The key seems to be putting Plex in Library mode. Once done, its scraper will dl the video info.”&lt;/p&gt;  &lt;p&gt;There’s also some question whether Plex yet provides integrations with Netflix and Flickr.&amp;#160; I’ll have to dig through the &lt;a href="http://elan.plexapp.com/category/plug-ins/"&gt;PlexApp plug-in announcement archives&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Then I’ll be interested to dig further into the question of whether, by installing VLC media player, the codecs that it uses will be available to all media players, or just to my Mac.&lt;/p&gt;  &lt;p&gt;Finally, I’d like to revisit the question of which desktop resolution is best suited to my 1080p HDTV – I’d tried 1920x1080, but wasn’t able to see the Mac menu bar (so e.g. I couldn’t click on the little Apple menu to reboot), so now I’m at something in the 1300-pixel-width range.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-5544235043251142493?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/5544235043251142493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=5544235043251142493' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5544235043251142493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5544235043251142493'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2009/09/my-mac-mini-htpc-saga-plex-or-boxee-as.html' title='My Mac Mini HTPC saga: Plex or Boxee as the front-end?'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-6141400970473638766</id><published>2009-02-13T11:29:00.001-08:00</published><updated>2009-02-13T11:29:17.887-08:00</updated><title type='text'>Namaste</title><content type='html'>&lt;div class="pp_items"&gt;&lt;div class="pp_item"&gt;&lt;h4&gt;&lt;div align="center"&gt;&lt;img src="http://static.pixelpipe.com/60adef86-b3a1-4110-a900-2a0fe34eaef1_m.jpg" style="max-width: 100%;" /&gt;&lt;p&gt;namaste - bumper sticker&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="pp_item"&gt;&lt;h4&gt;&lt;div align="center"&gt;&lt;h4&gt;Dude Abides&lt;/h4&gt;&lt;img src="http://static.pixelpipe.com/538dde9d-82d4-49b8-8912-8f911968923f_m.jpg" style="max-width: 100%;" /&gt;&lt;p&gt;The Dude Abides - bumper sticker&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="pp_item"&gt;&lt;h4&gt;&lt;div align="center"&gt;&lt;h4&gt;Lots of geese&lt;/h4&gt;&lt;img src="http://static.pixelpipe.com/c5d7236c-e4cb-4921-9477-30450fe2717e_m.jpg" style="max-width: 100%;" /&gt;&lt;p&gt;200+ Canada Geese just gathered in Hillsboro OR - what are they plotting?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;h5&gt;Posted via &lt;a href="http://pixelpipe.com"&gt;Pixelpipe&lt;/a&gt;.&lt;/h5&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-6141400970473638766?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/6141400970473638766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=6141400970473638766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6141400970473638766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6141400970473638766'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2009/02/namaste.html' title='Namaste'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-8575029423003629790</id><published>2008-12-29T09:30:00.001-08:00</published><updated>2008-12-29T09:30:13.478-08:00</updated><title type='text'>Untitled</title><content type='html'>&lt;div class="pp_items"&gt;&lt;div class="pp_item"&gt;&lt;h4&gt;&lt;h4&gt;Frito all-natural oil&lt;/h4&gt;&lt;div align="center"&gt;&lt;img src="http://static.pixelpipe.com/63189ab2-9423-4197-b974-c4a595c9dd7a_m.jpg" style="max-width: 100%;" /&gt;&lt;/div&gt;&lt;p&gt;what were these chips made with BEFORE?&lt;/p&gt;&lt;/div&gt;&lt;h5&gt;Posted via &lt;a href="http://pixelpipe.com"&gt;Pixelpipe&lt;/a&gt;.&lt;/h5&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-8575029423003629790?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/8575029423003629790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=8575029423003629790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/8575029423003629790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/8575029423003629790'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/12/untitled_29.html' title='Untitled'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-885244897596457932</id><published>2008-12-19T20:26:00.001-08:00</published><updated>2008-12-19T20:26:06.244-08:00</updated><title type='text'>Untitled</title><content type='html'>&lt;div class="pp_items"&gt;&lt;div class="pp_item"&gt;&lt;h4&gt;if you're not living on the edge, you're taking up too much room&lt;/h4&gt;&lt;div align="center"&gt;&lt;img src="http://static.pixelpipe.com/61f59e2d-06e7-4b8c-9f3e-2b036bfb5a6a_m.jpg" /&gt;&lt;/div&gt;&lt;p&gt;scrawled on a building in SE Portland&lt;/p&gt;&lt;/div&gt;&lt;div class="pp_item"&gt;&lt;h4&gt;incredible renovation&lt;/h4&gt;&lt;div align="center"&gt;&lt;img src="http://static.pixelpipe.com/edf4c172-7db1-45d9-bb3b-b3c65a6b9dc0_m.jpg" /&gt;&lt;/div&gt;&lt;p&gt;beautiful monster home in Ladd's Addition&lt;/p&gt;&lt;/div&gt;&lt;h5&gt;Posted via &lt;a href="http://pixelpipe.com"&gt;Pixelpipe&lt;/a&gt;.&lt;/h5&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-885244897596457932?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/885244897596457932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=885244897596457932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/885244897596457932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/885244897596457932'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/12/untitled_19.html' title='Untitled'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-7496874598341149426</id><published>2008-12-19T20:18:00.001-08:00</published><updated>2008-12-19T20:18:04.687-08:00</updated><title type='text'>Untitled</title><content type='html'>&lt;div class="pp_items"&gt;&lt;div class="pp_item"&gt;&lt;h4&gt;awesome brew&lt;/h4&gt;&lt;div align="center"&gt;&lt;img src="http://static.pixelpipe.com/7d58da1d-bd03-4304-8e2b-5b85b9454b53_m.jpg" /&gt;&lt;/div&gt;&lt;p&gt;one of the best Canadian beers, for half the price of it's branded counterpart&lt;/p&gt;&lt;/div&gt;&lt;h5&gt;Posted via &lt;a href="http://pixelpipe.com"&gt;Pixelpipe&lt;/a&gt;.&lt;/h5&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-7496874598341149426?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/7496874598341149426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=7496874598341149426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7496874598341149426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7496874598341149426'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/12/untitled.html' title='Untitled'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-309480105626246700</id><published>2008-11-24T22:01:00.001-08:00</published><updated>2008-11-24T22:01:50.912-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='InfoPath'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><title type='text'>InfoPath forms error – one of the most obscure I’ve ever seen…</title><content type='html'>&lt;p&gt;I had an InfoPath web form configured, working well, and ready to deploy.&amp;#160; I let my colleague know about it and when he tried it out a day or two later, he was getting an error message I hadn’t myself seen:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;There has been an error while processing the form.&lt;/p&gt;    &lt;p&gt;Click &lt;b&gt;Continue&lt;/b&gt; to resume filling out the form. You may want to check your form data for errors.&lt;/p&gt;    &lt;p&gt;Click &lt;b&gt;Start Over&lt;/b&gt; to load a new copy of the form.&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Show error details&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;When I browsed the Details of the error message, InfoPath Forms Services showed me this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;An error occurred accessing a data source.&lt;/p&gt;    &lt;p&gt;An entry has been added to the Windows event log of the server.      &lt;br /&gt;&lt;strong&gt;Log ID&lt;/strong&gt;: 5566&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Not much help there, but I kept trying to figure this out.&amp;#160; I tried from different browsers (same error) and from different PCs (still same).&lt;/p&gt;  &lt;p&gt;I got the bright idea to check the settings in the Data Connection in the InfoPath template I’d designed, but everything looked the same – even the URL that I was using to retrieve an XML representation of the List data (according to this helpful blog entry on “&lt;a href="http://www.sharepointblogs.com/dwise/archive/2008/01/10/accessing-sharepoint-list-data-as-xml.aspx"&gt;Accessing SharePoint List Data as XML&lt;/a&gt;” and “&lt;a href="http://blogs.msdn.com/infopath/archive/2007/01/15/populating-form-data-from-sharepoint-list-views.aspx"&gt;Populating form data from SharePoint List Views&lt;/a&gt;”).&amp;#160; However, when I tried completing the Data Connection wizard for this existing connection, I was getting blasted with this error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The file is not a valid XML file.      &lt;br /&gt;The file is not a valid XML document.       &lt;br /&gt;A document must contain exactly one root element.       &lt;br /&gt;&amp;#160; Line 1, Position 0&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I wondered if I’d messed up the permissions on the List, so I verified that I and my colleague had Read &amp;amp; Contribute permissions (so the Form would load), and I even added back the “System Account” with its Limited Access (using the “trick” documented in &lt;a href="http://objectmix.com/sharepoint/318846-need-help-sharepoint-system-account.html"&gt;this blog article&lt;/a&gt;).&amp;#160; Still nothing.&lt;/p&gt;  &lt;p&gt;When I tried to load that URL in a browser, the page it returned was blank, and even when I looked at the View Source, there wasn’t anything helpful there:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.0 Transitional//EN&amp;quot;&amp;gt;        &lt;br /&gt;&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;         &lt;br /&gt;&amp;lt;META content=&amp;quot;text/html; charset=windows-1252&amp;quot; http-equiv=Content-Type&amp;gt;&amp;lt;/HEAD&amp;gt;         &lt;br /&gt;&amp;lt;BODY&amp;gt;&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I retried this over and over for a few days, re-examining the URL in the Data Connection, triple-checking the GUIDs (thinking they must’ve gotten changed somehow during a recent tweak to the List), and wondering what I’d done wrong (or what had gotten horked up on the servers).&lt;/p&gt;  &lt;h2&gt;And the Solution Is…&lt;/h2&gt;  &lt;p&gt;Eventually I tried some googling on “A document must contain exactly one root element”, and finally returned to my old friends, the InfoPathDev.com and SharePointBlogs.com sites.&amp;#160; When I arrived back at the “&lt;a href="http://www.sharepointblogs.com/dwise/archive/2008/01/10/accessing-sharepoint-list-data-as-xml.aspx"&gt;Accessing SharePoint List Data as XML&lt;/a&gt;” article, one of the comments jumped out at me:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;I can't get this to work on a List that &lt;strong&gt;contains a Lookup field&lt;/strong&gt;.&amp;#160; I just get a blank page in the browser. Have you encountered this too? Any ideas?&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Bingo!&amp;#160; One of the recent tweaks I’d made was to convert a field in the list from using the “Choice” data type to the “Lookup” data type.&amp;#160; (Note: using a Lookup to a separate List enables me to delegate maintenance of that list of Choices to my team members, without asking them to muddle around in the bowels of my List’s Column settings.)&lt;/p&gt;  &lt;p&gt;All I had to do was to remove the one Lookup field from the View I was retrieving in this Data Connection, and the web Form started working again (without any changes or re-Publishing necessary, even!).&amp;#160; I even confirmed that the URL, when used in a browser, would return a readable XML document (though you have to View Source on the returned page, which looks just as blank in IE8 as the failing one).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Lesson&lt;/strong&gt;: if you’re going to leverage SharePoint Lists as XML data sources in your InfoPath Forms, make sure that the View you select does NOT include a Lookup field.&amp;#160; I &lt;em&gt;told&lt;/em&gt; you this was obscure…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-309480105626246700?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/309480105626246700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=309480105626246700' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/309480105626246700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/309480105626246700'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/11/infopath-forms-error-one-of-most.html' title='InfoPath forms error – one of the most obscure I’ve ever seen…'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-1413422424846589222</id><published>2008-11-22T09:32:00.001-08:00</published><updated>2008-11-22T09:32:09.555-08:00</updated><title type='text'>Obama White House - starting to feel a lot like Christmas</title><content type='html'>I'm getting awfully excited about the team that Obama is building.  Biden's track record &amp; poise, the behind-the-scenes bulldog who's going to be chief of staff, Clinton's abilities/intelligence, Richardson's sheer ability to articulate...  It's like the Bizarro world version of the Bush White House.

Especially after the past two years' painfully-drawn out campaigning, the forced antagonism, the hyper scrutiny of every little difference between presidential candidates.  Now, to see some of the strongest, smartest Democratic candidates all coming together to form such a solid team - it's like this is the reward for sufering the last couple of decades of rampant Republican deconstructivism.

Actually, the first thought when I realized that we had these five (and others) I'm the same cabinet was, "this is starting to make me think of The West Wing [the fantasy White House that most of us had wished was really running the country]" - above all, with more collected intelligence and good intentions than I could've hoped would come together to lead this country.

I've been saying for the last couple if years that I'd be happy with a president that accomplished exactly *nothing* during their term, after the retarded clearcutting &amp; international embarrassment of the tenure of the Connecticut Chimp.  Now I'm actually looking forward to not just a period of healing from the road rash W has left behind, but real improvement in the lives of significant numbers of people (both inside and outside the US) that really *need* the help [instead of just lining the pockets of those who've already enriched themselves at the expense of the hard workers whose backs bore the burden of the conquistadors].

I'm not quite retardedly naive to think this will be a scandal- or failure-free era, but it's awesome to not have to grit my teeth every time the president is about to open his mouth and prove how "special" he really is. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-1413422424846589222?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/1413422424846589222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=1413422424846589222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1413422424846589222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1413422424846589222'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/11/obama-white-house-starting-to-feel-lot.html' title='Obama White House - starting to feel a lot like Christmas'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-9204954815352449465</id><published>2008-10-31T00:01:00.001-07:00</published><updated>2008-10-31T00:01:06.216-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data security'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS'/><category scheme='http://www.blogger.com/atom/ns#' term='general security'/><title type='text'>Can non-Microsoft ERM (electronic rights management) be integrated into MOSS 2007?</title><content type='html'>&lt;p&gt;Fascinating question: can an organization that has deployed MOSS 2007 plug in another ERM/IRM (Electronic Rights Management) technology into the MOSS back-end, so that documents downloaded from MOSS would be automatically protected with that non-Microsoft ERM technology?&lt;/p&gt;  &lt;p&gt;MOSS 2007 (aka SharePoint 2007) provides integration with the Microsoft Information Rights Management (IRM) technology – any documents that are uploaded to an “IRM-enabled” Document Library will automatically be (encrypted and) protected with a specific IRM policy whenever that document is downloaded again.&amp;#160; This depends both on the Microsoft implementation of IRM (RMS) policies (known as “&lt;a href="http://msdn.microsoft.com/library/ms499244.aspx"&gt;Information Management Policy&lt;/a&gt;” in the MOSS SDK) as well as the inclusion of the Microsoft IRM “lockbox” (security processor) library on the MOSS server farm.&amp;#160; As I understand it, the procedure is basically:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;MOSS receives the download request from a remote client &lt;/li&gt;    &lt;li&gt;MOSS looks up the information management policy that is associated with the document’s List or Content Type (depending where the policy is applied) &lt;/li&gt;    &lt;li&gt;MOSS calls an instance of the IRM security processor (&lt;a href="http://office.microsoft.com/en-us/sharepointserver/HA101541481033.aspx"&gt;installed with the RMS Client on the front-end servers&lt;/a&gt;) to (a) encrypt the document, (b) generate the IRM license based on the associated policy, and (c) encrypt the content encryption key with appropriate RM Server’s public key.&amp;#160; &lt;/li&gt;    &lt;li&gt;MOSS delivers the protected document to the remote client – otherwise the same way that it would deliver an unprotected document. &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Guessing How Third-Party ERM Could Integrate Into MOSS&lt;/h2&gt;  &lt;p&gt;So theoretically, for a third-party ERM solution to properly intercept the steps in this sequence:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the MOSS server would have to request a method/API that is “pluggable” &lt;/li&gt;    &lt;li&gt;the MOSS server would have to support the ability to “plug” alternative ERM policy services in place of the native Microsoft IRM policy services &lt;/li&gt;    &lt;li&gt;the MOSS server would have to support the ability to “plug” an alternative security processor in place of the native Microsoft RM security processor &lt;/li&gt;    &lt;li&gt;the ERM solution would have to implement the pluggable responder for the “policy lookup” service, as well as a replacement UI and business logic framework for the server-side ERM policy “creation/assignment” capability that MOSS provides for IRM &lt;/li&gt;    &lt;li&gt;the ERM solution would have to support a thread-safe, multi-threaded, rock-solid-stable security processor that could run in a potentially high-volume server environment &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Given how much effort Microsoft has gone to in the past couple of years (not without external incentives, of course) to make available and document the means for ISV’s to interoperate with Microsoft client and server technologies, I’d figured there must be some “open protocol” documentation that documents how an ISV would create compatible ERM components to plug into the appropriate locations in a MOSS environment.&lt;/p&gt;  &lt;p&gt;I scoured the SharePoint protocols specifications, but there were no specific protocols documents, nor any mention of “information management” in any of the overview documents.&lt;/p&gt;  &lt;p&gt;There are some occasional references in the Microsoft Forums and elsewhere that hint at details that &lt;strong&gt;might&lt;/strong&gt; be relevant to a third-party ERM plugin for MOSS, but I can’t tell if this is actually related or if I’m jus chasing spectres:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://social.technet.microsoft.com/forums/en-US/sharepointecm/thread/302f7aad-f9d3-4f48-9484-5b5ad9fa1ec2/"&gt;Custom IRM Protector&lt;/a&gt; (forum post)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/ms458245.aspx"&gt;Information Rights Management in Windows SharePoint Services Overview&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Aha!&amp;#160; It Appears the Answer is “Yes”&lt;/h2&gt;  &lt;p&gt;(I thought about erasing and rewriting the above, but there’s probably someone somewhere who thinks the same was I do about this, so I’ll leave it and just share my new insight below).&lt;/p&gt;  &lt;p&gt;As always, I really should’ve started with the WSS 3.0 SDK and &lt;em&gt;then&lt;/em&gt; branched out into the MOSS SDK and other far-off lands.&lt;/p&gt;  &lt;p&gt;It turns out that the WSS SDK had the “secret” locked up in a page entitled “&lt;a href="http://msdn.microsoft.com/library/ms439253.aspx"&gt;Custom IRM Protectors&lt;/a&gt;” (not to be confused with the forum post linked above).&amp;#160; My theory above didn’t nearly guess correctly, but it most closely resembled the “Autonomous Protector”:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Create an autonomous protector if you want the protector to have total control over how the protected files are rights-managed. The autonomous protector has full control over the rights-management process, and can employ any rights-management platform. Unlike the process with an integrated protector, when Windows SharePoint Services invokes an autonomous protector, it passes the specific rights that the user has to the document. Based upon these rights, an autonomous protector is responsible for generating keys for the document and creating rights-managed metadata in the correct format.&lt;/p&gt;    &lt;p&gt;The autonomous protector and the client application must use the same rights-management platform.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So for a third-party ERM vendor to support an integrated experience in MOSS, while still using its non-Microsoft ERM client (i.e. &lt;em&gt;not&lt;/em&gt; the Microsoft RMS Client), it would have to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;provide a COM component on each MOSS web server that implements the I_IrmProtector interface and an &lt;a href="http://msdn.microsoft.com/library/aa544332.aspx"&gt;I_IrmPolicyInfo_Class&lt;/a&gt; object (analogous to my theorized “alternative ERM policy service”).&lt;/li&gt;    &lt;li&gt;provide a rights management platform that protects (at the server) in a way that’s compatible with protections enforced by their rights management client (e.g. an alternative security processor available either locally or remotely from each MOSS web server)&lt;/li&gt;    &lt;li&gt;override the default “integrated protectors” for Microsoft Office document types, and (presumably) support the ability to protect the Microsoft Office document types with the autonomous protector(s)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If I’m reading this right, then with a server-accessible rights management platform and one or more autonomous protectors, MOSS would be able to handle the rest of the required functionality: policy storage, UI, management interfaces (business logic), etc.&lt;/p&gt;  &lt;p&gt;Now I wonder if anyone has actually implemented this support in their ERM solution…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-9204954815352449465?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/9204954815352449465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=9204954815352449465' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/9204954815352449465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/9204954815352449465'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/10/can-non-microsoft-erm-electronic-rights.html' title='Can non-Microsoft ERM (electronic rights management) be integrated into MOSS 2007?'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-1852869385086661291</id><published>2008-10-29T12:02:00.000-07:00</published><updated>2008-10-31T00:03:32.421-07:00</updated><title type='text'>100 Mile Constitution Free Zone</title><content type='html'>&lt;a href="http://www.emergentchaos.com/archives/2008/10/100_mile_constitution_fre.html"&gt;http://www.emergentchaos.com/archives/2008/10/100_mile_constitution_fre.html&lt;/a&gt;&lt;p&gt;This is pretty ridiculous abuse of power, and of opportunistic  broadening of the interpretation of what must've been more narrowly  defined laws. Seems pretty typical under the Stalinist (er, Bush) 
regime.  How's about a little regime change on the domestic front eh?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-1852869385086661291?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/1852869385086661291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=1852869385086661291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1852869385086661291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/1852869385086661291'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/10/100-mile-constitution-free-zone.html' title='100 Mile Constitution Free Zone'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-6686272659365210065</id><published>2008-09-28T13:15:00.000-07:00</published><updated>2008-09-28T13:29:14.768-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>"you most closely resemble survey respondents within the Omnivores typology group"</title><content type='html'>Apparently I too am a technology/information Omnivore, according to the &lt;a href="http://www.pewinternet.org/quiz/index.asp"&gt;Pew Internet &amp;amp; American (?) Life project&lt;/a&gt;.

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Basic Description&lt;/strong&gt;
Members of this group use their extensive suite of technology tools to do an enormous range of things online, on the go, and with their cell phones. Omnivores are highly engaged with video online and digital content. Between blogging, maintaining their Web pages, remixing digital content, or posting their creations to their websites, they are creative participants in cyberspace.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Defining Characteristics&lt;/strong&gt;
You might see them watching video on an iPod. They might talk about their video games or their participation in virtual worlds the way their parents talked about their favorite TV episode a generation ago. Much of this chatter will take place via instant messages, texting on a cell phone, or on personal blogs. Omnivores are particularly active in dealing with video content. Most have video or digital cameras, and most have tried watching TV on a non-television device, such as a laptop or a cell phone.&lt;/p&gt;  &lt;p&gt;Omnivores embrace all this connectivity, feeling confident in how they manage information and their many devices. This puts information technology at the center of how they express themselves, do their jobs, and connect to their friends.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;When I read this description, it reminded me of something my wife Robin has repeatedly pointed out about me: I am one of the least social people she knows.  I rarely make social plans with anyone (including her), I don't naturally or voluntarily engage with people outside of work, and I am quite comfortable (or at least not dissatisfied) staying home with my TV, laptop and dogs.&lt;/p&gt;&lt;p&gt;So how to reconcile these two states of being - the "meatspace" Mike, who doesn't engage in any social contact, and the "cyberspace" Mike, who engages with strangers, colleagues and friends with nary a second thought, on a frequent, bleeding edge basis?  I have to assume that the cyberspace activities of an Omnivore are not just a pleasant and easy means of interacting with friends/family/colleagues, but are in part a way of shielding ourselves from the demands of the meatspace environment where the interactions are somehow (cf. Introvert) more draining, demanding and threatening.&lt;/p&gt;&lt;p&gt;I am the same person, but in these differing situations I am able to engage in much different ways - and it appears that I'm on a trajectory that will increase the divergence between my social and cyber personalities.&lt;/p&gt;&lt;p&gt;I don't know what to make of that - whether it's a natural progression of the aging Introvert, or if there's some progressive neurochemical change that's making it harder to engage in person (and thus I'm biased more towards the distant/electronic/asynchronous interaction), or maybe I just don't have the strength, adrenaline and childish curiosity that I did in my 20's.
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Apparently I too am a technology/information Omnivore, according to the &lt;a href="http://www.pewinternet.org/quiz/index.asp"&gt;Pew Internet &amp;amp; American (?) Life project&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-6686272659365210065?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/6686272659365210065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=6686272659365210065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6686272659365210065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6686272659365210065'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/09/you-most-closely-resemble-survey.html' title='&quot;you most closely resemble survey respondents within the Omnivores typology group&quot;'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-205756484043281017</id><published>2008-09-09T16:21:00.001-07:00</published><updated>2008-09-09T16:21:54.321-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='general security'/><title type='text'>DLL Injection in Windows: what security countermeasures can you use?</title><content type='html'>&lt;h2&gt;Manage the Administrators group &lt;/h2&gt;  &lt;p&gt;Examine any default install of Windows since NT4 SP6.&amp;#160; You’ll notice that the &lt;strong&gt;SeDebugPrivilege&lt;/strong&gt; is assigned by default only to the .\Administrators local group of the Windows host.&amp;#160; While this isn’t exactly unusual for users to be members of Administrators on their own PC, don’t think that &lt;em&gt;every&lt;/em&gt; user or process automatically gets this capability in Windows.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;a href="http://lh4.ggpht.com/mikesmithlonergan/SMcE-dUPekI/AAAAAAAAAkY/6kD5Ra8Z4xk/s1600-h/j0400849%5B6%5D.jpg"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="cuffed" border="0" alt="cuffed" align="right" src="http://lh4.ggpht.com/mikesmithlonergan/SMcFAUyzGqI/AAAAAAAAAkc/Z0EZWYY0M1s/j0400849_thumb%5B4%5D.jpg?imgmax=800" width="164" height="111" /&gt;&lt;/a&gt;Countermeasure&lt;/u&gt;: If you want to assert an explicit distinction between those who do and do not have the &lt;strong&gt;SeDebugPrivilege&lt;/strong&gt; on a Windows system, explicitly manage the membership of the Administrators local group.&amp;#160; This is especially useful (and applicable) to Windows Servers, where most of your users won’t have (or have need for) this membership.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;How to implement&lt;/u&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;run the &lt;strong&gt;net localgroup&lt;/strong&gt; command locally e.g. with these parameters: “&lt;strong&gt;net localgroup Administrators NAME_OF_USER_OR_GROUP_TO_REMOVE /Delete&lt;/strong&gt;” (or run it remotely via a remote-shell tool such as &lt;a target="_blank" href="http://technet.microsoft.com/sysinternals/bb896649.aspx"&gt;psexec.exe&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;configure a Group Policy (e.g. using Active Directory group policy) that sets the membership of the &lt;em&gt;Administrators&lt;/em&gt; group using the &lt;strong&gt;Restricted Groups&lt;/strong&gt; security setting (either &lt;a target="_blank" href="http://www.microsoft.com/technet/security/prodtech/windowsxp/secwinxp/xpsgch03.mspx#E26BG"&gt;overwriting the existing membership&lt;/a&gt; or &lt;a target="_blank" href="http://support.microsoft.com/default.aspx?kbid=810076"&gt;incrementally adding/deleting&lt;/a&gt; specified security principals) &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Manage the SeDebugPrivilege&lt;/h2&gt;  &lt;p&gt;The obvious flipside of the default &lt;strong&gt;SeDebugPrivilege&lt;/strong&gt; assignment is that you can change the security principals to whom the privilege is assigned.&amp;#160; In fact, if you review (or have implemented) the Microsoft Security &lt;a target="_blank" href="http://technet.microsoft.com/solutionaccelerators"&gt;Security Accelerators&lt;/a&gt; for Windows (&lt;a target="_blank" href="http://go.microsoft.com/fwlink/?linkid=89108"&gt;Windows XP&lt;/a&gt;, &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?linkid=89111"&gt;Windows Server 2003&lt;/a&gt;, &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?linkid=87230"&gt;Windows Vista&lt;/a&gt;, &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkId=92550"&gt;Windows Server 2008&lt;/a&gt;), you’ll find they recommend &lt;/p&gt;  &lt;p&gt;&lt;u&gt;Countermeasure&lt;/u&gt;: remove the Administrators group from the &lt;strong&gt;SeDebugPrivilege&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;How to implement&lt;/u&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;run the &lt;strong&gt;ntrights.exe&lt;/strong&gt; &lt;a target="_blank" href="http://www.ss64.com/nt/ntrights.html"&gt;Resource Kit command-line tool&lt;/a&gt; locally e.g. with these parameters: “&lt;strong&gt;ntrights.exe –u Administrators –r SeDebugPrivilege&lt;/strong&gt;” (or run it remotely via a remote-shell tool such as &lt;a target="_blank" href="http://technet.microsoft.com/sysinternals/bb896649.aspx"&gt;psexec.exe&lt;/a&gt;) &lt;/li&gt;    &lt;li&gt;configure a Group Policy (e.g. using Active Directory group policy) that removes all security principals that are assigned the &lt;strong&gt;SeDebugPrivilege&lt;/strong&gt; privilege &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Run Apps, Services as lesser-privileged user &lt;/h2&gt;  &lt;p&gt;So the first two BKMs are great and all, but there are still lots of situations where you can’t make these blanket changes to the entire OS (though thankfully virtualization is reducing these “shared system” problems).&amp;#160; You may have to find ways to launch one or more processes with different security context or privileges than the rest of the system – sometimes having to run something with more privilege than the rest of the system (e.g. try &lt;a target="_blank" href="http://sourceforge.net/projects/sudowin"&gt;Sudo for Windows&lt;/a&gt;), but usually wanting to strip privilege and permissions &lt;em&gt;away&lt;/em&gt; from specific processes.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;a href="http://lh4.ggpht.com/mikesmithlonergan/SMcFBmUK0XI/AAAAAAAAAkg/WMI1_2CJGdM/s1600-h/j0290885%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; margin: 0px 5px 0px 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="jailbird" border="0" alt="jailbird" align="left" src="http://lh4.ggpht.com/mikesmithlonergan/SMcFDhsyR4I/AAAAAAAAAkk/487NkZ11O18/j0290885_thumb%5B4%5D.png?imgmax=800" width="84" height="77" /&gt;&lt;/a&gt;Countermeasure&lt;/u&gt;: use Windows’ Software Restriction Policy (aka SRP or “&lt;a target="_blank" href="http://msdn.microsoft.com/library/ms722425.aspx"&gt;SAFER&lt;/a&gt;”) to strip the Token of as many groups and privileges as the application can tolerate.&amp;#160; You don’t have to set a restrictive policy for the whole system – you can set this on an application-by-application basis (which can be practical in server environments, where you may only have a few critical applications to have to protect from each other).&lt;/p&gt;  &lt;p&gt;&lt;u&gt;How to implement&lt;/u&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Download and use &lt;a target="_blank" href="http://blogs.msdn.com/michael_howard/archive/2006/05/07/592136.aspx"&gt;Michael Howard’s SetSAFER&lt;/a&gt; application, which will strip varying levels of privileges and groups from the security token assigned to the process (thus making it more difficult for the process to access privileged objects in Windows).&amp;#160; If you want to dig into the code for this, and if the source code isn’t available, you can take a look at the code included in &lt;a target="_blank" href="http://web.archive.org/web/20060130155529/msdn.microsoft.com/library/en-us/dncode/html/secure11152004.asp"&gt;the original article&lt;/a&gt; (on which SetSAFER was based), or fire up &lt;a target="_blank" href="http://www.dotnetreflector.com/"&gt;DotNet Reflector&lt;/a&gt; and inspect the MSIL for the SetSAFER “executable”. &lt;/li&gt;    &lt;li&gt;You could also try “&lt;a target="_blank" href="http://technet.microsoft.com/sysinternals/bb897553.aspx"&gt;psexec –l&lt;/a&gt;” (which implements one of the approaches taken by SetSAFER – one of the “stripped-down profiles”). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Something about this feels like I’ve missed another approach that should be mentioned in this context, but I’m sure there’s smarter folks than I reading this who can add any missing details to the picture.&amp;#160; Thanks, and have fun with this!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-205756484043281017?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/205756484043281017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=205756484043281017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/205756484043281017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/205756484043281017'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/09/dll-injection-in-windows-what-security.html' title='DLL Injection in Windows: what security countermeasures can you use?'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/mikesmithlonergan/SMcFAUyzGqI/AAAAAAAAAkc/Z0EZWYY0M1s/s72-c/j0400849_thumb%5B4%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-5857172509844965087</id><published>2008-07-23T20:57:00.000-07:00</published><updated>2008-07-23T20:59:00.955-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Well that's a sucky answer...</title><content type='html'>I was really hoping for someone a little less useless - but I'm sure my wife would agree with how useless this figured out I am:

&lt;a href="http://www.liquidgeneration.com/Media/Games/The_Ultimate_Star_Wars_Personality_Test/" target="_blank"&gt;&lt;img src="http://www.liquidgeneration.com/content/190407/Card_C3PO.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-5857172509844965087?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/5857172509844965087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=5857172509844965087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5857172509844965087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/5857172509844965087'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/07/well-thats-sucky-answer.html' title='Well that&apos;s a sucky answer...'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-4127678435912391661</id><published>2008-06-10T00:12:00.001-07:00</published><updated>2008-06-10T00:12:25.469-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random rants'/><title type='text'>Installshield – great for developers, sucks ass for victims (aka everyone else)</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Holy crap, what a safari this is turning into.&amp;#160; I’m trying to uninstall a piece of software (the Intel Debugger v9.1.x) that was apparently packaged with Installshield.&amp;#160; However, every time I tell Windows to uninstall it, it returns to me the following error:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/mikesmithlonergan/SE4pV_t0F4I/AAAAAAAAAiw/MI662lVZkJY/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="148" alt="image" src="http://lh4.ggpht.com/mikesmithlonergan/SE4pWFF9gBI/AAAAAAAAAi0/iPXVFBH2lAM/image_thumb%5B1%5D.png?imgmax=800" width="348" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Idiot move #1: look for help from InstallShield Corp&lt;/h2&gt;  &lt;p&gt;So I Google for this error and come up with a half-dozen links to various “support” articles from InstallShield and related on how to resolve this error.&amp;#160; It tells me to &lt;a href="http://knowledge.macrovision.com/selfservice/viewContent.do?externalId=Q108158&amp;amp;sliceId=1" target="_blank"&gt;download&lt;/a&gt; &lt;a href="http://forums.support.roxio.com/lofiversion/index.php/t1129.html" target="_blank"&gt;various&lt;/a&gt; &lt;a href="http://knowledge.macrovision.com/selfservice/viewContent.do?externalId=Q108322&amp;amp;sliceId=1" target="_blank"&gt;versions&lt;/a&gt; &lt;a href="http://community.installshield.com/showthread.php?t=143072" target="_blank"&gt;of&lt;/a&gt; &lt;a href="http://knowledge.macrovision.com/selfservice/viewContent.do?externalId=Q108515" target="_blank"&gt;their&lt;/a&gt; runtimes and engine installers, none of which make any improvement in the situation.&lt;/p&gt;  &lt;p&gt;I went away for a while, came back again today and tried a whole different attack:&lt;/p&gt;  &lt;h2&gt;Forget the vendor, just debug it yourself (using Process Monitor)&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Launch &lt;a href="http://technet.microsoft.com/sysinternals/bb896645.aspx"&gt;Process Monitor&lt;/a&gt;, filtering out all running processes except &lt;strong&gt;msiexec.exe&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Near the end we finally see some activity that’s related to the problem:&lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New"&gt;MsiExec.exe&amp;#160;&amp;#160;&amp;#160; RegQueryKey&amp;#160;&amp;#160;&amp;#160; HKCR\CLSID\{8B1670C8-DC4A-4ED4-974B-81737A23826B}\LocalServer32       &lt;br /&gt;        &lt;br /&gt;MsiExec.exe&amp;#160;&amp;#160;&amp;#160; RegQueryValue&amp;#160;&amp;#160;&amp;#160; HKCR\CLSID\{8B1670C8-DC4A-4ED4-974B-81737A23826B}\LocalServer32\(Default)&amp;#160;&amp;#160;&amp;#160; Data: C:\PROGRA~1\COMMON~1\INSTAL~1\Driver\8\INTEL3~1\IDriver.exe&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Then there are four attempts to launch the IDriver.exe, all of which immediately halt&lt;/li&gt;    &lt;li&gt;Lastly, there’s an update to the MSI log file which says this:&lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;h6&gt;1: The InstallScript engine on this machine is older than the version required to run this setup.&amp;#160; If available, please install the latest version of ISScript.msi, or contact your support personnel for further assistance. &lt;/h6&gt;    &lt;h6&gt;=== Logging stopped: 09/06/2008&amp;#160; 14:02:26 ===&lt;/h6&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;At least I know which file is “older than the version required”.&lt;/p&gt;  &lt;p&gt;However, the next problem is figuring out how to get the ‘right one’ executed in its place:&lt;/p&gt;  &lt;h2&gt;&lt;/h2&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;Where Your Hero* Learns Just How Screwed Up InstallShield’s Model Really Is&lt;/h2&gt;  &lt;p&gt;&lt;em&gt;* aka “just some dick on the Internet”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;From what I can tell, Installshield only cares about one person: the dork who blindly builds the Installer package for their one little application.&amp;#160; Apparently, if you need to call on the Installshield components, don’t ever even try to discover whether they’re already installed on the target.&amp;#160; Instead, assume that they must *not* be installed (presumably because every developer on the planet has the privilege of being the first to get software installed on each PC where it’s being used), and always install a copy of some Installshield dependency on the end-user’s PC.&amp;#160; And then for good measure, make sure that there’s a hard-coded dependency on the version of the InstallShield bits that went with the installer.&lt;/p&gt;  &lt;p&gt;They sure as hell don’t seem to care about the lowly end-user or IT administrator, who might have to actually *deal* with the nightmare of conflicting/overwriting/installed-to-every-conceivable-corner-of-the-filesystem versions of these hard-coded InstallShield dependencies.&lt;/p&gt;  &lt;p&gt;Just for s**ts and giggles, try this at home:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;fire up REGEDIT.EXE&lt;/li&gt;    &lt;li&gt;Press [Ctrl]-F to bring up the Search dialog&lt;/li&gt;    &lt;li&gt;Type Installshield and [Enter]&lt;/li&gt;    &lt;li&gt;Click the [F3] button a few dozen (or hundred) times&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;A bit more digging on my own system: &lt;/p&gt;  &lt;p&gt;Current version of IDriver.exe in the logged directory = 8.0.0.123&lt;/p&gt;  &lt;p&gt;One article in the InstallShield/Macrovision/Acresso library &lt;a href="http://knowledge.macrovision.com/selfservice/viewContent.do?externalId=Q108356" target="_blank"&gt;confirms&lt;/a&gt; the noted location is where the IDriver.exe version 7 or 8 should be found.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Once more, I downloaded and installed the latest InstallScript 8 package (which turns out to be the 8.0.0.123 I already had installed), so I then decided to try downloading all the later versions and install them one by one as well.&amp;#160; I was hoping that the Registry setting that resolves to this particular IDriver.exe would be overridden (at least in the “Version Independent ProgID” or something similar) by a later install.&amp;#160; Here’s one set of settings that I figured were related:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;CLSID: {8B1670C8-DC4A-4ED4-974B-81737A23826B}&lt;/li&gt;    &lt;li&gt;(Default) value: InstallShield InstallDriver&lt;/li&gt;    &lt;li&gt;AppID: {1BB3D82F-9803-4d29-B232-1F2F14E52A2E}&lt;/li&gt;    &lt;li&gt;LocalServer32: C:\PROGRA~1\COMMON~1\INSTAL~1\Driver\8\INTEL3~1\IDriver.exe&lt;/li&gt;    &lt;li&gt;ProgID: ISInstallDriver.InstallDriver.1&lt;/li&gt;    &lt;li&gt;VersionIndependentProgID: ISInstallDriver.InstallDriver&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Yep, after installing IScript9.msi, the CLSID under the entry HKCR\ISInstallDriver.InstallDriver changed to {B3EDE298-AE75-4A1C-AB7E-1B9229B77BBE}.&amp;#160; However, the uninstall “Fatal error” continued to crop up.&amp;#160; Apparently the fatal application’s uninstaller doesn’t chase the ProgIDs but some other reference instead.&lt;/p&gt;  &lt;p&gt;Then by some wild fortune, I happened to stumble on a very obscure directory in which the “later version” of the InstallScript MSI installer (isn’t there some irony embedded in that?) was actually still cached.&amp;#160; WHY this wasn’t available from the vendor’s own web site, I’ll never know.&amp;#160; However, installing this version of IScript.msi did overwrite the ProgID once again, and the version of IDriver.exe installed in the target location was 8.1.0.293.&lt;/p&gt;  &lt;p&gt;Somehow, finally, that did the trick.&amp;#160; Finally got that Installshield-driven crap off my system.&amp;#160; Trying to resist the impulse to wipe all traces of Installshield product off my system as well, and reminding myself that I could create this same hell for myself ten times over in so doing.&lt;/p&gt;  &lt;p&gt;So, apparently all it takes is for some ancient application to overwrite the better version of an “Installation Engine”, and all hell breaks loose.&amp;#160; I’m beginning to see why the Installshield product line has been bought and sold more times than… well, I’m drawing a blank on a family-friendly comparison, so let’s just say this was not one of the more profitable software businesses out there.&amp;#160; And no freakin’ wonder.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-4127678435912391661?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/4127678435912391661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=4127678435912391661' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/4127678435912391661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/4127678435912391661'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/06/installshield-great-for-developers.html' title='Installshield – great for developers, sucks ass for victims (aka everyone else)'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/mikesmithlonergan/SE4pWFF9gBI/AAAAAAAAAi0/iPXVFBH2lAM/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-7445348455115481354</id><published>2008-06-01T16:06:00.001-07:00</published><updated>2008-06-01T16:06:23.900-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSTO'/><category scheme='http://www.blogger.com/atom/ns#' term='.net coding'/><category scheme='http://www.blogger.com/atom/ns#' term='CodePlex'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>ComponentChk.cpp - I resolved my first C++ compiler "fatal error"!</title><content type='html'>&lt;p&gt;Yes, for those of you with even &lt;strong&gt;more&lt;/strong&gt; grey in your beard/hair than I, this is probably a "meh" event.&amp;nbsp; However, for me, who's always looked at C++ code and wondered how the H*** anyone could ever make sense of it, this is a big event.&amp;nbsp; [Patting myself on the back.]&lt;/p&gt; &lt;h2&gt;Situation&lt;/h2&gt; &lt;p&gt;I'm working on finishing up the Setup bootstrapper for my VSTO add-in &lt;a href="http://www.codeplex.com/Word2MediaWikiDotNET"&gt;Word2MediaWiki.NET&lt;/a&gt;.&amp;nbsp; I'm targeting Word 2003 &lt;strong&gt;and&lt;/strong&gt; Word 2007 (despite Microsoft's best efforts/worst neglect to the contrary), and I'm trying to achieve what many have done before, but which seemed impossible for me: allow the Setup.exe to detect which version of Word is installed, and then conditionally install the prerequisite software (i.e. the so-called Office PIAs) for whichever version of Word is discovered.&lt;/p&gt; &lt;p&gt;Problem 1: most folks in the VSTO space seem to think that, despite the fact that a version of the .NET framework is required to support VSTO, the Setup.exe that goes with your VSTO add-in install package should use &lt;strong&gt;UN&lt;/strong&gt;managed code to detect whether the pre-requisites are installed.&lt;/p&gt; &lt;p&gt;Problem 2: I know squat about writing unmanaged code.&lt;/p&gt; &lt;p&gt;Problem 3: Microsoft's VSTO &amp;amp; Office teams left it up as an exercise to the VSTO app developer to figure out how to assemble the amazing number of parts necessary to make a VSTO install work transparently to the end user.&lt;/p&gt; &lt;p&gt;Problem 4: There've been many articles written posthumously (I mean, long after VSTO v2 was released) on various aspects of automating VSTO-add-in installation, but none of them addressed the very inevitable scenario where the app developer needs to support both Word 2003 and Word 2007.&amp;nbsp; [Don't even *think* about pre-2003 versions of Office — you'd have to be clinically &lt;em&gt;insane&lt;/em&gt;.]&lt;/p&gt; &lt;h2&gt;Manna from heaven&lt;/h2&gt; &lt;p&gt;One ridiculously brave soul, Mark Hogan, actually took the time to not only figure out how to build such a conditional pre-requisite detection app in C++, but he was so overcome with glee that he beat Microsoft at something even they were too scared to do, that &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2860205&amp;amp;SiteID=1"&gt;he published the full set of source code and XML configuration files&lt;/a&gt; for the entire world to use.&lt;/p&gt; &lt;p&gt;Now, masochist that I am, I took it upon myself to try to integrate the code that Mark Hogan published into the existing code that I'd already slotted into my Office PIA bootstrapper files.&amp;nbsp; However, I didn't anticipate the foreseeable result that, because I'm coding this stuff in my spare time, and usually late at night, I would (a) not finish the integration work in one sitting, (b) forget what I'd originally set out to do and (c) forget to integrate any of the critical code that actually &lt;em&gt;performed&lt;/em&gt; the conditional logic.&lt;/p&gt; &lt;h2&gt;Mike chases his tail&lt;/h2&gt; &lt;p&gt;Miraculously, I was left with a .CPP file that would compile and that appeared to be significantly different from the original file I started from, &lt;strong&gt;and&lt;/strong&gt; that threw off an error code that created a spectacular wild goose-chase:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Arial"&gt;"Unable to satisfy all prerequisites for Word2MediaWikiDotNET.&amp;nbsp; Setup cannot continue until all system components have been successfully installed."&lt;/font&gt;  &lt;p&gt;&lt;font face="Arial"&gt;Details:&lt;/font&gt;  &lt;p&gt;&lt;font face="Arial"&gt;"Prerequisite check for system component Microsoft Office 2003/2007 Primary Interop Assemblies (Word Only) failed.&lt;/font&gt;  &lt;p&gt;&lt;font face="Arial"&gt;See the setup log file located at 'C:\DOCUME~1\msmithlo\LOCALS~1\Temp\VSD33.tmp\install.log' for more information."&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;And in the INSTALL.LOG file was the illusory answer:  &lt;blockquote&gt; &lt;p&gt;&lt;font face="Arial"&gt;Running external check with command 'C:\DOCUME~1\msmithlo\LOCALS~1\Temp\VSD33.tmp\Office2003PIAor2007_WordOnly\ComponentChk.exe' and parameters '/delete /save /word {1EBDE4BC-9A51-4630-B541-2561FA45CCC5}'&lt;/font&gt;  &lt;p&gt;&lt;font face="Arial"&gt;"Process exited with code 1607"&lt;/font&gt;  &lt;p&gt;&lt;font face="Arial"&gt;Setting value '1607 {int}' for property 'SupportedWordVersionInstalled'&lt;/font&gt;  &lt;p&gt;&lt;font face="Arial"&gt;…&lt;/font&gt;  &lt;p&gt;&lt;font face="Arial"&gt;Setting value '1607 {int}' for property 'PIAsRegistered'&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;This led me down the path of chasing InstallShield errors, since the only Google search results that looked at all related were &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2319433&amp;amp;SiteID=1"&gt;things&lt;/a&gt; &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1532589&amp;amp;SiteID=1"&gt;like&lt;/a&gt; &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2872773&amp;amp;SiteID=1"&gt;these&lt;/a&gt;.&amp;nbsp; After a few days of trying to figure out how the InstallShield scripting engine could be related to a Visual Studio SETUP.EXE or custom C++ application, I finally got my brain back and tried to isolate where in the code or configuration files the problem existed.&amp;nbsp; That led me to a line of C++ code that threw ERROR_UNKNOWN_COMPONENT, which as it turns out also shares the &lt;a href="http://msdn.microsoft.com/en-us/library/aa368542.aspx"&gt;1607 error/exit value&lt;/a&gt;.  &lt;p&gt;[The whole gruesome story is illustrated in the Bug I &lt;a href="http://www.codeplex.com/Word2MediaWikiDotNET/WorkItem/View.aspx?WorkItemId=10257"&gt;filed to myself here&lt;/a&gt;.]&lt;br&gt; &lt;h2&gt;Back to the original goal, with a new mission&lt;/h2&gt; &lt;p&gt;Once I realized what I'd left out of the C++ code, I quickly got it to the point where I could try compiling it.&amp;nbsp; Now a new mission emerged - how to debug a C++ compiler error?&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Terminal"&gt;C:\&amp;gt;cl.exe /Oxs /MT /GS ComponentChk.cpp advapi32.lib&lt;br&gt;Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86&lt;br&gt;Copyright (C) Microsoft Corporation.&amp;nbsp; All rights reserved. &lt;/font&gt; &lt;p&gt;&lt;font face="Terminal"&gt;ComponentChk.cpp&lt;br&gt;Microsoft (R) Incremental Linker Version 9.00.21022.08&lt;br&gt;Copyright (C) Microsoft Corporation.&amp;nbsp; All rights reserved. &lt;/font&gt; &lt;p&gt;&lt;font face="Terminal"&gt;/out:ComponentChk.exe&lt;br&gt;ComponentChk.obj&lt;br&gt;advapi32.lib&lt;br&gt;ComponentChk.obj : error LNK2019: unresolved external symbol __imp__WaitForInputIdle@8 referenced in function "int __cdecl MyStart(char const *,char const *)" (?MyStart@@YAHPBD0@Z)&lt;br&gt;ComponentChk.exe : fatal error LNK1120: 1 unresolved externals&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;That command line (&lt;strong&gt;cl.exe /Oxs /MT /GS ComponentChk.cpp advapi32.lib&lt;/strong&gt;) was derived from the original &lt;a href="http://msdn.microsoft.com/en-us/library/bb332051.aspx"&gt;article&lt;/a&gt; from which we were all working (or stumbling around half-blindly, it felt to me).&amp;nbsp; I just ran this without a second thought, assuming that since Mark Hogan didn't seem to mention any modifications to it, any errors it showed must've been my fault.&lt;/p&gt; &lt;p&gt;Where is &lt;strong&gt;"__imp__WaitForInputIdle@8&lt;/strong&gt;" I wondered?&amp;nbsp; It didn't show up in the source code when I searched for it, and nor did "&lt;strong&gt;int __cdecl MyStart&lt;/strong&gt;".&lt;/p&gt; &lt;p&gt;After staring at this for a while longer, I figured some substring searches would work, which after a few attempts finally showed me that I was actually looking for the code&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Terminal"&gt;WaitForInputIdle(pi.hProcess, INFINITE);&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;which is called in the function &lt;strong&gt;MyStart()&lt;/strong&gt;.&amp;nbsp; I tried some silly things first, of course, but I eventually realized that if &lt;strong&gt;WaitForInputIdle()&lt;/strong&gt; didn't exist as a named function in the source code, perhaps it existed in another library that wasn't yet connected to the code?&amp;nbsp; A quick &lt;a href="http://msdn.microsoft.com/en-us/library/ms687022.aspx"&gt;MSDN Library search told me&lt;/a&gt; this function was actually part of USER32.DLL, and it wasn't too painful a leap of logic to try adding USER32.LIB to the compilation parameters, like so:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Terminal"&gt;cl.exe /Oxs /MT /GS ComponentChk.cpp advapi32.lib user32.lib&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;And when I loaded up the now-successfully-compiled COMPONENTCHK.EXE into &lt;a href="http://www.dependencywalker.com/"&gt;DEPENDS.EXE&lt;/a&gt;, it confirmed exactly what I expected to see:&lt;/p&gt; &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="149" alt="image" src="http://lh4.ggpht.com/mikesmithlonergan/SEMrbqC6AYI/AAAAAAAAAio/jzNTWQP-DK0/image%5B4%5D.png?imgmax=800" width="461" border="0"&gt; &lt;/p&gt; &lt;p&gt;Mark, many thanks to you, and my apologies for &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3424088&amp;amp;SiteID=1"&gt;calling into question&lt;/a&gt; your mad C++ skillz.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-7445348455115481354?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/7445348455115481354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=7445348455115481354' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7445348455115481354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7445348455115481354'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/06/componentchkcpp-i-resolved-my-first-c.html' title='ComponentChk.cpp - I resolved my first C++ compiler &amp;quot;fatal error&amp;quot;!'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/mikesmithlonergan/SEMrbqC6AYI/AAAAAAAAAio/jzNTWQP-DK0/s72-c/image%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-7332335930221064329</id><published>2008-03-30T21:09:00.001-07:00</published><updated>2008-03-30T21:09:11.429-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wiki'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTO'/><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='VBA'/><category scheme='http://www.blogger.com/atom/ns#' term='.net coding'/><category scheme='http://www.blogger.com/atom/ns#' term='CodePlex'/><title type='text'>Do you Wiki? Word2MediaWiki.NET first release is live!</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.google.com/mikesmithlonergan/R_Bj5flVljI/AAAAAAAAAXI/fcAB2CwsIQQ/Snippy0001%5B5%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="134" alt="Snippy0001" src="http://lh4.google.com/mikesmithlonergan/R_Bj5vlVlkI/AAAAAAAAAXQ/xeBPKa9wNO0/Snippy0001_thumb%5B2%5D.jpg" width="416" align="right" border="0"&gt;&lt;/a&gt;&lt;!--EndFragment --&gt;&lt;/p&gt; &lt;p&gt;I just wanted to let my faithful readers know that I have finally completed a beta version of the Word2MediaWiki.NET add-in for Microsoft Word 2003.&lt;/p&gt; &lt;p&gt;This'll be useful to anyone that regularly contributes to &lt;a href="http://wikipedia.org"&gt;Wikipedia&lt;/a&gt;, or those that have a bunch of Word documents that they'd like to share on Wikipedia.&lt;/p&gt; &lt;p&gt;It's just as useful for any of the other hundreds of wikis that use the same server software as Wikipedia (known as &lt;a href="http://www.mediawiki.org/"&gt;MediaWiki&lt;/a&gt;), and it'll be of interest to those folks who've used &lt;a href="http://www.mediawiki.org/wiki/Extension:Word2MediaWikiPlus"&gt;Word2MediaWikiPlus&lt;/a&gt; (from whose VBA source code I converted much of the basis of Word2MediaWiki.NET).&lt;/p&gt; &lt;p&gt;Grab a copy here:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.codeplex.com/Word2MediaWikiDotNET" href="http://www.codeplex.com/Word2MediaWikiDotNET"&gt;http://www.codeplex.com/Word2MediaWikiDotNET&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And &lt;strong&gt;please&lt;/strong&gt;, let me know about any issues or experiences you have with it by posting a Discussion item here:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.codeplex.com/Word2MediaWikiDotNET/Thread/List.aspx" href="http://www.codeplex.com/Word2MediaWikiDotNET/Thread/List.aspx"&gt;http://www.codeplex.com/Word2MediaWikiDotNET/Thread/List.aspx&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-7332335930221064329?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/7332335930221064329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=7332335930221064329' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7332335930221064329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7332335930221064329'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/03/do-you-wiki-word2mediawikinet-first.html' title='Do you Wiki? Word2MediaWiki.NET first release is live!'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-3974378285918500711</id><published>2008-03-07T11:30:00.001-08:00</published><updated>2008-03-07T11:30:53.424-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random rants'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Random distraction of the day: play the Red cards</title><content type='html'>&lt;p align="center" style="font-family: arial;"&gt;&lt;a href="http://www.wizards.com/magic/playmagic/whatcolorareyou.asp" target="_blank"&gt;&lt;img src="http://www.wizards.com/magic/images/whatcolor_isred.jpg" border="0" /&gt;&lt;br/&gt;&lt;b&gt;Take the Magic: The Gathering 'What Color Are You?' Quiz.&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-3974378285918500711?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/3974378285918500711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=3974378285918500711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3974378285918500711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/3974378285918500711'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/03/random-distraction-of-day-play-red.html' title='Random distraction of the day: play the Red cards'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-7647451923928492696</id><published>2008-03-04T10:43:00.001-08:00</published><updated>2008-03-04T10:43:43.356-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random rants'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>ATOM, RSS &amp; feeds - have YOU ever known which was the "right" one to choose??</title><content type='html'>&lt;p&gt;What a friggin relief:&lt;/p&gt; &lt;p&gt;&lt;a title="http://dev.live.com/blogs/devlive/archive/2008/02/27/213.aspx" href="http://dev.live.com/blogs/devlive/archive/2008/02/27/213.aspx"&gt;http://dev.live.com/blogs/devlive/archive/2008/02/27/213.aspx&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;"Microsoft is making a large investment in unifying our developer platform protocols for services on the open, standards-based Atom format (&lt;a href="http://www.ietf.org/rfc/rfc4287.txt"&gt;RFC 4287&lt;/a&gt;) and the Atom Publishing Protocol (&lt;a href="http://www.ietf.org/rfc/rfc5023.txt"&gt;RFC 5023&lt;/a&gt;)."&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Finally I can try to stop worrying about which of the &lt;a href="http://www.avsforum.com/avs-vb/showthread.php?t=803376"&gt;jillion&lt;/a&gt; "feed types" I should select to make sure that the feed subscriptions I've amassed are as "future-proof" as possible.&amp;nbsp; Good gravy, the number of times I've gone to subscribe to a certain feed, only to be faced with the choice among 2-6 different feeds (all apparently for the same set of articles) is just &lt;a href="http://en.wikipedia.org/wiki/American_and_British_English_spelling_differences"&gt;paralyzing&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Do I want the one with RSS in the final suffix?&lt;/li&gt; &lt;li&gt;Should I try to figure out which protocol is most popular/widest supported?&lt;/li&gt; &lt;li&gt;Do I need to try to figure out which one provides the most metadata with each downloaded article?&lt;/li&gt; &lt;li&gt;And which one might be sending the least data back to the author?&amp;nbsp; [This &lt;strong&gt;is&lt;/strong&gt; ParanoidMike after all… wouldn't want to disappoint my fans with a rare moment of rational thinking now]&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I don't normally like any one behemoth [aside: wasn't that one of Godzilla's opponent?] dictating to me a single format for anything, and I'm especially wary of any such edicts from Microsoft (having been privy to watching the sausage get made there for six years), but any time they make such an unequivocal commitment to an RFC standard and away from their "&lt;a href="http://www.google.com/search?hl=en&amp;amp;safe=off&amp;amp;client=firefox-a&amp;amp;rls=org.mozilla%3Aen-US%3Aofficial&amp;amp;hs=glw&amp;amp;q=not+built+here&amp;amp;btnG=Search"&gt;not built here&lt;/a&gt;" crap, I'm all in favour.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-7647451923928492696?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/7647451923928492696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=7647451923928492696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7647451923928492696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7647451923928492696'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/03/atom-rss-feeds-have-you-ever-known.html' title='ATOM, RSS &amp;amp; feeds - have YOU ever known which was the &amp;quot;right&amp;quot; one to choose??'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-2316527800554892409</id><published>2008-03-02T16:45:00.001-08:00</published><updated>2008-03-02T16:45:13.316-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net coding'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='MindManager'/><title type='text'>MindManager 7 ToDoList AddIn development Part 6: the Mysteries of COM interop</title><content type='html'>&lt;p&gt;Sometimes there are inevitable mysteries uncovered when writing code.&amp;nbsp; Well, I've bumped into quite a rich source of mysteries in trying to use an aspect of the MindManager object model that thunks through a brittle COM interop module, known as CmjDocumentCollectionComObject.&amp;nbsp; Here's just a couple of examples that have come up recently:&lt;/p&gt; &lt;h3&gt;"unable to create document"&lt;/h3&gt; &lt;p&gt;Here is the 'offending' code:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="color: rgb(0,0,255)"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;static&lt;/span&gt; MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt; GetMap(&lt;span style="color: rgb(0,0,255)"&gt;string&lt;/span&gt; filename)
{
    MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt; toDoListMap;
    MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Documents&lt;/span&gt; maps;
    &lt;span style="color: rgb(0,0,255)"&gt;string&lt;/span&gt; toDoListMapFullPath = &lt;span style="color: rgb(43,145,175)"&gt;Connect&lt;/span&gt;.applicationObject.get_Path(MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;MmDirectory&lt;/span&gt;.mmDirectoryMyMaps) + filename;
    maps = &lt;span style="color: rgb(43,145,175)"&gt;Connect&lt;/span&gt;.applicationObject.get_Documents(&lt;span style="color: rgb(0,0,255)"&gt;true&lt;/span&gt;);&lt;span style="color: rgb(0,128,0)"&gt;
&lt;/span&gt;    &lt;span style="color: rgb(0,0,255)"&gt;try&lt;/span&gt; &lt;span style="color: rgb(0,128,0)"&gt;// open a ToDoList map
&lt;/span&gt;    {
        toDoListMap = maps.Open(toDoListMapFullPath, &lt;span style="color: rgb(43,145,175)"&gt;String&lt;/span&gt;.Empty, &lt;span style="color: rgb(0,0,255)"&gt;true&lt;/span&gt;); &lt;span style="color: rgb(0,128,0)"&gt;// here's where the COMException is raised&lt;/span&gt;
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;Here is the exception raised:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;System.Runtime.InteropServices.COMException occurred&lt;br&gt;&amp;nbsp; Message="Object 'CmjDocumentCollectionComObject' reports an error: 'unable to create document'"&lt;br&gt;&amp;nbsp; Source="MindManager.Application.7"&lt;br&gt;&amp;nbsp; ErrorCode=-2147220992&lt;br&gt;&amp;nbsp; StackTrace:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at Mindjet.MindManager.Interop.DocumentsClass.Open(String pFileName, String pPassword, Boolean Visible)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at ParanoidMike.MindManager.ToDoList.ToDoListMap.GetMap(String filename) in C:\personal\VS Projects\MM7TODOList\ToDoList.cs:line 187&lt;br&gt;&amp;nbsp; InnerException: &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And do you want to know what that exception really means?&amp;nbsp; "The specified file does not exist" would be my interpretation.&amp;nbsp; If I understand the MindManager function maps.Open() correctly, this is meant to open an existing document.&amp;nbsp; I've just asked it to open a non-existent document, so I'd expect "can't find it", but I'm puzzled by "unable to create document".&amp;nbsp; It's like whoever wrote the error strings for the CmjDocumentCollectionComObject is interpreting the name of the Win32 CreateFile() API literally.&lt;/p&gt;
&lt;p&gt;I am attempting to use a Try...Catch approach to testing whether the requested file exists. If the file exists, then maps.Open() would succeed; if it didn't exist, then I'd use the Catch block to instead create the named file.&amp;nbsp; I didn't expect to have to catch a System.Runtime.InteropServices.COMException, nor in figuring out how to catch &lt;em&gt;only&lt;/em&gt; the exception with a specific ErrorCode/HRESULT returned by the COM object.&lt;/p&gt;
&lt;p&gt;But then again, &lt;a href="http://en.wikipedia.org/wiki/The_Spanish_Inquisition_(Monty_Python)"&gt;"Nobody expects the Spanish Inquisition"&lt;/a&gt;…&lt;/p&gt;
&lt;h3&gt;{"Retrieving the COM class factory for component with CLSID {5B9EA9CE-76A3-4878-9A6B-22D0A3042774} failed due to the following error: 80040154."}&lt;/h3&gt;
&lt;p&gt;Here's the code:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt; toDoListMap;
&lt;span style="color: rgb(0,0,255)"&gt;try
&lt;/span&gt;{
    toDoListMap = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt;();
}
&lt;span style="color: rgb(0,0,255)"&gt;catch&lt;/span&gt; (System.Runtime.InteropServices.&lt;span style="color: rgb(43,145,175)"&gt;COMException&lt;/span&gt; e)
{
    &lt;span style="color: rgb(0,0,255)"&gt;throw&lt;/span&gt;;
}&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Here's the .NET exception that gets thrown:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;{"Retrieving the COM class factory for component with CLSID {5B9EA9CE-76A3-4878-9A6B-22D0A3042774} failed due to the following error: 80040154."}&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And here's the HRESULT that is being thrown by the COM object: -2147220992&lt;/p&gt;
&lt;p&gt;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2528578&amp;amp;SiteId=1"&gt;In&lt;/a&gt; &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2025134&amp;amp;SiteId=1"&gt;various&lt;/a&gt; &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1886906&amp;amp;SiteId=1"&gt;posts&lt;/a&gt;, the common theme seems to be that the "component with the noted CLSID" needs to be re-registered.&amp;nbsp; Searching for this CLSID on my system (predictably) leads to &lt;strong&gt;Mindjet.MindManager.Interop, Version=7.0.323.0, Culture=neutral, PublicKeyToken=19247b5ea06b230f&lt;/strong&gt; and &lt;strong&gt;Mindjet.MindManager.Interop, Version=7.1.388.0, Culture=neutral, PublicKeyToken=19247b5ea06b230f&lt;/strong&gt;.&amp;nbsp; [However, there's no ProgID registered for Mindjet.MindManager.Interop.&amp;nbsp; Is that bad — I know it's not good for typical apps, but is a COM interop assembly a "typical" COM app?]&lt;/p&gt;
&lt;p&gt;I remember reading somewhere that the MindManager 7 Primary Interop Assemblies were installed by default when installing MM7, so I thought perhaps and Add/Remove Programs "Repair" operation would suffice.&lt;/p&gt;
&lt;p&gt;Unfortunately no — damned MindManager, I ran the full Repair, and it even reinstalled all the 41 default templates (so I know it did completely successfully), but my code is still throwing this same error.&amp;nbsp; So I went looking for the file path, which meant examining the Properties of the "MindManager" Reference, and it reports that this "ActiveX" file is stored here: C:\WINDOWS\assembly\GAC_MSIL\Mindjet.MindManager.Interop\7.1.388.0__19247b5ea06b230f\Mindjet.MindManager.Interop.dll.&amp;nbsp; Fire up a Command Prompt in that directory, run "REGSVR32.EXE Mindjet.MindManager.Interop.dll", and I end up with this error:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lh6.google.com/mikesmithlonergan/R8tKFoHIrCI/AAAAAAAAAWg/oPv9hPm52z8/image3"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="137" alt="image" src="http://lh4.google.com/mikesmithlonergan/R8tKGIHIrDI/AAAAAAAAAWo/T048ricvpn0/image_thumb1" width="553" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3&gt;REGASM.EXE&lt;/h3&gt;
&lt;p&gt;Here's a riddle: how does one initialize a variable that cannot be initialized? 
&lt;p&gt;When I try to create a new mindmap document using a .NET AddIn, I'm finding that the variable I declare to hold a reference to the new mindmap is not usable: (a) it won't work until it's initialized, but (b) when it's initialized it throws the error documented here:&lt;br&gt;&lt;a href="http://tech.groups.yahoo.com/group/MindManagerDev/message/447"&gt;http://tech.groups.yahoo.com/group/MindManagerDev/message/447&lt;/a&gt; 
&lt;p&gt;I've tried to dig up any hints that would help me figure out what to do to resolve this error, but so far nothing has worked (including trying to Register the Interop DLL, and Repairing the installation of MindManager). 
&lt;p&gt;There are plenty of people asking about this kind of issue — some related to straight COM objects, others talking about COM Interop assemblies:&lt;br&gt;&lt;a href="http://www.thescripts.com/forum/thread731361.html"&gt;http://www.thescripts.com/forum/thread731361.html&lt;/a&gt;&lt;br&gt;&lt;a href="http://forums.cnet.com/5208-6141_102-0.html?forumID=8&amp;amp;threadID=216925&amp;amp;messageID=2313201"&gt;http://forums.cnet.com/5208-6141_102-0.html?forumID=8&amp;amp;threadID=216925&amp;amp;messageID=2313201&lt;/a&gt;&lt;br&gt;&lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=333247"&gt;http://channel9.msdn.com/ShowPost.aspx?PostID=333247&lt;/a&gt;&lt;br&gt;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=765439&amp;amp;SiteID=1"&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=765439&amp;amp;SiteID=1&lt;/a&gt;&lt;br&gt;&lt;a href="http://groups.google.com/group/microsoft.public.dotnet.framework.interop/browse_thread/thread/e8d8ccb58221f843/2263fa2b3db5895b"&gt;http://groups.google.com/group/microsoft.public.dotnet.framework.interop/browse_thread/thread/e8d8ccb58221f843/2263fa2b3db5895b&lt;/a&gt; 
&lt;p&gt;(1) I tried loading up the Interop DLL in DEPENDS.EXE, but there appear to be no missing dependencies.&lt;br&gt;(2) I tried registering the assembly using REGASM.EXE, according to the article here: &lt;a href="http://www.simple-talk.com/dotnet/visual-studio/build-and-deploy-a-.net-com-assembly/"&gt;http://www.simple-talk.com/dotnet/visual-studio/build-and-deploy-a-.net-com-assembly/&lt;/a&gt;&lt;br&gt;using the following command: 
&lt;blockquote&gt;
&lt;p&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727&amp;gt;&lt;strong&gt;regasm C:\WINDOWS\assembly\GAC_MSIL\Mindjet.MindManager.Interop\7.1.388.0__19247b5ea06b230f\mindjet.mindmanager.interop.dll&lt;/strong&gt;&lt;br&gt;Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.1433&lt;br&gt;Copyright (C) Microsoft Corporation 1998-2004.&amp;nbsp; All rights reserved. 
&lt;p&gt;&lt;strong&gt;Types registered successfully &lt;/strong&gt;
&lt;p&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now I'm getting the same .NET exception, with a different HRESULT: -2147221164.&amp;nbsp; That HRESULT appears to be associated with &lt;a href="http://technicalsupport.businessobjects.com/KanisaSupportSite/search.do;jsessionid=94D50AB89E25689A785F7CAE167D061E?cmd=displayKC&amp;amp;docType=kc&amp;amp;externalId=c2009165&amp;amp;sliceId=&amp;amp;dialogID=360384&amp;amp;stateId=1%200%20356275"&gt;needing&lt;/a&gt; &lt;a href="http://www.mcse.ms/message1266605.html"&gt;to&lt;/a&gt; &lt;a href="http://www.microsoft.com/windows/windowsmedia/devices/wmconnect/faq.aspx"&gt;re-register&lt;/a&gt; &lt;a href="http://support.esri.com/index.cfm?fa=knowledgebase.techArticles.articleShow&amp;amp;d=26816"&gt;Atl.dll&lt;/a&gt;, so I gave that a shot.&amp;nbsp; Unfortunately, it gave me the same error and the same HRESULT.&amp;nbsp; I also tried re-running the above REGASM.EXE command, with no change — still throwing the same exception.&lt;/p&gt;
&lt;h4&gt;Cheap Hack: avoid init issues with dummy calls&lt;/h4&gt;
&lt;p&gt;I'm almost embarrassed to even discuss how I'm getting around this intractable problem…but not embarrassed enough not to &lt;strong&gt;do&lt;/strong&gt; it, so I might as well own up to it.&amp;nbsp; Who knows?&amp;nbsp; Maybe one of you will know what I'm overlooking.&amp;nbsp; Maybe I'll find this article in six months' time and remember why I put this hack in place.&amp;nbsp; Maybe this will just be my own personal legacy to the world. :)&lt;/p&gt;
&lt;p&gt;Let's recap: my design for this AddIn is to use a separate map to list copies of all Tasks found in the searched maps. If the named map already existed, just open it; if not, a new map should be created.&amp;nbsp; However, I kept getting blocked by not "initializing" the local variable to hold the new/opened Document handle before returning it to the calling function.&amp;nbsp; However, initializing the local variable with a "new MMInterop.Document()" call just caused other problems.&lt;/p&gt;
&lt;p&gt;I was thinking that because Visual Studio was throwing the CS0165 error "Use of unassigned local variable 'toDoListMap" on the final line of code "return toDoListMap", and not on any of the preceding where the toDoListMap variable was being assigned, what Visual Studio might be reacting to is that toDoListMap wouldn't have a non-null value on all code paths through the function.&amp;nbsp; I'd ignored this thought because (a) the code paths where it wouldn't get a value were intentional, and (b) the documentation on CS0165 kept indicating that I needed to initialize the variable.&lt;/p&gt;
&lt;p&gt;However, after exhausting all the "right way" options, I finally just dropped some initializations (assignments?) into the code paths where toDoListMap wasn't previously being touched:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="color: rgb(0,0,255)"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;static&lt;/span&gt; MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt; GetMap(&lt;span style="color: rgb(0,0,255)"&gt;string&lt;/span&gt; filename)
{
    MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt; toDoListMap;
    MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Documents&lt;/span&gt; maps;
    &lt;span style="color: rgb(0,0,255)"&gt;string&lt;/span&gt; toDoListMapFullPath = &lt;span style="color: rgb(43,145,175)"&gt;Connect&lt;/span&gt;.applicationObject.get_Path(MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;MmDirectory&lt;/span&gt;.mmDirectoryMyMaps) + filename; &lt;span style="color: rgb(0,128,0)"&gt;// TODO: remove this hard-coded pathing to the ToDoList map
&lt;/span&gt;    maps = &lt;span style="color: rgb(43,145,175)"&gt;Connect&lt;/span&gt;.applicationObject.get_Documents(&lt;span style="color: rgb(0,0,255)"&gt;true&lt;/span&gt;); &lt;span style="color: rgb(0,128,0)"&gt;// assign/initialize the maps variable so the array can be searched by maps.Open().  "Connect" is the Class that implements a static variable "applicationObject" which is assigned to the "application" object that's captured during AddIn initialization.

&lt;/span&gt;    &lt;span style="color: rgb(0,0,255)"&gt;try&lt;/span&gt; &lt;span style="color: rgb(0,128,0)"&gt;// open the existing ToDoList map
&lt;/span&gt;    {
        toDoListMap = maps.Open(toDoListMapFullPath, &lt;span style="color: rgb(43,145,175)"&gt;String&lt;/span&gt;.Empty, &lt;span style="color: rgb(0,0,255)"&gt;false&lt;/span&gt;);
    }
    &lt;span style="color: rgb(0,0,255)"&gt;catch&lt;/span&gt; (System.Runtime.InteropServices.&lt;span style="color: rgb(43,145,175)"&gt;COMException&lt;/span&gt; e) &lt;span style="color: rgb(0,128,0)"&gt;// if a ToDoList map by that name does not exist, create one
&lt;/span&gt;    {
        &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (e.ErrorCode == -2147220992) &lt;span style="color: rgb(0,128,0)"&gt;// "Object 'CmjDocumentCollectionComObject' reports an error: 'unable to create document'"
&lt;/span&gt;        {
            System.Windows.Forms.&lt;span style="color: rgb(43,145,175)"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: rgb(163,21,21)"&gt;"Exception opening map: "&lt;/span&gt; + e.Message); &lt;span style="color: rgb(0,128,0)"&gt;// TODO: remove once initial debugging is complete
&lt;/span&gt;            &lt;span style="color: rgb(0,0,255)"&gt;string&lt;/span&gt; templateFullPath = &lt;span style="color: rgb(43,145,175)"&gt;Connect&lt;/span&gt;.applicationObject.get_Path(MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;MmDirectory&lt;/span&gt;.mmDirectoryTemplates) + templateFileName; &lt;span style="color: rgb(0,128,0)"&gt;//construct reference to the template that's required when creating a new Document

&lt;/span&gt;            toDoListMap = maps.AddFromTemplate(templateFullPath, &lt;span style="color: rgb(43,145,175)"&gt;String&lt;/span&gt;.Empty, &lt;span style="color: rgb(0,0,255)"&gt;false&lt;/span&gt;);
        }
        &lt;span style="color: rgb(0,0,255)"&gt;else&lt;/span&gt; &lt;span style="color: rgb(0,128,0)"&gt;// this is never intended to be run - it's just here to convince the compiler that the toDoListMap variable has been initialized on all code paths, as it otherwise throws an exception "Use of unassigned local variable 'toDoListMap'.
&lt;/span&gt;        {
            System.Windows.Forms.&lt;span style="color: rgb(43,145,175)"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: rgb(163,21,21)"&gt;"If you see this message, record the error and report it to the developer - this should never be seen: error code = "&lt;/span&gt; + e.ErrorCode.ToString());
            toDoListMap = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt;();
        }
    }
    &lt;span style="color: rgb(0,0,255)"&gt;catch&lt;/span&gt; (&lt;span style="color: rgb(43,145,175)"&gt;Exception&lt;/span&gt; e) &lt;span style="color: rgb(0,128,0)"&gt;// this is never intended to be run - it's just here to convince the compiler that the toDoListMap variable has been initialized on all code paths, as it otherwise throws an exception "Use of unassigned local variable 'toDoListMap'.
&lt;/span&gt;    {
        System.Windows.Forms.&lt;span style="color: rgb(43,145,175)"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: rgb(163,21,21)"&gt;"If you see this message, record the error and report it to the developer - this should never be seen: error code = "&lt;/span&gt; + e.ErrorCode.ToString());
        toDoListMap = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt;();
    }

    &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; toDoListMap;
}
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;And now, miraculously this damned code compiles &lt;strong&gt;and&lt;/strong&gt; runs correctly.&amp;nbsp; I really wish I had some better ideas than these "new" calls, 'cause I've got a feeling they'll come back to bite me far down the line.&amp;nbsp; I've added some MessageBox "please let me know if you see this" dialogs, but that won't really solve the problem — just make me look a little &lt;em&gt;more&lt;/em&gt; like an amateur code-jockey.&lt;/p&gt;
&lt;p&gt;[I'm still not sure why in this case, I was able to assign the toDoListMap variable without first initializing it — it's not one of the simple datatypes, so I don't think it's being implicitly initialized by the compiler, and I thought I'd just re-learned that a complex Object always needs to be declared, &lt;em&gt;initialized&lt;/em&gt; and then assigned.&amp;nbsp; Once again there's something I don't get about this, but I'll leave that to dig up in the future, as yet another great surprise. :)]&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-2316527800554892409?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/2316527800554892409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=2316527800554892409' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/2316527800554892409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/2316527800554892409'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/03/mindmanager-7-todolist-addin_02.html' title='MindManager 7 ToDoList AddIn development Part 6: the Mysteries of COM interop'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-491844820788469604</id><published>2008-03-02T11:25:00.001-08:00</published><updated>2008-03-02T11:25:35.587-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net coding'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='MindManager'/><title type='text'>MindManager 7 ToDoList AddIn development Part 5: minimizing Object overhead between classes</title><content type='html'>&lt;p&gt;I've created quite a puzzle for myself.&amp;nbsp; In writing an AddIn that calls functions from custom Classes, I am forcing the AddIn to pass in all the data that would be needed in the custom code.&amp;nbsp; I've added a few helper functions to the &lt;strong&gt;ToDoListBuilder&lt;/strong&gt; class including GetAllTasks(), IsTaskCompleted() and IsTopicATask().&amp;nbsp; These are easy because I'm passing simple variables into each function.&lt;/p&gt; &lt;p&gt;However, I haven't yet wired up the primary function that will be called from the AddIn's mmCommand_Click() event, and I haven't decided what I need to pass down from the button_Click() to the cascade of encapsulated functions, nor how far down to pass any object like a baton.&lt;/p&gt; &lt;p&gt;It seems like it'd be correct to pass the &lt;strong&gt;MMInterop.Application&lt;/strong&gt; object into the ToDoListBuilder code, but in passing the &lt;strong&gt;Application&lt;/strong&gt; object to a GenerateToDoListItems() method, I'll have to pass the &lt;strong&gt;Application&lt;/strong&gt; object to at least one further layer of called functions such as GetAllToDoListMaps().&amp;nbsp; Or will I?&lt;/p&gt; &lt;p&gt;Now that I'm looking around, the &lt;strong&gt;Connect&lt;/strong&gt; class has a private applicationObject variable.&amp;nbsp; While it seems unlikely I'd be able to make reference to that Class' private variable from a called Class, there should be no reason why I couldn't create another private variable in the ToDoListBuilder class as soon as the GenerateToDoListItems() method is called, and then call on that Class-wide variable from then on.&lt;/p&gt; &lt;h3&gt;Reducing Memory Footprint of Application Object(s) without Passing References Everywhere&lt;/h3&gt; &lt;p&gt;Here's how the code around the Application object comes out from the &lt;a href="http://mindjetlabs.com/cs/files/folders/mindjetlabs/entry53.aspx"&gt;Visual Studio AddIn Template&lt;/a&gt; wizard by default:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;    &lt;span style="color: rgb(0,0,255)"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43,145,175)"&gt;Connect&lt;/span&gt; : &lt;span style="color: rgb(43,145,175)"&gt;Object&lt;/span&gt;, Extensibility.&lt;span style="color: rgb(43,145,175)"&gt;IDTExtensibility2&lt;br&gt;&lt;/span&gt;    {&lt;br&gt;        &lt;span style="color: rgb(0,0,255)"&gt;private&lt;/span&gt; Mindjet.MindManager.Interop.&lt;span style="color: rgb(43,145,175)"&gt;Application&lt;/span&gt; applicationObject;
        &lt;span style="color: rgb(0,0,255)"&gt;private&lt;/span&gt; Mindjet.MindManager.Interop.&lt;span style="color: rgb(43,145,175)"&gt;Command&lt;/span&gt; mmCommand;&lt;br&gt;        ...
    }&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Changing the first declaration to public from private makes that applicationObject object available outside of the assembly as well as within it, so that pointers (references) to the object don't have to be explicitly passed around the code.&lt;/p&gt;
&lt;p&gt;Assuming that nothing can affect the state of the applicationObject, there should be no reason &lt;strong&gt;not&lt;/strong&gt; to declare it as "public".&amp;nbsp; I'm not entirely naive though — I assume there's reasons why you'd want to do one and not the other, but I have to believe that any code running in the MindManager application should necessarily want/try to use a single application object anyway.&lt;/p&gt;
&lt;h4&gt;Solution: Static/Shared modifier&lt;/h4&gt;
&lt;p&gt;After bashing my skull into the wall of my ineptitude for a few days, I finally dislodged a bone fragment of useful info: the "static" modifier.&amp;nbsp; Somehow this does what I had expected the "public" keyword to accomplish — makes it possible to access the variable from outside the class, without having to instantiate another copy of the object.&lt;/p&gt;
&lt;h4&gt;Open Questions&lt;/h4&gt;
&lt;p&gt;Now I'm left wondering two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What's the lowest level of accessibility that the object needs?&amp;nbsp; Does it still need to be public, or would protected or less be acceptable?&lt;/li&gt;
&lt;li&gt;Under what circumstances would it be inadvisable to use the static modifier?&amp;nbsp; I can imagine that in theory, anything that is supposed to represent multiple objects should not be marked "static", but that still leaves a ton of room for interpretation (and for subtle mistakes in code that will bite me only later).&lt;/li&gt;&lt;/ol&gt;
&lt;h3&gt;Aside: Registry entries in Setup project Aren't Automatically Installed&lt;/h3&gt;
&lt;p&gt;Idiot assumption of the day: just because I entered the correct Registry settings in the Setup project, doesn't mean that when I Debug the Solution those settings will be automatically added to the computer's Registry.&amp;nbsp; (Sigh, sometimes I surprise myself with how dense I can be.)&lt;/p&gt;
&lt;p&gt;So which "hack" would be better — should I hand-enter the Registry settings I need (which seems pretty lame) or should I build the Setup project and actually install this AddIn (which might end up leaving behind stuff that I'll need to rip out later after I've rev'd the AddIn a few times)?&lt;/p&gt;
&lt;p&gt;I guess I'm going down the path of hand-entering the Registry settings.&amp;nbsp; I don't like doing this, and I really wish debugging MindManager AddIns didn't require this lame step, but it looks like I've got no better option.&lt;/p&gt;
&lt;h3&gt;NullReferenceException: When will I ever learn?&lt;/h3&gt;
&lt;p&gt;I can't believe the number of times I get caught by this seemingly predictable error:&lt;/p&gt;&lt;pre class="code"&gt;        &lt;span style="color: rgb(0,0,255)"&gt;private&lt;/span&gt; System.Collections.&lt;span style="color: rgb(43,145,175)"&gt;ArrayList&lt;/span&gt; toDoListItems; &lt;span style="color: rgb(0,128,0)"&gt;// building list of all Tasks to be emitted as the items for the ToDoList
&lt;/span&gt;        &lt;span style="color: rgb(0,0,255)"&gt;private&lt;/span&gt; Mindjet.MindManager.Interop.&lt;span style="color: rgb(43,145,175)"&gt;Application&lt;/span&gt; applicationObject; &lt;span style="color: rgb(0,128,0)"&gt;// local instance of the Application object
&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;pre class="code"&gt;        &lt;span style="color: rgb(0,0,255)"&gt;public&lt;/span&gt; System.Collections.&lt;span style="color: rgb(43,145,175)"&gt;ArrayList&lt;/span&gt; GenerateToDoListItems(MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Application&lt;/span&gt; application)
        {
            System.Collections.&lt;span style="color: rgb(43,145,175)"&gt;ArrayList&lt;/span&gt; toDoListMaps; &lt;span style="color: rgb(0,128,0)"&gt;// collection of all maps to be searched for Task topics
&lt;/span&gt;            applicationObject = application; &lt;span style="color: rgb(0,128,0)"&gt;// sets the local variable equal to the value of the passed-in parameter
&lt;/span&gt;            toDoListMaps = GetAllToDoListMaps(); &lt;span style="color: rgb(0,128,0)"&gt;// generate the collection of maps to be enumerated and searched
&lt;/span&gt;            &lt;u&gt;toDoListItems = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; System.Collections.&lt;span style="color: rgb(43,145,175)"&gt;ArrayList&lt;/span&gt;(); &lt;/u&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;u&gt;// declare this to avoid a NullReferenceException when it's assigned below&lt;/u&gt;
&lt;/span&gt;            
            &lt;span style="color: rgb(0,0,255)"&gt;foreach&lt;/span&gt; (MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt; map &lt;span style="color: rgb(0,0,255)"&gt;in&lt;/span&gt; toDoListMaps)
            {
                    toDoListItems.AddRange(GetAllTasks(map));
            }
            &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; toDoListItems;
        }&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;I really don't get why I don't have to declare the "new toDoListMaps" object, but I have to declare the "new toDoListItems".&amp;nbsp; Is there something about creating the object inside the method that implicitly initializes it, but this implicit initialization doesn't occur for objects that are created outside of the method?&lt;/p&gt;
&lt;p&gt;And why does creating an &lt;strong&gt;int&lt;/strong&gt; object not require initialization, but creating an &lt;strong&gt;ArrayList&lt;/strong&gt; object does?&amp;nbsp; This might make sense to veteran coders, but my god it's confusing for those of us just trying to get their first few apps out the door…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-491844820788469604?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/491844820788469604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=491844820788469604' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/491844820788469604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/491844820788469604'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/03/mindmanager-7-todolist-addin.html' title='MindManager 7 ToDoList AddIn development Part 5: minimizing Object overhead between classes'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-793231864814406800</id><published>2008-02-26T18:23:00.001-08:00</published><updated>2008-02-26T18:23:59.379-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='general security'/><title type='text'>Gotta love it when Microsoft catches Microsoft doing something insecure...</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.google.com/mikesmithlonergan/R8TJughcXbI/AAAAAAAAAV4/LcHkixM1Tuo/image%5B3%5D"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="255" alt="image" src="http://lh6.google.com/mikesmithlonergan/R8TJvQhcXcI/AAAAAAAAAWA/IHej1vzP-KE/image_thumb%5B1%5D" width="435" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The Office document conversion utility (that converts Office 2007 documents for use in Office 2003) seems to have gotten caught trying to execute (stack? heap?&amp;nbsp; I still don't know which) memory devoted to data.&amp;nbsp; Naughty naughty, wonder how they missed that?&amp;nbsp; :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-793231864814406800?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/793231864814406800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=793231864814406800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/793231864814406800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/793231864814406800'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/02/gotta-love-it-when-microsoft-catches.html' title='Gotta love it when Microsoft catches Microsoft doing something insecure...'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-6720893460144445754</id><published>2008-02-18T13:10:00.001-08:00</published><updated>2008-03-02T10:43:42.696-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net coding'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='MindManager'/><title type='text'>MindManager 7 ToDoList AddIn development Part 4: Fixing the Registry Settings in the Setup Project</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;The &lt;a href="http://mindjetlabs.com/cs/files/folders/mindjetlabs/entry53.aspx"&gt;MM VS2005 AddIn&lt;/a&gt; wizard created a set of Registry settings for my project, and the friendly folks at Mindjet's Dev Support team helped me fix a problem with my project (and in the process had to remove most of those Registry settings).  Well, now we're taking it back [anyone else remember Bono's intro to Helter Skelter?].&lt;/p&gt; &lt;p&gt;It took me a bit of time to track down the hidden place where Visual Studio "hides" the Registry settings for a Setup project: right-click the Setup Project ("AddInSetup_en" in this case), choose View, Registry.  There's a stub for each hive, but not all of them contain actual Registry Keys or Values.&lt;/p&gt; &lt;p&gt;For my project, the only Key with any entries was HKLM\Software\Mindjet\MindManager\7\AddIns, with the Values (though different settings) that I'd &lt;a href="http://paranoidmike.blogspot.com/2008/01/mindmanager-7-list-add-in-development.html"&gt;noted earlier&lt;/a&gt;.  The ProgID that it's setting is &lt;strong&gt;ParanoidMike.ToDoListBuilder.AddIn&lt;/strong&gt; which isn't really representative of what I'm intending to release - &lt;strong&gt;ToDoListBuilder&lt;/strong&gt; is just one portion of the functionality I want to provide (i.e. I've also spec'd out a &lt;strong&gt;ToDoListManager&lt;/strong&gt; class that'll be a peer to ToDoListBuilder).&lt;/p&gt; &lt;p&gt;Also, if I'm going to define a namespace rooted in ParanoidMike, I figure I should use the application name as the next-level-down, and then describe the actual code/app/add-in as the third-level-down.  That gives me the namespace &lt;strong&gt;ParanoidMike.MindManager.ToDoListAddIn&lt;/strong&gt;, so I've replaced the existing ProgID with this as the new ProgID (and .NET namespace for my source code).  I deleted the old Registry entries that reference this ProgID, added the new ProgID and its entries, and also added the HKCR settings that were still missing when I published &lt;a href="http://paranoidmike.blogspot.com/2008/01/mindmanager-7-list-add-in-development.html"&gt;this article&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;That results in the following Registry entries populated in the AddInSetup_en project:&lt;/p&gt; &lt;h3&gt;Complete Set of Registry Entries for MM7 Add-in&lt;/h3&gt; &lt;h4&gt;HKLM\Software\Mindjet\MindManager\7\AddIns&lt;/h4&gt; &lt;table border="1" cellpadding="1" cellspacing="1" width="400"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="133"&gt; &lt;p align="center"&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="133"&gt; &lt;p align="center"&gt;&lt;strong&gt;Data type&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="133"&gt; &lt;p align="center"&gt;&lt;strong&gt;Setting&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="133"&gt;Description&lt;/td&gt; &lt;td valign="top" width="133"&gt;REG_SZ&lt;/td&gt; &lt;td valign="top" width="133"&gt;MindManager ToDoList AddIn for MM7 - Built by ParanoidMike&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="133"&gt;FriendlyName&lt;/td&gt; &lt;td valign="top" width="133"&gt;REG_SZ&lt;/td&gt; &lt;td valign="top" width="133"&gt;MM7ToDoList&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="133"&gt;LoadBehavior&lt;/td&gt; &lt;td valign="top" width="133"&gt;REG_DWORD&lt;/td&gt; &lt;td valign="top" width="133"&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;h4&gt;HKCR\ParanoidMike.MindManager.ToDoListAddIn&lt;/h4&gt; &lt;table border="1" cellpadding="1" cellspacing="1" width="405"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="133"&gt; &lt;p align="center"&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="133"&gt; &lt;p align="center"&gt;&lt;strong&gt;Data type&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="133"&gt; &lt;p align="center"&gt;&lt;strong&gt;Setting&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="133"&gt;(Default)&lt;/td&gt; &lt;td valign="top" width="133"&gt;REG_SZ&lt;/td&gt; &lt;td valign="top" width="133"&gt;ParanoidMike.MindManager.ToDoListAddIn&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;h4&gt;HKCR\ParanoidMike.MindManager.ToDoListAddIn\CLSID&lt;/h4&gt; &lt;table border="1" cellpadding="1" cellspacing="1" width="405"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="133"&gt; &lt;p align="center"&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="133"&gt; &lt;p align="center"&gt;&lt;strong&gt;Data type&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="133"&gt; &lt;p align="center"&gt;&lt;strong&gt;Setting&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="133"&gt;(Default)&lt;/td&gt; &lt;td valign="top" width="133"&gt;REG_SZ&lt;/td&gt; &lt;td valign="top" width="133"&gt;{33B60353-E8F3-4F38-98B6-41C7E5C6D32B}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: this little tip (&lt;a href="http://msdn2.microsoft.com/library/xkfz6802.aspx"&gt;HowTo: Create a Default Registry Value in Registry Editor&lt;/a&gt;) saved me a lot of trouble futzing around with these infrequently-created values.&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: if you've used the MM7 AddIn template for Visual Studio, the CLSID above can be found in the &lt;strong&gt;Connect.cs&lt;/strong&gt; file just under the &lt;span style="color:#c0c0c0;"&gt;&lt;strong&gt;/// &amp;lt;summary&amp;gt;&lt;/strong&gt;&lt;/span&gt; comment, like so:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;GuidAttribute&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"33B60353-E8F3-4F38-98B6-41C7E5C6D32B"&lt;/span&gt;)&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;h3&gt;&lt;strong&gt;Open Issue: ProgID versioning&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;There's conflicting evidence on whether it's best to create the ProgID using the ".1" suffix notation, so that the ProgID can be rev'd, or whether it's just as good to leave it without the ".1" suffix and replace it upon every install (upgrade?).  For the moment, until I stumble across anything better, I'm just going to leave it &lt;em&gt;without&lt;/em&gt;.&lt;/p&gt;&lt;h3&gt;Open Issue: ProgId in AddIn's source code&lt;/h3&gt;&lt;p&gt;After cleaning out the old entries from my computer's Registry and testing this new set of code, I noticed that there was still the old ProgId referenced in the &lt;strong&gt;Connect.cs&lt;/strong&gt; code:&lt;/p&gt;&lt;pre class="code"&gt;    &lt;span style="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;lt;summary&amp;gt;
&lt;/span&gt;    &lt;span style="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;   The object for implementing an Add-in.
&lt;/span&gt;    &lt;span style="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;lt;/summary&amp;gt;
&lt;/span&gt;    &lt;span style="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;lt;see also class='IDTExtensibility2' /&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;   
&lt;/span&gt;    [
     &lt;span style="color: rgb(43, 145, 175);"&gt;CLSCompliant&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;false&lt;/span&gt;),
     &lt;span style="color: rgb(43, 145, 175);"&gt;ComVisible&lt;/span&gt;(&lt;span style="color: rgb(0, 0, 255);"&gt;true&lt;/span&gt;),
     &lt;span style="color: rgb(43, 145, 175);"&gt;GuidAttribute&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"33B60353-E8F3-4F38-98B6-41C7E5C6D32B"&lt;/span&gt;), &lt;span style="color: rgb(43, 145, 175);"&gt;ProgId&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"ParanoidMike.ToDoListBuilder.AddIn"&lt;/span&gt;)
   ]
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Since the add-in loaded and executed successfully, I'm now left to wonder what effect this &lt;strong&gt;ProgId&lt;/strong&gt; entry is really supposed to have.  Clearly it doesn't affect the operations of debugging the code (i.e. hitting F5 from within Visual Studio 2008 and waiting for MindManager to launch), but I can't imagine it's just there for decoration either.  It's possible that, because I haven't rebooted since I cleaned out the Registry and updated the AddInSetup_en project settings, there's still enough of this information cached to allow the Add-in (with the same CLSID) to still work.&lt;/p&gt;&lt;p&gt;I'm taking no chances of a vaguely-specified error down the line, so I've updated this ProgId entry to the current value, but if anyone knows how these entries are related, I'd sure love to hear it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-6720893460144445754?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/6720893460144445754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=6720893460144445754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6720893460144445754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/6720893460144445754'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/02/mindmanager-7-todolist-addin.html' title='MindManager 7 ToDoList AddIn development Part 4: Fixing the Registry Settings in the Setup Project'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-58542999852750901</id><published>2008-02-18T10:26:00.001-08:00</published><updated>2008-03-02T12:00:56.245-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net coding'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='MindManager'/><title type='text'>MindManager 7 "ToDo List" Add-in development: Notes to Self</title><content type='html'>&lt;h3&gt;Notes to Self: Object Model stuff I Might Use in my Add-in&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;Application.ActiveDocument: the currently-displayed Map  &lt;/li&gt;&lt;li&gt;Application.Visible: enables/disables the MM UI  &lt;/li&gt;&lt;li&gt;DocumentObject.Guid, DocumentObject.ResetDirty: this seems like a generic object type within the MM object model — might be useful for manipulating a whole collection of different objects at once  &lt;/li&gt;&lt;li&gt;Document.Attributes: collection of document's custom attributes  &lt;/li&gt;&lt;li&gt;Document.CentralTopic  &lt;/li&gt;&lt;li&gt;Document.Guid  &lt;/li&gt;&lt;li&gt;Document.IsModified  &lt;/li&gt;&lt;li&gt;Document.Properties  &lt;/li&gt;&lt;li&gt;Document.AssignMapMarkers(): assigns a map markers template to the document  &lt;/li&gt;&lt;li&gt;Document.GetAttributes()  &lt;/li&gt;&lt;li&gt;Document.Range(): returns a new Range collection of all the specified objects (topics, boundaries, relationships) in the document  &lt;/li&gt;&lt;li&gt;Topic.AllSubTopics: subtopics connected to the topic  &lt;/li&gt;&lt;li&gt;Topic.Attributes  &lt;/li&gt;&lt;li&gt;Topic.Document: the document in which the Topic is found  &lt;/li&gt;&lt;li&gt;Topic.Guid  &lt;/li&gt;&lt;li&gt;Topic.Icons, Topic.UserIcons  &lt;/li&gt;&lt;li&gt;Topic.IsFirstSibling: TRUE if the topic is the first in a set of siblings  &lt;/li&gt;&lt;li&gt;Topic.IsMainTopic: TRUE if the topic is a child of the Central topic  &lt;/li&gt;&lt;li&gt;Topic.IsSubTopic: TRUE if the topic is a child of another topic  &lt;/li&gt;&lt;li&gt;Topic.Level  &lt;/li&gt;&lt;li&gt;Topic.NextSibling  &lt;/li&gt;&lt;li&gt;Topic.ParentRelationship  &lt;/li&gt;&lt;li&gt;Topic.ParentTopic  &lt;/li&gt;&lt;li&gt;Topic.SubTopics, Topic.UnfilteredSubTopics  &lt;/li&gt;&lt;li&gt;Topic.Synchronization: ????  &lt;/li&gt;&lt;li&gt;Topic.Task  &lt;/li&gt;&lt;li&gt;Topic.Text  &lt;/li&gt;&lt;li&gt;Topic.TopicLabel  &lt;/li&gt;&lt;li&gt;Topic.TopicPrefix: sets the prefix for the topic — something to do with "numbering"  &lt;/li&gt;&lt;li&gt;Topic.Type  &lt;/li&gt;&lt;li&gt;Topic.AddControlStripType()  &lt;/li&gt;&lt;li&gt;Topic.AddSubTopic()  &lt;/li&gt;&lt;li&gt;Topic.CreateHyperlinkToTopicByGuid(): Cool!  &lt;strong&gt;This could be used to hyperlink topics in ToDoList back to their original Topics&lt;/strong&gt;.  Might be useful to sync properties, attributes automatically.  &lt;/li&gt;&lt;li&gt;Topic.GetAttributes()  &lt;/li&gt;&lt;li&gt;Topic.NewTopicFinder(): helpful for traversing sub-topics from the current topic.  &lt;/li&gt;&lt;li&gt;Topic.ResetDirty(): resets dirty bit of this and all subsequent objects.  [Could be used to determine if a Topic has been changed since last "sync".]  &lt;/li&gt;&lt;li&gt;Topics.Add()  &lt;/li&gt;&lt;li&gt;Topics.AddWithGuid(): creates new Topic with a given Guid  &lt;/li&gt;&lt;li&gt;CustomProperty.Value  &lt;/li&gt;&lt;li&gt;CustomAttributes.GetAttributeValue(), CustomAttributes.SetAttributeValue()  &lt;/li&gt;&lt;li&gt;Task.IsDone  &lt;/li&gt;&lt;li&gt;Task.IsValid  &lt;/li&gt;&lt;li&gt;Task.Priority  &lt;/li&gt;&lt;li&gt;Task.Topic: the parent Topic for this object  &lt;/li&gt;&lt;li&gt;TextLabels.AddTextLabel()  &lt;/li&gt;&lt;li&gt;Icons.AddStockIcon(), Icons.AddCustomIcon()  &lt;/li&gt;&lt;li&gt;Icon.Delete()  &lt;/li&gt;&lt;li&gt;Utilities.Execute &lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Notes to Self: Questions to Research&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;What's the difference between a CustomProperty and a CustomAttribute?  &lt;ul&gt; &lt;li&gt;Attributes are persistent&lt;/li&gt;&lt;li&gt;Nick Duffill has more info &lt;a href="http://tech.groups.yahoo.com/group/MindManagerDev/message/470"&gt;here&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;Is a TextLabel the same thing as a Text Marker?  &lt;/li&gt;&lt;li&gt;What's the difference between a CategoryMarker, a CustomIconMarker and a CustomIcon?  &lt;/li&gt;&lt;li&gt;What Events are available to which to respond (such as Topic.Moved)?&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Nick Duffill alludes to "topic-delete" and "topic-add" &lt;a href="http://tech.groups.yahoo.com/group/MindManagerDev/message/470"&gt;here&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Is there a way to find the current position among siblings for a Topic?  Could there be a Property that indicates the Topic's position?&lt;/li&gt; &lt;ul&gt; &lt;li&gt;There is the Topics.Item property…&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Can you get a handle to a Topic when you know its Guid?  Do you need to be attached to its Document, or can you search all open Documents (e.g. searching through the AllDocuments or Documents collections)? &lt;/li&gt;&lt;li&gt;Is there some way (e.g. derive a class from the Topic class) that would allow me to define a Property whose Value was equal to its 1-index position among its siblings?  &lt;/li&gt;&lt;li&gt;Does the Dirty flag get toggled automatically as soon as any change is made to the object?  Or is this a flag that must be explicitly set?&lt;/li&gt; &lt;li&gt;Does the Dirty flag inherit up the tree — i.e. if any Object in a Document has the Dirty flag set, does that implicitly "set" the Dirty flag on the Document as well?  &lt;/li&gt;&lt;li&gt;Can you reset the Dirty flag on a Document, and would that reset the Dirty flag on every Object in the Document all at once?  &lt;/li&gt;&lt;li&gt;Could the InsertCustomProperties event be used to automatically propagate a Property to another attribute on the Topic object (e.g. taking the Index of a Topic next to its ToDoList siblings and convert that to a custom ToDoListPriority property, or to use the Priority icon's value as a ToDoListPriority value)?  &lt;/li&gt;&lt;li&gt;Is the SetCustomPropertyValue event the one that'll let me trigger when the user changes the Topic's ToDoListPriority value (either automatically, by moving the Topic to a different position among its List siblings, or manually, by typing the value in or selecting it from a pre-populated list) to propagate that value back to the source Topic?  &lt;ul&gt; &lt;li&gt;If so, could I reset the Dirty flag on the Topic in the ToDoList, but leave open the possibility that the ToDoList overall is still "Dirty" and prompt the user to save unsaved changes? &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Notes to Self: MM-specific Objects to Manipulate&lt;/h3&gt; &lt;p&gt;There's all these new Object types defined in the MM object model:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;BusinessTypeRegistry/Business Topics (see Nick Duffill's expert explanation of these Object classes &lt;a href="http://tech.groups.yahoo.com/group/MindManagerDev/message/471"&gt;here&lt;/a&gt;)  &lt;/li&gt;&lt;li&gt;External Topics  &lt;/li&gt;&lt;li&gt;Map Parts  &lt;/li&gt;&lt;li&gt;MapShortcutCollections  &lt;/li&gt;&lt;li&gt;Baselines  &lt;/li&gt;&lt;li&gt;DocumentBars  &lt;/li&gt;&lt;li&gt;Filter  &lt;/li&gt;&lt;li&gt;Control Strips &lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Notes to Self: Code Tidbits&lt;/h3&gt; &lt;p&gt;"use the Document.Range() method to iterate over all Objects" (&lt;a href="http://www.mindjet.com/us/devzone/7/mm7_object_model/Page124.html"&gt;Create and Use Custom Attributes&lt;/a&gt;)&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mindjet.com/us/devzone/7/mm7_object_model/Page106.html"&gt;Add Topics&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mindjet.com/us/devzone/7/mm7_object_model/Page115.html"&gt;Iterate over Topics&lt;/a&gt; (includes sample code for using the TopicFinder, an iterator)&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mindjet.com/us/devzone/7/mm7_object_model/Page102.html"&gt;Work with the Object ID&lt;/a&gt; (includes reference to FindByGuid() method that finds DocumentObjects by GUID in any Range, such as Document.Range)&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mindjet.com/us/devzone/7/mm7_object_model/Page103.html"&gt;Get an Object's Type&lt;/a&gt; (which refers to an enumeration of DocumentObject that includes mmDocumentObjectTypeTopic)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-58542999852750901?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/58542999852750901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=58542999852750901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/58542999852750901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/58542999852750901'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/02/mindmanager-7-list-add-in-development_18.html' title='MindManager 7 &amp;quot;ToDo List&amp;quot; Add-in development: Notes to Self'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-7031924511709759057</id><published>2008-02-17T20:45:00.001-08:00</published><updated>2008-02-17T20:45:42.474-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net coding'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='MindManager'/><title type='text'>MindManager 7 "ToDo List" Add-in development Part 3: Initial Working Code</title><content type='html'>&lt;p&gt;Successful running of the add-in!&amp;nbsp; Once I added the required Registry settings, the add-in finally made itself known (through the MessageBox'es).&amp;nbsp; I learned that the HKCR settings are also necessary for other calls to succeed, but the essential behaviour of being recognized and loaded by MindManager was entirely dependent on having those Registry settings populated in the \Addins key.&lt;/p&gt; &lt;p&gt;At first I just used a .REG file to populate the Registry settings, following the model of the MM7 Sample Addin.&amp;nbsp; I had to do this as a side-effect of the work the helpful folks on the Mindjet "Dev Support" team did to rip out a bunch of "custom actions" stuff from my MM7 add-in solution, and this appears to have included all the Registry settings as well.&amp;nbsp; [Note: the Mindjet dev support folks are really helpful, and I'm not blaming them for this — the MM7 VS project template was (a) developed under Visual Studio 2005 not 2008 (which I'm using), and (b) was last updated last summer (and is no currently under active development I'd guess because the person who originally created it has since left the company — at least, that's the usual way these things occur).&lt;/p&gt; &lt;p&gt;However, it's not quite perfectly operating yet — just before the OnStartupComplete dialog box comes up, the following error is thrown by MM7:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.google.com/mikesmithlonergan/R7kNdAhcXZI/AAAAAAAAAVk/obSwavZkL9c/image3"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="130" alt="image" src="http://lh3.google.com/mikesmithlonergan/R7kNdQhcXaI/AAAAAAAAAVs/HZA67EzMChA/image_thumb1" width="513" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;According to &lt;a href="http://www.mindjet.com/us/forum/viewtopic.php?p=2772#2772"&gt;this thread&lt;/a&gt;, this means that Addin ID must match the first parameter to applicationObject.Commands.Add().&amp;nbsp; In my code that parameter is "ParanoidMike.ToDoListBuilder.AddIn", and my first guess is that the key under HKLM\Software\Mindjet\MindManager\7\AddIns needs to have the same name (which it currently doesn't).&amp;nbsp; Upon changing it to match, I finally saw the Add-Ins Ribbon tab that I hadn't been able to expose until now.&lt;/p&gt; &lt;p&gt;On to a little code…&lt;/p&gt; &lt;h3&gt;First stage: Ribbon Button That Counts Tasks in Current Map&lt;/h3&gt; &lt;p&gt;I wanted to use as much of the code from the &lt;a href="http://mindjetlabs.com/cs/blogs/organizational_irritant/archive/2007/11/23/MindManager-Sample-Add_2D00_in.aspx"&gt;MindManager7 Sample Add-in&lt;/a&gt; as possible… however somehow I ended up not using much or any of that.&amp;nbsp; This was my original plan:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Create variable for MM application  &lt;ul&gt; &lt;li&gt;Sample\MmxUtility\Helper.cs: MmxUtility.Helper.GetMmxMap()&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Beg/borrow/steal ribbon button code from existing add-in  &lt;ul&gt; &lt;li&gt;Sample\MmxUtility\RibbonTabBase.cs (base class for creating a new Ribbon tab)  &lt;li&gt;Sample\MmxUtility\ControlStripBase.cs&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Attach function to Ribbon button  &lt;li&gt;Create variable for Current Map  &lt;ul&gt; &lt;li&gt;Application.ActiveDocument&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Find the Base Topic and enumerate  &lt;ul&gt; &lt;li&gt;Sample\MmxUtility\Helper.cs: Helper.BaseTopicFinder()&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Create variable for Count  &lt;li&gt;Create For Each loop of Task objects, and count 'em  &lt;ul&gt; &lt;li&gt;Sample\MmxUtility\Helper.cs (Topic attributes)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Instead, though, I ended up trying to separate out the UI from the data manipulation code, and leveraging the code I'd written from the MindManager DevZone article "&lt;a href="http://www.mindjet.com/us/devzone/7/how_to_create_mm_addin_cs"&gt;How to Create a MindManager 7 Add-in Using C#&lt;/a&gt;".&amp;nbsp; &lt;/p&gt; &lt;p&gt;This is what resulted:&lt;/p&gt;&lt;pre class="code"&gt;        &lt;span style="color: rgb(0,0,255)"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;void&lt;/span&gt; mmCommand_Click()
        {
            &lt;span style="color: rgb(0,128,0)"&gt;// Process the MindManager command and say hello
&lt;/span&gt;            &lt;span style="color: rgb(43,145,175)"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: rgb(163,21,21)"&gt;"Hello world! (C#)"&lt;/span&gt;, addInDisplayName);

            &lt;span style="color: rgb(0,128,0)"&gt;// Get the current Map
&lt;/span&gt;            Mindjet.MindManager.Interop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt; currentMap;
            currentMap = applicationObject.ActiveDocument;

            &lt;span style="color: rgb(0,128,0)"&gt;// Count the current Map's Tasks and display for the user:
&lt;/span&gt;            &lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt; count;
            &lt;span style="color: rgb(43,145,175)"&gt;ToDoListBuilder&lt;/span&gt; taskCounter = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43,145,175)"&gt;ToDoListBuilder&lt;/span&gt;();
            count = taskCounter.countTasks(currentMap);
            &lt;span style="color: rgb(43,145,175)"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: rgb(163,21,21)"&gt;"There are "&lt;/span&gt; + count.ToString() + &lt;span style="color: rgb(163,21,21)"&gt;" Tasks in this Map"&lt;/span&gt;);
        }&lt;/pre&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;    &lt;span style="color: rgb(0,0,255)"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43,145,175)"&gt;ToDoListBuilder
&lt;/span&gt;    {
        &lt;span style="color: rgb(0,0,255)"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt; countTasks(MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Document&lt;/span&gt; mindMap)
        {
            &lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt; tasksCount; &lt;span style="color: rgb(0,128,0)"&gt;// count of the number of Topics that are Tasks
&lt;/span&gt;            MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Range&lt;/span&gt; range; &lt;span style="color: rgb(0,128,0)"&gt;// just a collection of whatever we can find in the Document :)
&lt;/span&gt;            range = mindMap.Range(MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;MmRange&lt;/span&gt;.mmRangeAllTopics, &lt;span style="color: rgb(0,0,255)"&gt;true&lt;/span&gt;);
            tasksCount = 0; &lt;span style="color: rgb(0,128,0)"&gt;// initialize to avoid error CS1065
&lt;/span&gt;            &lt;span style="color: rgb(0,0,255)"&gt;foreach&lt;/span&gt; (MMInterop.&lt;span style="color: rgb(43,145,175)"&gt;Topic&lt;/span&gt; topic &lt;span style="color: rgb(0,0,255)"&gt;in&lt;/span&gt; range)
            {
                &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (topic.Task.Complete &amp;gt;= 0)  &lt;span style="color: rgb(0,128,0)"&gt;// this is intended to test whether the "topic" has Task attributes attached to it, and is how ResultsManager characterizes a Task
&lt;/span&gt;                {
                    tasksCount++; &lt;span style="color: rgb(0,128,0)"&gt;// increment this counter variable
&lt;/span&gt;                }
            }
            &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; tasksCount;
        }
    } &lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The key magic in this code was the test for whether a Topic is a Task or not:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt; (topic.Task.Complete &amp;gt;= 0) 
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;I'd spotted this approach in a &lt;a href="http://www.activityowner.com/macros/count_tasks.php"&gt;macro that was published on ActivityOwner&lt;/a&gt;, but it seemed more complicated and indirect than should be necessary.&amp;nbsp; I wondered whether something like topic.Task.IsValid() would identify whether a topic had "valid" Task characteristics.&amp;nbsp; I looked into what documentation for this method was available, but &lt;a href="http://tech.groups.yahoo.com/group/MindManagerDev/message/410"&gt;the available info is pretty sparse&lt;/a&gt;.&amp;nbsp; If not for the generous help from the MindManager development community like &lt;a href="http://tech.groups.yahoo.com/group/MindManagerDev/message/405"&gt;Nick Duffill&lt;/a&gt;, I would've been forced to work through this by trial &amp;amp; error.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-7031924511709759057?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/7031924511709759057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=7031924511709759057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7031924511709759057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7031924511709759057'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/02/mindmanager-7-list-add-in-development.html' title='MindManager 7 &amp;quot;ToDo List&amp;quot; Add-in development Part 3: Initial Working Code'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-7678572691855997057</id><published>2008-02-12T17:17:00.001-08:00</published><updated>2008-02-12T17:17:40.906-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='general security'/><title type='text'>Which Security Event Log audit categories are most useful on a Windows client?</title><content type='html'>&lt;p&gt;Let's say you're looking to maximize the value of the data logged to the Security Event Log on a huge number of Windows clients (say, Windows XP SP2).&lt;/p&gt; &lt;p&gt;Further, let's assume that you're not inspecting such logs on a regular basis, but instead you just want to keep the most critical events in case you have to track down some "suspicious activity" later.&amp;nbsp; [Suspicious activity would probably include such things as successful intrusions into the PC (whether by attackers or malware), which is going to be a losing battle but worth trying.]&lt;/p&gt; &lt;p&gt;You have two different sets of knobs to twiddle: which categories of security events will be logged, and how the security Event Log will be configured.&amp;nbsp; The &lt;em&gt;categories&lt;/em&gt; are the more involved thinking, so let's start with the Event Log &lt;em&gt;configuration&lt;/em&gt; first, shall we?&lt;/p&gt; &lt;h3&gt;Security Event Log configuration&lt;/h3&gt; &lt;p&gt;The default Security Event Log size on Windows XP is a paltry 512 KB.&amp;nbsp; [It got boosted on Windows Vista, so don't go yelling at Microsoft — they heard ya already.]&amp;nbsp; The question isn't &lt;strong&gt;if&lt;/strong&gt; you should increase its size, but &lt;strong&gt;by how much&lt;/strong&gt;?&lt;/p&gt; &lt;p&gt;When it comes down to a "best practice", I've always found it to be an arbitrary choice.&amp;nbsp; This choice should be informed by the level of activity you expect (or tend) to see — many customers who turn on all logging options can fill up a 10 MB log in the space of a week, but those who make more judicious choices can survive on 2048 KB for sometimes a month.&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;upper&lt;/strong&gt; limit is somewhere in the neighbourhood of 300 MB, but that limit includes all Event Logs (even custom event logs created by other applications, I believe) — this is documented in &lt;a href="http://www.microsoft.com/technet/security/guidance/serversecurity/tcg/tcgch06n.mspx"&gt;Chapter 6 of Threats and Countermeasures&lt;/a&gt;.&amp;nbsp; So for example, if you've already set the System and Application logs to 50 MB apiece, I would strongly advise a &lt;strong&gt;Maximum log size&lt;/strong&gt; of somewhere around 150-200 MB for the Security event log.&amp;nbsp; [Note: there is &lt;a href="http://support.microsoft.com/kb/945463"&gt;a bug&lt;/a&gt; that causes problems with Security event logs over 50 MB, which hopefully has not only been fixed in Windows Server 2003 but also Windows XP SP2.]&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Aside: I'm sure there are others you might find, but on my own Windows XP box I've got four additional custom Event Logs:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Microsoft Office Diagnostics  &lt;li&gt;Microsoft Office Sessions  &lt;li&gt;Virtual Server  &lt;li&gt;Windows PowerShell&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt; &lt;p&gt;The next setting to consider is how the logs will respond when they (inevitably) fill up.&amp;nbsp; There's a setting innocuously labelled &lt;strong&gt;When maximum log size is reached&lt;/strong&gt;, and there's no perfect selection for everyone.&amp;nbsp; I've generally advised people to choose &lt;strong&gt;Overwrite events as needed&lt;/strong&gt;, since most times, my customers would be interested in having a record of the &lt;em&gt;most&lt;/em&gt; recent activity on the PC (e.g. tracking down details of a recent virus outbreak or suspected break-in attempt).&lt;/p&gt; &lt;p&gt;Finally, if you're really anal about your Security Event logs (and what security geek doesn't ideally want to keep them around &lt;strong&gt;forever&lt;/strong&gt;?), you &lt;em&gt;can&lt;/em&gt; enable one or two other specialized settings created just for you — but &lt;em&gt;should&lt;/em&gt; you?&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/945463"&gt;WarningLevel&lt;/a&gt;: recent versions of Windows can warn the Administrator when the Security Event log is nearly full (the usual recommendation is 80 or 90% threshold).&amp;nbsp; Windows will record a single System event with EventID = 523.&amp;nbsp; However, this is really only useful in cases where the Administrator wants to archive all Security Event Log records for later analysis or compliance checking, &lt;u&gt;and&lt;/u&gt; they don't already have an infrastructure for collecting and centralizing this logging info.&amp;nbsp; Warning someone of imminent failure, when they have no way to avert disaster, is really just a tease.&amp;nbsp; Thus, the &lt;em&gt;more&lt;/em&gt; useful setting is…  &lt;li&gt;&lt;a href="http://support.microsoft.com/?kbid=312571"&gt;AutoBackupLogFiles&lt;/a&gt;: Rather than let the log files overwrite themselves, some would prefer to archive all log entries.&amp;nbsp; This registry setting enables Windows to automatically backup and empty the specified Event Log, so that all the entries are stored in a local file on disk.&amp;nbsp; This isn't perfect (a malicious attacker could wipe them out, for instance) but in cases where you just &lt;em&gt;can't&lt;/em&gt; imagine copying the security Event log between the time the 90% alarm goes off and you get the time to deal with it, this can be an effective alternative.&amp;nbsp; The most significant consequence of this is, over time, you may end up filling the OS volume with these archived files.&amp;nbsp; However, shunting such saved data to a separate, non-OS volume — or monitoring for disk space — are the kinds of problems that aren't difficult to solve.&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Security Event Log Category choices&lt;/h3&gt; &lt;p&gt;Now the tough part: deciding which Success &amp;amp; Failure event categories to enable.&amp;nbsp; Leaning on Eric Fitzgerald and Randy Franklin Smith, here's the current thinking I'm advising my customer for &lt;a href="http://blogs.msdn.com/ericfitz/archive/2005/01/11/350848.aspx"&gt;keeping the noise down&lt;/a&gt; (and which you're welcome to leverage, if our thinking seems to fit):&lt;/p&gt; &lt;p&gt;&lt;u&gt;Account Logon&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;This'll identify the local (i.e. SAM-based) usernames that users have attempted to logon at this PC  &lt;li&gt;If you're interested in tracking actual user activity and successful break-ins, then enable Success auditing.  &lt;li&gt;If you're interested in (and plan to actually &lt;em&gt;investigate&lt;/em&gt;) attempted but failed break-ins, and if your users don't use local accounts (and thus won't be the overwhelming cause of failed account logon attempts due to fat-fingering their password), then enable Failure auditing.&amp;nbsp; Under such circumstances, this shouldn't be a significant contributor to the security logs.  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: enable Success and Failure auditing.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;Account Management&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;This'll identify such things as account creation, password reset and group membership changes.  &lt;li&gt;Under normal circumstances these should be highly useful records (both the successful changes and the attempts) — especially if you don't often manipulate local accounts on your XP clients.  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: enable Success and Failure auditing.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;Directory Service Access&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;pointless — this only applies to Domain Controllers  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: No Auditing&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;Logon events&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;In a non-domain context, this doesn't add much value over and above Account Logon auditing  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: No Auditing&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/ericfitz/archive/2006/03/07/545726.aspx"&gt;Object Access auditing&lt;/a&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;This is a tricky one.&amp;nbsp; It logs little or nothing by default, even when Success and Failure auditing are enabled for this.  &lt;li&gt;Used correctly, you can collect information with a fairly high signal-to-noise ratio.  &lt;li&gt;Used incorrectly, however (and I was as guilty of this as anyone in my early career, and am still guilty today), and you'll wipe out any useful information that the security log might've otherwise kept for you.  &lt;li&gt;For example, I'm currently recording "Handle Closed" and "Object Access Attempted" events dozens or hundreds of times an hour.&amp;nbsp; What is being accessed?&amp;nbsp; LSASS.&amp;nbsp; Why?&amp;nbsp; Because of a single "Everyone: Full Control" auditing entry I added to the EFS\Current Keys registry key, to try to track down some odd behaviour a few months ago.&amp;nbsp; I'd forgotten about this ever since, and now I'm filling my 10 MB security log every 36 hours.  &lt;li&gt;If you follow a VERY specific set of SACLs as in the EricFitz article linked above, then you will get some real value out of this category.  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: &lt;em&gt;only&lt;/em&gt; enable Success and Failure auditing if you have specific activity you're looking for, but be VERY careful when setting any SACLs on the system.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;Policy Change&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;I've never seen anything in this category that helps really track down malicious behaviour  &lt;li&gt;While it may be interesting to highlight attempted (or successful) changes to Audit policy or assigned user rights, I'm extremely skeptical that any of this information would be conclusive.  &lt;li&gt;However, with Windows XP SP2 and the use of Windows Firewall, there are a number of very specific audit records (e.g. Event IDs 851, 852, 860) that track changes in the Windows Firewall configuration.&amp;nbsp; [It's unfortunate that there's not better info on the source of those changes.]  &lt;li&gt;If you're using the Windows Firewall in XP SP2, these records could well be useful in isolating the source, cause, or spread of a malware outbreak.  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: enable Success and Failure auditing &lt;strong&gt;&lt;em&gt;when using Windows Firewall&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/ericfitz/archive/2005/12/05/500316.aspx"&gt;Privilege Use auditing&lt;/a&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;One of the greatest sources of log pollution, with little practical application.  &lt;li&gt;This looks very useful to a security geek on paper, but in practice 99% of the recorded events will be (a) legitimate behaviour and (b) completely harmless.  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: No Auditing&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;Process Tracking&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Aka "Detailed Tracking" (which is how these events are labelled in the security Event Log)  &lt;li&gt;A great way to swell the size of your security logs, unless your PCs run a very small number of applications for very long periods of time.  &lt;li&gt;However, when you're using Windows Firewall, Failure auditing will record (in Event ID 861) a number of potentially useful pieces of information about any application that attempts to open an exception in the Firewall rules.  &lt;li&gt;This logging can be very frequent (I show over 2000 events in the last 36 hours on my PC), but will give very detailed information on the the Port opened, the process that bound it, and whether the process is a service or RPC application.  &lt;li&gt;(One good non-security use for this auditing capability is to troubleshoot unknown application behaviours.)  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: enable Failure auditing &lt;em&gt;&lt;strong&gt;when using Windows Firewall&lt;/strong&gt;&lt;/em&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;System events&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The only semi-useful information I've ever found from this auditing are the startup and shutdown events, and they're much more useful in determining uptime statistics (and otherwise unseen BSOD events) than they are for security.  &lt;li&gt;Unfortunately, these events get buried under the amazing number of 514, 515 and 518 events that accumulate in the space of a few days.  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: No Auditing&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Summary: Windows XP Security Event Log auditing category recommendations&lt;/h3&gt; &lt;table cellspacing="1" cellpadding="1" width="400" border="2"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="196"&gt; &lt;p align="center"&gt;Security Event Log Category&lt;/p&gt;&lt;/td&gt; &lt;td valign="top" width="197"&gt; &lt;p align="center"&gt;Recommended Audit Level&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="196"&gt;Account Logon&lt;/td&gt; &lt;td valign="top" width="197"&gt;Success, Failure&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="196"&gt;Account Management&lt;/td&gt; &lt;td valign="top" width="197"&gt;Success, Failure&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="196"&gt;Directory Services access&lt;/td&gt; &lt;td valign="top" width="197"&gt;No auditing&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="196"&gt;Logon events&lt;/td&gt; &lt;td valign="top" width="197"&gt;No auditing&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="196"&gt;Object Access auditing&lt;/td&gt; &lt;td valign="top" width="197"&gt;No auditing&lt;strong&gt;*&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="196"&gt;Policy Change&lt;/td&gt; &lt;td valign="top" width="197"&gt;No auditing&lt;strong&gt;*&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="196"&gt;Privilege Use auditing&lt;/td&gt; &lt;td valign="top" width="197"&gt;No auditing&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="196"&gt;Process Tracking&lt;/td&gt; &lt;td valign="top" width="197"&gt;No auditing&lt;strong&gt;*&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="196"&gt;System events&lt;/td&gt; &lt;td valign="top" width="199"&gt;No auditing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;strong&gt;*&lt;/strong&gt; except in unusual circumstances, see above.&lt;/p&gt; &lt;h3&gt;Advanced Oddities&lt;/h3&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/ericfitz/archive/2004/12/20/327478.aspx"&gt;Per-user Auditing&lt;/a&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;As of Windows XP SP2, auditing can be enabled or disabled for any or all users  &lt;li&gt;Each category can be separately configured as well  &lt;li&gt;On a PC with many user accounts, this would be useful to help remove the less interesting entries  &lt;li&gt;However, where few accounts exist, and for PCs not joined to a domain, per-user auditing is not advised&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;Windows Firewall auditing&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;As I hinted above, there are some aspects of Windows Firewall's operations that can be logged to the Security Event Log, and which don't get logged to the pFirewall.log.  &lt;li&gt;For organizations using Windows Firewall, and especially those that don't have a perfect idea of all the exceptions they need to open up on their user's systems, this auditing can be extremely useful.  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: To capture this data, you should enable Policy Change (success and failure) and Process Tracking (failure) auditing on the target systems&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;File/Registry access auditing&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;If you're interested in detecting attacks that tamper with system files, then EricFitz has some &lt;a href="http://weblogs.asp.net/ericfitz/archive/2004/12/20/327478.aspx"&gt;fascinating work you should examine&lt;/a&gt;  &lt;li&gt;His work became the input for the &lt;a href="http://go.microsoft.com/fwlink/?linkid=45503"&gt;Security Configuration Wizard&lt;/a&gt; in Windows Server 2003 SP1  &lt;li&gt;Having had a quick look at it, there's nothing that looks dangerous or unsuitable for an XP client  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: if you'd like a quick &amp;amp; dirty way to detect changes to system files, cut and paste those "file access auditing" settings from the SCW templates, and make sure that you've also enabled Object Access auditing (success and/or failure, depending on whether you're after &lt;em&gt;actual&lt;/em&gt; changes or just &lt;em&gt;attempted&lt;/em&gt; changes)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;Full Privilege Auditing&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;You can toggle a Registry setting known as (duh) FullPrivilegeAuditing, but be warned: these are default disabled for good reason  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: &lt;a href="http://weblogs.asp.net/ericfitz/archive/2004/12/20/327478.aspx"&gt;do NOT enable this setting&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;Audit the access of global system objects&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Ever since this got added late in the NT4 service pack cycle, I've never quite figured out what this really tells me.&amp;nbsp; Eric doesn't seem to interested in this either for most of us.  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: &lt;a href="http://blogs.msdn.com/ericfitz/archive/2005/01/11/350848.aspx"&gt;turn this setting Off&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;Audit the use of Backup and Restore privilege&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;This setting blows me away — it'll fill up the most generous security event log, 'cause it creates an entry for each file that is backed up or restored  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: &lt;a href="http://blogs.msdn.com/ericfitz/archive/2005/01/11/350848.aspx"&gt;do NOT enable this setting&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;u&gt;CrashOnAuditFail aka "Shut down system immediately if unable to log security audits"&lt;/u&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Are you nuts?&amp;nbsp; Have you ever met a sysadmin that voluntarily puts in place a predictable Denial of Service attack?  &lt;li&gt;If you're that one-in-a-million organization that can actually implement this setting, I want to hear from you.&amp;nbsp; Yours is a tale I just &lt;strong&gt;gotta&lt;/strong&gt; hear…  &lt;li&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: duh, do NOT enable this setting&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;For More Information...&lt;/h3&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/ericfitz/"&gt;Eric Fitzgerald&lt;/a&gt; is an old colleague of mine from my days at Microsoft, and I have an incredible amount of respect for the depth and persistence with which he pursued issues in the Auditing subsystem of Windows over the years.&amp;nbsp; He's like the Rain Main of Windows security eventing, except I don't think he's much of a fan of Wapner. ;)&amp;nbsp; Eric's "&lt;a href="http://blogs.msdn.com/ericfitz/"&gt;Windows Security Logging and Other Esoterica&lt;/a&gt;" blog is chock full of Windows security auditing goodness.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.ultimatewindowssecurity.com/encyclopedia.aspx"&gt;Windows Security Log Encyclopedia&lt;/a&gt; — Randy Franklin Smith's take on Security Event Logs&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/technet/support/ee/ee_advanced.aspx"&gt;Technet Events &amp;amp; Errors Message Center&lt;/a&gt; — detailed information backing up each security Event ID and what it means.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/ericfitz/archive/2005/08/04/447934.aspx"&gt;Deciphering Account Logon Events&lt;/a&gt; — in case you wonder what "Logon Type 5" really means…&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/ericfitz/archive/2005/01/11/350848.aspx"&gt;Account Management — disabling the noise&lt;/a&gt; — and we're done!&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;[&lt;em&gt;Apologies to anyone monitoring my external blog, as this is a straight repost.&amp;nbsp; However, I'm assuming very few of you know about both, so I'm going to start reposting anything that's applicable to both audiences.&lt;/em&gt;]&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-7678572691855997057?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/7678572691855997057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=7678572691855997057' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7678572691855997057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/7678572691855997057'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/02/which-security-event-log-audit_12.html' title='Which Security Event Log audit categories are most useful on a Windows client?'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-8264022832563419821</id><published>2008-02-05T11:01:00.001-08:00</published><updated>2008-02-05T11:01:51.349-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random rants'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><title type='text'>As David Hsing says: Best. Troll. Ever.</title><content type='html'>&lt;p&gt;Holy crap that's funny:&lt;/p&gt; &lt;p&gt;&lt;a href="http://talkback.zdnet.com/5208-12355-0.html?forumID=1&amp;amp;threadID=31199&amp;amp;messageID=579806&amp;amp;start=43"&gt;http://talkback.zdnet.com/5208-12355-0.html?forumID=1&amp;amp;threadID=31199&amp;amp;messageID=579806&amp;amp;start=43&lt;/a&gt; &lt;p&gt;Reproduced here for those (like me) too lazy to click through: &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;You are kidding aren't you?&lt;/strong&gt;&amp;nbsp; Are you saying that this linux can run on a computer without windows underneath it, at all?&amp;nbsp; As in, without a boot disk, without any drivers, and without any services?&lt;br&gt;&lt;br&gt;That sounds preposterous to me.&lt;br&gt;&lt;br&gt;If it were true (and I doubt it), then companies would be selling computers without a windows.&amp;nbsp; This clearly is not happening, so there must be some error in your calculations.&amp;nbsp; I hope you realise that windows is more than just Office?&amp;nbsp; It's a whole system that runs the computer from start to finish, and that is a very difficult thing to achieve.&amp;nbsp; A lot of people don't realise this.&lt;br&gt;&lt;br&gt;Microsoft just spent $9 billion and many years to create Vista, so it does not sound reasonable that some new alternative could just snap into existence overnight like that.&amp;nbsp; It would take billions of dollars and a massive effort to achieve.&amp;nbsp; IBM tried, and spent a huge amount of money developing OS/2 but could never keep up with Windows.&amp;nbsp; Apple tried to create their own system for years, but finally gave up recently and moved to Intel and Microsoft.&lt;br&gt;&lt;br&gt;It's just not possible that a freeware like the Linux could be extended to the point where it runs the entire computer from start to finish, without using some of the more critical parts of windows.&amp;nbsp; Not possible.&lt;br&gt;&lt;br&gt;I think you need to re-examine your assumptions.&amp;nbsp; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;YES (for the sarcasm-impaired), this is a joke, and it's NOT my writing.&amp;nbsp; Don't bitch at me if you are rabidly anti-Windows — click on the link above and rant away to your heart's content.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-8264022832563419821?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/8264022832563419821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=8264022832563419821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/8264022832563419821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/8264022832563419821'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/02/as-david-hsing-says-best-troll-ever.html' title='As David Hsing says: Best. Troll. Ever.'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-8869214279492290934</id><published>2008-02-02T18:58:00.001-08:00</published><updated>2008-02-02T18:58:53.174-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random rants'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><title type='text'>Debugging a Word 2003 runaway thread...but not successfully</title><content type='html'>&lt;p&gt;I just experienced one of the usual "hangs" in Microsoft Word 2003 that happen pretty regularly when working on multiple, large documents for any significant length of time.&amp;nbsp; The WINWORD.EXE process is taking up 50% of my CPU (which as a dual-core processor, means that there's a thread that's somehow taking up 100% of the logical CPU for which it's scheduled), and has been doing this for at least ten minutes now with no letup.&lt;/p&gt; &lt;p&gt;In my experience, these "runaway consumers of CPU cycles" just never quiesce — eventually I have to decide to kill WINWORD.EXE from Task Manager or Process Explorer, or else the offending process will consume that "CPU" from now until the end of time.&lt;/p&gt; &lt;p&gt;Maybe I was just bored today, 'cause rather than just kill the runaway process, I decided to see if I could dig a little deeper.&amp;nbsp; [I think Mark Russinovich has infected me with the idea that these are surmountable problems — though I wouldn't dream of trying to make a favourable comparison between my haphazard hacking and Mark's mad skillz.]&lt;/p&gt; &lt;h3&gt;Process Explorer&lt;/h3&gt; &lt;p&gt;Let's have a look at a few screenshots, shall we?&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.google.com/mikesmithlonergan/R6UtyW4XbtI/AAAAAAAAATE/QMLl5u042-M/image11"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="421" alt="image" src="http://lh4.google.com/mikesmithlonergan/R6Uty24XbuI/AAAAAAAAATM/kS9jKKxk_nI/image_thumb7" width="364" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;br&gt;(Performance stats, in case that's useful to anyone — though it doesn't provide &lt;em&gt;me&lt;/em&gt; any telling evidence)&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.google.com/mikesmithlonergan/R6UtzG4XbvI/AAAAAAAAATU/eZYY_nnK8zQ/image12"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="426" alt="image" src="http://lh3.google.com/mikesmithlonergan/R6Utzm4XbwI/AAAAAAAAATc/anAWUZFF-yU/image_thumb8" width="364" border="0"&gt;&lt;/a&gt; &lt;br&gt;(Listing of the threads currently instantiated in WINWORD.EXE including the main thread, which is the one causing all the problems)&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.google.com/mikesmithlonergan/R6Utz24XbxI/AAAAAAAAATk/dmTeSvW56Xk/image19"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="251" alt="image" src="http://lh5.google.com/mikesmithlonergan/R6Ut0G4XbyI/AAAAAAAAATs/bsyM88NxyUo/image_thumb13" width="405" border="0"&gt;&lt;/a&gt; &lt;br&gt;(Stack contents for the WINWORD.EXE thread)&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.google.com/mikesmithlonergan/R6Ut0W4XbzI/AAAAAAAAAT0/UXHlMTbJTcs/image23"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="251" alt="image" src="http://lh3.google.com/mikesmithlonergan/R6Ut0m4Xb0I/AAAAAAAAAT8/eyEop6ytSFA/image_thumb15" width="405" border="0"&gt;&lt;/a&gt; &lt;br&gt;(Stack contents for GdiPlus.DLL thread, which was the only other thread with any activity under the "CSwitch Delta" heading)&lt;/p&gt; &lt;h3&gt;Process Monitor&lt;/h3&gt; &lt;p&gt;Once I decided to investigate, I fired up Process Monitor and limited it to WINWORD.EXE.&amp;nbsp; The activity logged is almost entirely like this:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.google.com/mikesmithlonergan/R6Ut1G4Xb1I/AAAAAAAAAUE/IMk_vCp19V8/image28"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="278" alt="image" src="http://lh4.google.com/mikesmithlonergan/R6Ut124Xb2I/AAAAAAAAAUM/A5PScFF_gjY/image_thumb18" width="644" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Don't strain your eyes too badly on this — I've included this just to note the incessant nature of the major activity here: a rapidly-repeating WriteFile operation on a single Temporary file (~WRS1954.tmp), interrupted once in a while by a smaller (Length of anywhere between 512 and 3072) ReadFile operation on the same file:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh5.google.com/mikesmithlonergan/R6Ut2G4Xb3I/AAAAAAAAAUU/vKp2ZLMxVTI/image35"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="135" alt="image" src="http://lh3.google.com/mikesmithlonergan/R6Ut2m4Xb4I/AAAAAAAAAUc/FJOJi-wpnKw/image_thumb21" width="367" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Interestingly, these ReadFile operations occur in an irregular but repeating pattern:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.google.com/mikesmithlonergan/R6Ut224Xb5I/AAAAAAAAAUk/fS1oXYP74FI/image57"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="329" alt="image" src="http://lh5.google.com/mikesmithlonergan/R6Ut3G4Xb6I/AAAAAAAAAUs/zjY2_2tncZo/image_thumb31" width="115" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Also of note is the fact that this temporary file is constantly growing in size, and not just temporarily swelling the data stored within a pre-allocated file — I confirmed that by right-clicking on the Path in Process Monitor, chose "Jump to Location…" and simply Refreshed on the folder to observe the reported file Size was incrementing every time (over a span of 50 minutes, it grew by approx. 222 Kb, or 233657856 bytes).&lt;/p&gt; &lt;p&gt;If I look closer at the Handles for WINWORD.EXE, I notice that this is one of many Temporary files open by Word, which implies that the problem we're experiencing is very specific to one type of unexpected activity (and not just affecting Word's handling of Temporary files):&lt;br&gt;&lt;a href="http://lh6.google.com/mikesmithlonergan/R6Ut3W4Xb7I/AAAAAAAAAU0/IhXq4ivzBLo/image53"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="245" alt="image" src="http://lh3.google.com/mikesmithlonergan/R6Ut3m4Xb8I/AAAAAAAAAU8/w0C_LajgbyA/image_thumb29" width="630" border="0"&gt;&lt;/a&gt;&lt;br&gt;(Note: I intentionally "hashed" out the original filename, which is the last entry in the list pictured.)&lt;/p&gt; &lt;p&gt;One other piece of information: I tried to resize the Window in which the active document was being displayed.&amp;nbsp; Word appended "(Not Responding)" to its Title Bar, and that seems to have changed the behaviour profile of the WINWORD.EXE thread.&amp;nbsp; Since that point in time, Process Monitor did not record any further increase in the size of the ~WRS1954.tmp file, but recorded one additional ReadFile operation on the WINWORD.EXE file itself (Offset: 3998720, Length: 4096).&amp;nbsp; [WINWORD.EXE File version = 11.0.8169.0, Digital signature timestamp = May 31, 2007 12:38:03 PM]&lt;/p&gt; &lt;p&gt;Finally, I grabbed a full memory dump of the WINWORD.EXE process, using windbg.exe and the &lt;strong&gt;.dump /ma&lt;/strong&gt; command.&amp;nbsp; I can't say I know much about debugging a dump file, but I've got it on the off-chance that I ever find a good guide to debugging.&lt;/p&gt; &lt;h3&gt;What Caused This?&lt;/h3&gt; &lt;p&gt;Three circumstances I think contributed to this, though in my opinion none of them &lt;em&gt;should&lt;/em&gt; lead to hung process (since I've done this more often &lt;em&gt;without&lt;/em&gt; incident):&lt;/p&gt; &lt;ol&gt; &lt;li&gt;I had opened a Word 2003 document directly from Outlook (it was attached to an email).  &lt;li&gt;The document had Track Changes enabled, and I'd already added Comments throughout the document. &lt;li&gt;In the Comment I was just editing, it had scrolled off screen…&lt;br&gt;&lt;a href="http://lh6.google.com/mikesmithlonergan/R6Ut6W4Xb9I/AAAAAAAAAVE/yzrXCtNIB0s/image38"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="92" alt="image" src="http://lh3.google.com/mikesmithlonergan/R6Ut6m4Xb-I/AAAAAAAAAVM/a54I22UvJRc/image_thumb22" width="224" border="0"&gt;&lt;/a&gt; &lt;br&gt;…and I had just attempted to apply formatting (I'd typed [Ctrl]-B and [Ctrl]-I rapidly,to bold and italicize) to a single word in the Track Changes panel below the document (the one that opens automatically when you keep typing in Comments that have already "scrolled off screen").&lt;br&gt;&amp;nbsp;&lt;a href="http://lh4.google.com/mikesmithlonergan/R6Ut624Xb_I/AAAAAAAAAVU/vCU-zz0GD28/image45"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="119" alt="image" src="http://lh5.google.com/mikesmithlonergan/R6Ut7G4XcAI/AAAAAAAAAVc/y9s0L3-PFOc/image_thumb25" width="644" border="0"&gt;&lt;/a&gt;&lt;br&gt;(Note: I intentionally redacted the confidential text — but it sure ain't artistic)&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Caveat: While my experience with Word over the years has taught me that heavy use and abuse of the Comments feature leads to instability, I'm still miffed that I'd lose the recent batch of edits just because I'd foolishly tried to emphasize my point using basic formatting in a Comment.&lt;/p&gt; &lt;h3&gt;So What Can We Conclude So Far?&lt;/h3&gt; &lt;p&gt;I don't know much about reading a stack trace, so this is all guesstimation on my part (plus a little intelligence gathered from &lt;a href="http://blogs.technet.com/markrussinovich/archive/2005/08/28/the-case-of-the-intermittent-and-annoying-explorer-hangs.aspx"&gt;a good Russinovich article&lt;/a&gt;).&amp;nbsp; The WINWORD stack indicates that Word has called &lt;strong&gt;ntkrnlpa.exe&lt;/strong&gt; aka the Windows kernel.&amp;nbsp; It looks like it's basically stalled (KiDispatchInterrupt) while creating a new thread (KiThreadStartup).&amp;nbsp; Looking lower in the stack, the first caller in WINWORD is labelled only "0x1a772b" — whatever that is, it's beyond my skills to unearth the identity of that API.&lt;/p&gt; &lt;p&gt;The next one down in the stack, however, is wdGetApplicationObject().&amp;nbsp; There's no information in MSDN that references this function, though a few pages on the 'net do allude to it (mostly in the same kinds of searches I made).&amp;nbsp; The best info I could find was &lt;a href="http://www.codeguru.com/forum/archive/index.php/t-122578.html"&gt;here&lt;/a&gt;, which I'm guessing is Word's way of getting a handle to the overall Word "application object".&amp;nbsp; However, without any further context, it's very hard to imagine what is really going on here.&lt;/p&gt; &lt;p&gt;Turning to the GdiPlus stack, it looks like another kernel call that's stalled (many similar references to "WaitForMultipleObjects" functions), all boiling down to a call to the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms534051(VS.85).aspx"&gt;GdipCreateSolidFill()&lt;/a&gt; API.&amp;nbsp; From what MSDN documents, this seems like a pretty innocuous function, having nothing to do with temporary files, only to do with UI.&amp;nbsp; I can understand this — by the time I'd looked at the GdiPlus stack, I believe the UI had "hung" (aka it was non-responsive).&amp;nbsp; So while this thread was also active, it's almost impossible for it to be involved in this issue.&lt;/p&gt; &lt;p&gt;Then the only thing I know for sure is the temp file was growing due to some runaway operation, and the runaway operation (which was probably related to an attempt to format Comment text) at some point obtained a handle to the Word application object.&lt;/p&gt; &lt;p&gt;I'm guessing that the only way to get any closer to the root cause would be to dig into the memory dump.&amp;nbsp; And…bugger me, the dump I grabbed ended up with this as its STACK_TEXT (from &lt;strong&gt;!analyze -v&lt;/strong&gt;):&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;0adaffc8 7c9507a8 00000005 00000004 00000001 ntdll!DbgBreakPoint&lt;br&gt;0adafff4 00000000 00000000 00000000 00000000 ntdll!DbgUiRemoteBreakin+0x2d&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Guess that's "the wall" for me.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12304400-8869214279492290934?l=paranoidmike.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paranoidmike.blogspot.com/feeds/8869214279492290934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12304400&amp;postID=8869214279492290934' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/8869214279492290934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12304400/posts/default/8869214279492290934'/><link rel='alternate' type='text/html' href='http://paranoidmike.blogspot.com/2008/02/debugging-word-2003-runaway-threadbut.html' title='Debugging a Word 2003 runaway thread...but not successfully'/><author><name>Mike Lonergan</name><uri>http://www.blogger.com/profile/07737011818478364089</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_1WqHdd7PNLs/SSm4z5MyKJI/AAAAAAAAAt0/8C6DmwpFOBc/S220/Mike+South+Park+avatar.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12304400.post-6776808799962390107</id><published>2008-01-31T20:40:00.001-08:00</published><updated>2008-01-31T20:40:03.291-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSTO'/><category scheme='http://www.blogger.com/atom/ns#' term='.net coding'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='CodePlex'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><category scheme='http://www.blogger.com/atom/ns#' term='MCML'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista Media Center'/><title type='text'>"Go/No-Go" Decisions on MyPicasaPictures, Attensa Sync to Google Reader, W2MW++</title><content type='html'>&lt;p&gt;I've done a lot of investigatory work in the last few lunar cycles of different development projects I'd dreamed up.&amp;nbsp; However, after the investigation and the internal decision making was completed, I didn't do a good job of "closing the loop" with any of you who have wondered "what happened all those projects?".&lt;/p&gt; &lt;p&gt;I haven't thought much about the royal "you" in this work — I've been sharing the steps and findings, but recently I started to wonder what people would think in the future if they happened to search on something that led them to one of these projects' articles.&amp;nbsp; I'd feel pretty frustrated trying to find out where these things led (if anywhere) and where (if anywhere) there might be code that came out of these efforts.&lt;/p&gt; &lt;p&gt;Well then, it's time to close the loop on these — at least, as much as I am "decided" on any of these so far.&amp;nbsp; That said, I'm never committed to any particular decision like this if any new evidence surfaces in the future to challenge my assumptions.&amp;nbsp; So if anyone is interested in picking up where I left off on any of this, drop me a line to let me know (I'm always interested in this kind of experimental work), and if you'd like to bounce some ideas off me, or see if I'd be interested in participating, I'll always be open to such inquiries.&lt;/p&gt; &lt;h3&gt;MyPicasaPictures: No-Go&lt;/h3&gt; &lt;p&gt;Bottom line: while the &lt;a href="http://paranoidmike.blogspot.com/search/label/MCML"&gt;effort to understand the VMC development environment&lt;/a&gt; was instructional and probably honed my ability to figure out what to look for in future explorations, my overall impression of MCML is that it's just &lt;a href="http://discuss.mediacentersandbox.com/search/SearchResults.aspx?u=5748&amp;amp;o=DateDescending"&gt;too damned hard for amount of value I might derive&lt;/a&gt; from it.&lt;/p&gt; &lt;p&gt;That, plus the chronic and unresolved stability issues I'm seeing with Vista Media Center (exacerbated by the merciless complaints and teasing I receive from my wife, who keeps saying "The XP box was much more stable, wasn't it?") have pretty much convinced me to pave the box, downgrade to Windows XP and to give Beyond TV a try.&amp;nbsp; [Their &lt;a href="http://www.snapstream.com/partners/beyondtvsdk.asp"&gt;SDKs&lt;/a&gt; and more open, flexible architecture look like the perfect place to invest .NET development efforts, and the customer satisfaction with Beyond TV seems far superior to Windows Media Center, at least based on my initial research.]&lt;/p&gt; &lt;h3&gt;Attensa Sync to Google Reader: No-Go&lt;/h3&gt; &lt;p&gt;I had &lt;a href="http://paranoidmike.blogspot.com/2007/11/what-if-google-reader-had-sucky-api.html"&gt;already decided&lt;/a&gt; to move from &lt;a href="http://www.attensa.com/get-it/stable.php"&gt;Attensa for Outlook&lt;/a&gt; to &lt;a href="http://www.newsgator.com/Individuals/NewsGatorInbox/Default.aspx"&gt;NewsGator Inbox&lt;/a&gt;, and then a few weeks ago NewsGator announced that their previously $30 Outlook client would henceforth be &lt;a href="http://www.newsgator.com/Individuals/Default.aspx"&gt;available for FREE&lt;/a&gt; to any and all concerned.&lt;/p&gt; &lt;p&gt;While there was no conversion possible from Attensa to NewsGator (well, I could import the OPML, but I couldn't sync the "read/unread" status of all my articles, nor transparently migrate old articles to the new folder structure), everything else about this has been a positive experience.&amp;nbsp; I'm totally addicted to the NewsGator &lt;a href="http://www.newsgator.com/CompanyInfo/Press/Archive.aspx?post=137"&gt;Mobile Reader for iPhone&lt;/a&gt;, and the fact that it syncs with my Outlook "read/unread" status is just awesome.&amp;nbsp; Congrats, NewsGator!&lt;/p&gt; &lt;p&gt;Attensa, I wish you luck in trying to survive the competitive pressures from NewsGator.&amp;nbsp; If I didn't know better, I'd guess this is the beginning of the decline for Attensa, even though I think their Outlook client is superior to the current NewsGator Inbox offering.&lt;/p&gt; &lt;h3&gt;W2MW++: Undecided&lt;/h3&gt; &lt;p&gt;When I first read about the "&lt;a href="http://www.linux.com/feature/119363"&gt;export to MediaWiki&lt;/a&gt;" capability in &lt;a href="http://www.openoffice.org/"&gt;OpenOffice&lt;/a&gt; &lt;a href="http://www.openoffice.org/product/writer.html"&gt;Writer&lt;/a&gt; 2.3, I quickly concluded that any work I or the rest of the community had done for an Office add-in would become a moot point.&amp;nbsp; [Amusing but not-entirely-inaccurate Spoonerism: my wife knew a guy who insisted that the term was "a &lt;strong&gt;&lt;em&gt;mute&lt;/em&gt;&lt;/strong&gt; point".]&lt;/p&gt; &lt;p&gt;However, after using Writer 2.3 to convert a few relatively simple Word 2003 documents to MediaWiki format, I realize that they still have a long way to go to preserve real fidelity of layout and formatting in Word documents.&amp;nb
