<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Where in the API is Andrew Richards?</title><link>http://blogs.msdn.com/b/andrew_richards/</link><description>This blog contains random snippets/thoughts as I wonder around various SDK and WDK APIs...</description><dc:language>en-US</dc:language><generator>Telligent Community 5.6.583.20496 (Build: 5.6.583.20496)</generator><item><title>Implementing ICorDebugManagedCallback2</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2012/01/30/implementing-icordebugmanagedcallback2.aspx</link><pubDate>Mon, 30 Jan 2012 20:42:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10261863</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10261863</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2012/01/30/implementing-icordebugmanagedcallback2.aspx#comments</comments><description>&lt;p&gt;Implementing &lt;a title="ICorDebugManagedCallback2" href="http://msdn.microsoft.com/en-us/library/ms232530.aspx"&gt;ICorDebugManagedCallback2&lt;/a&gt; isn't too hard, it just takes a lot of boiler-plate code to make ICorDebug happy.&amp;nbsp; So as to make this easier for anyone who would like to implement ICorDebugManagedCallback2, attached is the template code to start from.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10261863" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-26-18-63/CorDebugManagedCallback2.zip" length="3112" type="application/zip" /><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/ICorDebugManagedCallback2/">ICorDebugManagedCallback2</category></item><item><title>Writing a Plug-in for Sysinternals ProcDump v4.0</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/12/02/writing-a-plug-in-for-sysinternals-procdump-v4-0.aspx</link><pubDate>Sat, 03 Dec 2011 00:49:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10243881</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10243881</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/12/02/writing-a-plug-in-for-sysinternals-procdump-v4-0.aspx#comments</comments><description>&lt;p&gt;My 4th MSDN Magazine article is now available online:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;Writing a Plug-in for Sysinternals ProcDump v4.0&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/hh580738.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/hh580738.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10243881" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/MSDN+Magazine/">MSDN Magazine</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Mark+Russinovich/">Mark Russinovich</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/ProcDump/">ProcDump</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Debugger/">Debugger</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/DbgHelp/">DbgHelp</category></item><item><title>Fixing an ICorDebugUnmanagedCallback induced hang</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/11/29/fixing-an-icordebugunmanagedcallback-induced-hang.aspx</link><pubDate>Tue, 29 Nov 2011 18:32:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10242502</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10242502</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/11/29/fixing-an-icordebugunmanagedcallback-induced-hang.aspx#comments</comments><description>&lt;p&gt;Just posted an article on the NTDebugging blog about &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms232505.aspx&lt;strong&gt;ICorDebugUnmanagedCallback::DebugEvent&lt;/strong&gt;"&gt;ICorDebugUnmanagedCallback::DebugEvent&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/b/ntdebugging/archive/2011/11/29/fixing-an-icordebugunmanagedcallback-induced-hang.aspx"&gt;http://blogs.msdn.com/b/ntdebugging/archive/2011/11/29/fixing-an-icordebugunmanagedcallback-induced-hang.aspx&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10242502" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/ICorDebugUnmanagedCallback/">ICorDebugUnmanagedCallback</category></item><item><title>Debugger Engine (DbgEng) updates in the Windows 8 Developer Preview</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/09/24/debugger-engine-dbgeng-updates-in-windows-8-developer-preview.aspx</link><pubDate>Sat, 24 Sep 2011 20:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10216252</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10216252</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/09/24/debugger-engine-dbgeng-updates-in-windows-8-developer-preview.aspx#comments</comments><description>&lt;p&gt;Today I wanted to find out what the Debugger Engine (DbgEng) changes are between Windows 7 and the Windows 8 Developer Preview.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;To get the differences, I did a WinDiff between the SDK 7.1 &amp;lsquo;DbgEng.h&amp;rsquo; header file and the new version (C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x64\sdk\inc) shipped with the Windows 8 Developer Preview&amp;rsquo;s WDK (en_windows_developer_preview_wdk_x86_x64_741966.zip).&lt;/p&gt;
&lt;p&gt;By just looking at the header file, you can easily see that there are lots of new goodies.&amp;nbsp; Of major note is the support for inline debugging; this new feature has caused a few interface revisions and some additional constants.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s dive in!&lt;/p&gt;
&lt;h2&gt;Global Functions&lt;/h2&gt;
&lt;p&gt;There is only one new global function. The &lt;strong&gt;DebugCreate &lt;/strong&gt;function has been extended by adding Debugger Engine Options (&lt;strong&gt;DEBUG_ENGOPT_XXX&lt;/strong&gt;) via the new &lt;strong&gt;DebugCreateEx &lt;/strong&gt;function.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDAPI &lt;br /&gt;DebugCreateEx( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ REFIID InterfaceId, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;_In_ DWORD&amp;nbsp; DbgEngOptions,&lt;/strong&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_ PVOID* Interface &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ); &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugAdvanced2 Interface&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;IDebugAdvanced2::Request&lt;/strong&gt; function supports three new requests.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// InBuffer - ULONG64 for process server identification and ULONG as PID &lt;br /&gt;// OutBuffer - Unused &lt;br /&gt;#define DEBUG_REQUEST_WOW_PROCESS 31&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// InBuffer - ULONG64 for process server identification and PWSTR as module path &lt;br /&gt;// OutBuffer - Unused &lt;br /&gt;#define DEBUG_REQUEST_WOW_MODULE 32&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// InBuffer - Unused &lt;br /&gt;// OutBuffer - Unused &lt;br /&gt;// return - S_OK is non-invasive user-mode attach, S_FALSE if not (but still live user-mode), E_FAIL otherwise. &lt;br /&gt;#define DEBUG_LIVE_USER_NON_INVASIVE 33 &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugBreakpoint Interface&lt;/h2&gt;
&lt;p&gt;In alignment with the new inline debugging support, a new inline breakpoint has been added for use with &lt;strong&gt;IDebugBreakpoint::GetType&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;#define DEBUG_BREAKPOINT_INLINE 3 &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugBreakpoint3 Interface (new)&lt;/h2&gt;
&lt;p&gt;The new &lt;strong&gt;IDebugBreapkpoint3&lt;/strong&gt; interface has just a single function (&lt;strong&gt;GetGUID&lt;/strong&gt;) that returns a GUID.&amp;nbsp; This is the unique identifier of the breakpoint. The GUID can be passed to &lt;strong&gt;IDebugControl5::GetBreakpointByGuid&lt;/strong&gt; to get the &lt;strong&gt;IDebugBreakpoint3 &lt;/strong&gt;interface.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(GetGuid)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_ LPGUID Guid &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugClient2 Interface&lt;/h2&gt;
&lt;p&gt;There are two new &lt;strong&gt;DEBUG_FORMAT_XXX&lt;/strong&gt; constants for use with &lt;strong&gt;IDebugClient2::WriteDumpFile2&lt;/strong&gt; and &lt;strong&gt;IDebugClient4::WriteDumpFileWide&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;#define DEBUG_FORMAT_USER_SMALL_MODULE_HEADERS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00008000 &lt;br /&gt;#define DEBUG_FORMAT_USER_SMALL_FILTER_TRIAGE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00010000 &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugClient6 Interface (new)&lt;/h2&gt;
&lt;p&gt;The new &lt;strong&gt;IDebugEventContextCallbacks&lt;/strong&gt; interface can be set on the debugger client via &lt;strong&gt;IDebugClient6::SetEventContextCallbacks&lt;/strong&gt;. This new event interface replaces the use of &lt;strong&gt;IDebugClient::SetEventCallbacks&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(SetEventContextCallbacks)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_opt_ PDEBUG_EVENT_CONTEXT_CALLBACKS Callbacks &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugClient7 Interface (new)&lt;/h2&gt;
&lt;p&gt;The new &lt;strong&gt;SetClientContext&lt;/strong&gt; function takes one of the new a &lt;strong&gt;DEBUG_CLIENT_XXX &lt;/strong&gt;constants via the new &lt;strong&gt;DEBUG_CLIENT_CONTEXT&lt;/strong&gt; structure. It is used to tailor the debugger client to the various (known) debugger applications.&amp;nbsp; Integrated debugging in Visual Studio 2011 is DEBUG_CLIENT_VSINT.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Client identification constants &lt;br /&gt;#define DEBUG_CLIENT_UNKNOWN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x0 &lt;br /&gt;#define DEBUG_CLIENT_VSINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x1 &lt;br /&gt;#define DEBUG_CLIENT_NTSD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x2 &lt;br /&gt;#define DEBUG_CLIENT_NTKD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x3 &lt;br /&gt;#define DEBUG_CLIENT_CDB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x4 &lt;br /&gt;#define DEBUG_CLIENT_KD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x5 &lt;br /&gt;#define DEBUG_CLIENT_WINDBG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x6 &lt;br /&gt;#define DEBUG_CLIENT_WINIDE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x7&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;typedef struct _DEBUG_CLIENT_CONTEXT &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINT cbSize; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINT eClient; &lt;br /&gt;} DEBUG_CLIENT_CONTEXT, *PDEBUG_CLIENT_CONTEXT;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// IDebugClient7&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(SetClientContext)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugControl Interface&lt;/h2&gt;
&lt;p&gt;The Engine Options (&lt;strong&gt;DEBUG_ENGOPT_XXX&lt;/strong&gt;) have been updated with a higher &lt;strong&gt;DEBUG_ENGOPT_ALL&lt;/strong&gt; value and a new option to disable SQM (Software Quality Metrics &amp;ndash; better known as Customer Experience Improvement Program). The options can be set via &lt;strong&gt;DebugCreateEx &lt;/strong&gt;and &lt;strong&gt;IDebugControl::SetEngineOptions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Explicitly disable SQM upload. &lt;br /&gt;#define DEBUG_ENGOPT_DISABLESQM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00080000 &lt;br /&gt;#define DEBUG_ENGOPT_ALL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x000FFFFF &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugControl5 Interface (new)&lt;/h2&gt;
&lt;p&gt;The new inline frame support can be toggled off and on via &lt;strong&gt;.inline_query 0&lt;/strong&gt; and &lt;strong&gt;.inline_query 1&lt;/strong&gt; respectively (it is on by default).&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;#define DBG_FRAME_DEFAULT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 // the same as INLINE_FRAME_CONTEXT_INIT in dbghelp.h &lt;br /&gt;#define DBG_FRAME_IGNORE_INLINE 0xFFFFFFFF // the same as INLINE_FRAME_CONTEXT_IGNORE in dbghelp.h&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;DEBUG_STACK_FRAME &lt;/strong&gt;structure has been enhanced to support inline frames via the &lt;strong&gt;DEBUG_STACK_FRAME_EX &lt;/strong&gt;structure.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;typedef struct _DEBUG_STACK_FRAME_EX &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // First DEBUG_STACK_FRAME structure &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG64 InstructionOffset; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG64 ReturnOffset; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG64 FrameOffset; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG64 StackOffset; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG64 FuncTableEntry; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG64 Params[4]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG64 Reserved[6]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOOL&amp;nbsp;&amp;nbsp;&amp;nbsp; Virtual; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG&amp;nbsp;&amp;nbsp; FrameNumber;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Extended DEBUG_STACK_FRAME fields. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG InlineFrameContext; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG Reserved1; // For alignment purpose. &lt;br /&gt;} DEBUG_STACK_FRAME_EX, *PDEBUG_STACK_FRAME_EX;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;IDebugControl5 &lt;/strong&gt;interface has extended the stack functions to return the additional inline frames.&amp;nbsp; Note, the older interfaces behave the same as before &amp;ndash; they do not include inline frames.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// IDebugControl5 &lt;br /&gt;STDMETHOD(GetStackTraceEx)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 FrameOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 StackOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 InstructionOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_writes_to_(FramesSize,*FramesFilled) PDEBUG_STACK_FRAME_EX Frames, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FramesSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG FramesFilled &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(OutputStackTraceEx)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG OutputControl, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_opt_(FramesSize) PDEBUG_STACK_FRAME_EX Frames, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FramesSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Flags &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(GetContextStackTraceEx)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_opt_(StartContextSize) PVOID StartContext, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG StartContextSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_writes_to_opt_(FramesSize,*FramesFilled) PDEBUG_STACK_FRAME_EX Frames, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FramesSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_writes_bytes_opt_(FrameContextsSize) PVOID FrameContexts, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FrameContextsSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FrameContextsEntrySize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG FramesFilled &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(OutputContextStackTraceEx)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG OutputControl, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_(FramesSize) PDEBUG_STACK_FRAME_EX Frames, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FramesSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(FrameContextsSize) PVOID FrameContexts, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FrameContextsSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FrameContextsEntrySize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Flags &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(GetBreakpointByGuid)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ LPGUID Guid, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_ PDEBUG_BREAKPOINT3* Bp &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugControl6 Interface (new)&lt;/h2&gt;
&lt;p&gt;The new &lt;strong&gt;IDebugControl6 &lt;/strong&gt;interface contains functions to determine the state of debugging session&amp;rsquo;s connection.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Returns additional info states for &lt;br /&gt;STDMETHOD(GetExecutionStatusEx)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_ PULONG Status &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(GetSynchronizationStatus)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_ PULONG SendsAttempted, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_ PULONG SecondsSinceLastResponse &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugEventCallbacks Interface&lt;/h2&gt;
&lt;p&gt;The &amp;lsquo;Change Debuggee State&amp;rsquo; flags (&lt;strong&gt;DEBUG_CDS_XXX&lt;/strong&gt;) have a new value for refresh, and a new associated arguments (&lt;strong&gt;DEBUG_CDS_REFRESH_XXX&lt;/strong&gt;). These are passed to &lt;strong&gt;IDebugEventCallbacks::ChangeDebuggeeState&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Inform the GUI clients to refresh debugger windows. &lt;br /&gt;#define DEBUG_CDS_REFRESH&amp;nbsp;&amp;nbsp; 0x00000004&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// DEBUG_CDS_REFRESH IDs &lt;br /&gt;#define DEBUG_CDS_REFRESH_EVALUATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 &lt;br /&gt;#define DEBUG_CDS_REFRESH_EXECUTE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 &lt;br /&gt;#define DEBUG_CDS_REFRESH_EXECUTECOMMANDFILE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 &lt;br /&gt;#define DEBUG_CDS_REFRESH_ADDBREAKPOINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4 &lt;br /&gt;#define DEBUG_CDS_REFRESH_REMOVEBREAKPOINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5 &lt;br /&gt;#define DEBUG_CDS_REFRESH_WRITEVIRTUAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6 &lt;br /&gt;#define DEBUG_CDS_REFRESH_WRITEVIRTUALUNCACHED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7 &lt;br /&gt;#define DEBUG_CDS_REFRESH_WRITEPHYSICAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 &lt;br /&gt;#define DEBUG_CDS_REFRESH_WRITEPHYSICAL2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9 &lt;br /&gt;#define DEBUG_CDS_REFRESH_SETVALUE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10 &lt;br /&gt;#define DEBUG_CDS_REFRESH_SETVALUE2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11 &lt;br /&gt;#define DEBUG_CDS_REFRESH_SETSCOPE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 12 &lt;br /&gt;#define DEBUG_CDS_REFRESH_SETSCOPEFRAMEBYINDEX&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 13 &lt;br /&gt;#define DEBUG_CDS_REFRESH_SETSCOPEFROMJITDEBUGINFO 14 &lt;br /&gt;#define DEBUG_CDS_REFRESH_SETSCOPEFROMSTOREDEVENT&amp;nbsp; 15&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugEventContextCallbacks Interface (new)&lt;/h2&gt;
&lt;p&gt;The new &lt;strong&gt;IDebugEventContextCallbacks &lt;/strong&gt;interface is the same as the &lt;strong&gt;IDebugEventCallbacks &lt;/strong&gt;interface but adds the new &lt;strong&gt;DEBUG_EVENT_CONTEXT &lt;/strong&gt;structure to each function.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;typedef struct _DEBUG_EVENT_CONTEXT &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG Size; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG ProcessEngineId; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG ThreadEngineId; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG FrameEngineId; &lt;br /&gt;} DEBUG_EVENT_CONTEXT, *PDEBUG_EVENT_CONTEXT; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// IDebugEventContextCallbacks.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// The engine calls GetInterestMask once when &lt;br /&gt;// the event callbacks are set for a client. &lt;br /&gt;STDMETHOD(GetInterestMask)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_ PULONG Mask &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// A breakpoint event is generated when &lt;br /&gt;// a breakpoint exception is received and &lt;br /&gt;// it can be mapped to an existing breakpoint. &lt;br /&gt;// The callback method is given a reference &lt;br /&gt;// to the breakpoint and should release it when &lt;br /&gt;// it is done with it. &lt;br /&gt;STDMETHOD(Breakpoint)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ PDEBUG_BREAKPOINT2 Bp, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Exceptions include breaks which cannot &lt;br /&gt;// be mapped to an existing breakpoint &lt;br /&gt;// instance. &lt;br /&gt;STDMETHOD(Exception)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ PEXCEPTION_RECORD64 Exception, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FirstChance, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Any of these values can be zero if they &lt;br /&gt;// cannot be provided by the engine. &lt;br /&gt;// Currently the kernel does not return thread &lt;br /&gt;// or process change events. &lt;br /&gt;STDMETHOD(CreateThread)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 Handle, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 DataOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 StartOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(ExitThread)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ExitCode, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Any of these values can be zero if they &lt;br /&gt;// cannot be provided by the engine. &lt;br /&gt;STDMETHOD(CreateProcess)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 ImageFileHandle, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 Handle, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 BaseOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ModuleSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_opt_ PCWSTR ModuleName, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_opt_ PCWSTR ImageName, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG CheckSum, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG TimeDateStamp, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 InitialThreadHandle, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 ThreadDataOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 StartOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(ExitProcess)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ExitCode, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Any of these values may be zero. &lt;br /&gt;STDMETHOD(LoadModule)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 ImageFileHandle, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 BaseOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ModuleSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_opt_ PCWSTR ModuleName, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_opt_ PCWSTR ImageName, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG CheckSum, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG TimeDateStamp, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(UnloadModule)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_opt_ PCWSTR ImageBaseName, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 BaseOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(SystemError)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Error, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Level, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Session status is synchronous like the other &lt;br /&gt;// wait callbacks but it is called as the state &lt;br /&gt;// of the session is changing rather than at &lt;br /&gt;// specific events so its return value does not &lt;br /&gt;// influence waiting.&amp;nbsp; Implementations should just &lt;br /&gt;// return DEBUG_STATUS_NO_CHANGE. &lt;br /&gt;// Also, because some of the status &lt;br /&gt;// notifications are very early or very &lt;br /&gt;// late in the session lifetime there may not be &lt;br /&gt;// current processes or threads when the notification &lt;br /&gt;// is generated. &lt;br /&gt;STDMETHOD(SessionStatus)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Status &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// The following callbacks are informational &lt;br /&gt;// callbacks notifying the provider about &lt;br /&gt;// changes in debug state.&amp;nbsp; The return value &lt;br /&gt;// of these callbacks is ignored.&amp;nbsp; Implementations &lt;br /&gt;// can not call back into the engine.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Debuggee state, such as registers or data spaces, &lt;br /&gt;// has changed. &lt;br /&gt;STDMETHOD(ChangeDebuggeeState)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Flags, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 Argument, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE; &lt;br /&gt;&lt;br /&gt;// Engine state has changed. &lt;br /&gt;STDMETHOD(ChangeEngineState)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Flags, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 Argument, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_(ContextSize) PVOID Context, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE; &lt;br /&gt;&lt;br /&gt;// Symbol state has changed. &lt;br /&gt;STDMETHOD(ChangeSymbolState)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Flags, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 Argument &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugSymbols3 Interface&lt;/h2&gt;
&lt;p&gt;The &amp;lsquo;Get Source Entries by Line&amp;rsquo; flags (&lt;strong&gt;DEBUG_GSEL_XXX&lt;/strong&gt;) has an addition entry for inline functions. The constant is passed to &lt;strong&gt;IDebugSymbols3::GetSourceEntriesByLine&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// Only return caller sites of the inline function &lt;br /&gt;#define DEBUG_GSEL_INLINE_CALLSITE 0x00000010 &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugSymbols4 Interface (new)&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;IDebugSymbols4 &lt;/strong&gt;interface allows you to determine the symbol of an inline frame.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(GetScopeEx)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG64 InstructionOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PDEBUG_STACK_FRAME_EX ScopeFrame, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_writes_bytes_opt_(ScopeContextSize) PVOID ScopeContext, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ScopeContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(SetScopeEx)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 InstructionOffset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_opt_ PDEBUG_STACK_FRAME_EX ScopeFrame, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_reads_bytes_opt_(ScopeContextSize) PVOID ScopeContext, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG ScopeContextSize &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(GetNameByInlineContext)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 Offset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG InlineContext, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_writes_opt_(NameBufferSize) PSTR NameBuffer, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG NameBufferSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG NameSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG64 Displacement &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(GetNameByInlineContextWide)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 Offset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG InlineContext, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_writes_opt_(NameBufferSize) PWSTR NameBuffer, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG NameBufferSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG NameSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG64 Displacement &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(GetLineByInlineContext)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 Offset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG InlineContext, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG Line, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_writes_opt_(FileBufferSize) PSTR FileBuffer, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FileBufferSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG FileSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG64 Displacement &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(GetLineByInlineContextWide)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 Offset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG InlineContext, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG Line, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_writes_opt_(FileBufferSize) PWSTR FileBuffer, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG FileBufferSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG FileSize, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_opt_ PULONG64 Displacement &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(OutputSymbolByInlineContext)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG OutputControl, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Flags, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG64 Offset, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG InlineContext &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IDebugSymbols5 Interface (new)&lt;/h2&gt;
&lt;p&gt;And last, but definitely not least, is the new &lt;strong&gt;IDebugSymbols5 &lt;/strong&gt;interface allows you to set and get the current frame by index (i.e. the same operation as &lt;strong&gt;.frame NN&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;// IDebugSymbols5 &lt;br /&gt;STDMETHOD(GetCurrentScopeFrameIndexEx)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Flags, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _Out_ PULONG Index &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;STDMETHOD(SetScopeFrameByIndexEx)( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS_ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Flags, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _In_ ULONG Index &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) PURE; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As you can see, this release of the debugger is quite significant.&amp;nbsp; The integration in to Visual Studio, the support for inline function debugging, and the greatly improved local variable support are all great features that we&amp;rsquo;ll all get immediate productivity improvement from.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10216252" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/DbgEng/">DbgEng</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Debugger/">Debugger</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/WinDbg/">WinDbg</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Windows+8/">Windows 8</category></item><item><title>SQL Server 2008 R2 Setup fails with Database Engine Handle error</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/08/28/sql-server-2008-r2-setup-fails-with-database-engine-handle-error.aspx</link><pubDate>Sun, 28 Aug 2011 22:53:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10201371</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10201371</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/08/28/sql-server-2008-r2-setup-fails-with-database-engine-handle-error.aspx#comments</comments><description>&lt;p&gt;To cut a long story short, if you install &lt;strong&gt;SQL Server 2008 R2&lt;/strong&gt; via ISO mount in Virtual PC, the install will fail with a Database Engine Handle error.&lt;/p&gt;
&lt;p&gt;To get out of this issue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uninstall everything to do with SQL Server (from Programs and Features)&lt;/li&gt;
&lt;li&gt;Extract the ISO to a folder using WinRAR (do not use WinZIP, I've found articles suggesting that WinZIP doesn't extract the files correctly - no doubt the same issue that Virtual PC has)&lt;/li&gt;
&lt;li&gt;Install from the extracted folder instead&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10201371" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/SQL+Server/">SQL Server</category></item><item><title>BugCheck 0x101 - CLOCK_WATCHDOG_TIMEOUT</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/05/30/bugcheck-0x101-clock-watchdog-timeout.aspx</link><pubDate>Tue, 31 May 2011 04:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10169761</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10169761</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/05/30/bugcheck-0x101-clock-watchdog-timeout.aspx#comments</comments><description>&lt;p&gt;My blog post on a BugCheck 0x101 - CLOCK_WATCHDOG_TIMEOUT is now live on the NTDebugging blog...&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/ntdebugging/archive/2011/10/26/debugging-a-clock-watchdog-timeout-bugcheck.aspx"&gt;http://blogs.msdn.com/b/ntdebugging/archive/2011/10/26/debugging-a-clock-watchdog-timeout-bugcheck.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10169761" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Debugger/">Debugger</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/WinDbg/">WinDbg</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/BugCheck+0x101/">BugCheck 0x101</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/CLOCK_5F00_WATCHDOG_5F00_TIMEOUT/">CLOCK_WATCHDOG_TIMEOUT</category></item><item><title>Intel “Family Model Stepping” and Intel “Erratum” Reference</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/05/20/intel-family-model-stepping-and-intel-erratum-reference.aspx</link><pubDate>Sat, 21 May 2011 04:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10166941</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10166941</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/05/20/intel-family-model-stepping-and-intel-erratum-reference.aspx#comments</comments><description>&lt;ul&gt;&lt;font size="2" face="Book Antiqua"&gt;     &lt;p&gt;For some unfathomable reason, there seems to be no simple chart cross referencing the common CPU names, their basic features, and the internal CPU information identification (provided by &lt;strong&gt;!cpuid&lt;/strong&gt; and &lt;strong&gt;!sysinfo cpuinfo&lt;/strong&gt;).&amp;#160; (There is also no clear description as to why &lt;strong&gt;!sysinfo cpuinfo&lt;/strong&gt; doesn’t match &lt;strong&gt;!sysinfo cpumicrocode&lt;/strong&gt;, but that’s a chart that’ll have to wait.)&lt;/p&gt;      &lt;p&gt;Going forward, I’m going to record the &lt;strong&gt;Family/Model/Stepping&lt;/strong&gt; information in this blog entry for each kernel dump I see at work each day. Since I see quite a varied array of old and new hardware, the list should flesh out nicely over time…&lt;/p&gt;      &lt;p&gt;The entries that I’ve verified will have a &lt;strong&gt;[!cpuid: &lt;em&gt;F/M/S Manufacturer Mhz&lt;/em&gt;]&lt;/strong&gt; entry on the end of the line.&lt;/p&gt;      &lt;blockquote&gt;       &lt;p&gt;&lt;font size="1" face="Consolas"&gt;lkd&amp;gt; !&lt;font color="#000000"&gt;cpuid              &lt;br /&gt;CP&amp;#160; F/M/S&amp;#160; Manufacturer&amp;#160;&amp;#160;&amp;#160;&amp;#160; MHz               &lt;br /&gt;0&amp;#160; &lt;font color="#008000"&gt;6,30,5&amp;#160; GenuineIntel&amp;#160;&amp;#160;&amp;#160; 2799                &lt;br /&gt;&lt;/font&gt;1&amp;#160; 6,30,5&amp;#160; GenuineIntel&amp;#160;&amp;#160;&amp;#160; 2800               &lt;br /&gt;2&amp;#160; 6,30,5&amp;#160; GenuineIntel&amp;#160;&amp;#160;&amp;#160; 2800               &lt;br /&gt;3&amp;#160; 6,30,5&amp;#160; GenuineIntel&amp;#160;&amp;#160;&amp;#160; 2800&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;     &lt;/blockquote&gt;      &lt;p&gt;The entries that I’ve verified might also have a &lt;strong&gt;[!sysinfo cpuinfo: &lt;em&gt;Process Name&lt;/em&gt;]&lt;/strong&gt; entry on the end of the line (&lt;strong&gt;!sysinfo cpuinfo&lt;/strong&gt; sometimes doesn’t work).&lt;/p&gt;      &lt;blockquote&gt;       &lt;p&gt;&lt;font size="1"&gt;&lt;font face="Consolas"&gt;lkd&amp;gt; !sysinfo cpuinfo              &lt;br /&gt;[CPU Information]               &lt;br /&gt;~MHz = REG_DWORD 3192               &lt;br /&gt;Component Information = REG_BINARY 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0               &lt;br /&gt;Configuration Data = REG_FULL_RESOURCE_DESCRIPTOR ff,ff,ff,ff,ff,ff,ff,ff,0,0,0,0,0,0,0,0               &lt;br /&gt;Identifier = REG_SZ Intel64 Family 15 Model 6 Stepping 4               &lt;br /&gt;&lt;strong&gt;&lt;font color="#008000"&gt;ProcessorNameString = REG_SZ Intel(R) Pentium(R) D CPU 3.20GHz                  &lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;Update Signature = REG_BINARY 0,0,0,0,4,0,0,0               &lt;br /&gt;Update Status = REG_DWORD 6               &lt;br /&gt;VendorIdentifier = REG_SZ GenuineIntel               &lt;br /&gt;MSR8B = REG_QWORD 400000000&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;     &lt;/blockquote&gt;      &lt;p&gt;The &lt;strong&gt;Family/Model/Stepping&lt;/strong&gt; title above each processor group is information I have gathered from somewhere on the Internet but haven’t verified with a debugger. &lt;/p&gt;      &lt;p&gt;Also when appropriate, I’ll link to the &lt;strong&gt;Intel (Processor) Erratum&lt;/strong&gt; document for the family (this is the document that describes the bugs in the processor) and the &lt;strong&gt;Microsoft Hotfix&lt;/strong&gt; that implements a workaround.&lt;/p&gt;      &lt;h6&gt;Legacy Processors&lt;/h6&gt;      &lt;p&gt;&lt;font face="Consolas"&gt;Family Code          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Model Number           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Description           &lt;br /&gt;04 00 Intel486? DX processors           &lt;br /&gt;04 02 Intel486 SX processors           &lt;br /&gt;04 03 Intel487? processors           &lt;br /&gt;04 03 IntelDX2? processors           &lt;br /&gt;04 03 IntelDX2 OverDrive® processors           &lt;br /&gt;04 04 Intel486 SL processor           &lt;br /&gt;04 05 IntelSX2? processors           &lt;br /&gt;04 07 Write-Back Enhanced IntelDX2 processors           &lt;br /&gt;04 08 IntelDX4? processors           &lt;br /&gt;04 08 IntelDX4 OverDrive processors           &lt;br /&gt;05 01 Pentium® processors (60, 66)           &lt;br /&gt;05 02 Pentium processors (75, 90, 100, 120, 133, 150, 166, 200)           &lt;br /&gt;05 01 Pentium OverDrive processor for Pentium processor (60, 66)           &lt;br /&gt;05 02 Pentium OverDrive processor for Pentium processor           &lt;br /&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; (75, 90, 100, 120, 133)           &lt;br /&gt;05 03 Pentium OverDrive processors for Intel486 processors           &lt;br /&gt;05 04 Pentium processor with MMX? technology (166, 200)           &lt;br /&gt;05 04 Pentium OverDrive processor with MMX? technology for           &lt;br /&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; Pentium processor (75, 90, 100, 120, 133)           &lt;br /&gt;06 01 Pentium Pro processor           &lt;br /&gt;06 03 Pentium II processor, model 3           &lt;br /&gt;06 05 Pentium II processor, model 5, Pentium II Xeon processor,           &lt;br /&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; model 5, and Intel Celeron processor, model 5. Note(5)           &lt;br /&gt;06 06 Intel Celeron processor, model 6           &lt;br /&gt;06 07 Pentium III processor, model 7, and Pentium III Xeon processor,           &lt;br /&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; model 7. Note(6)           &lt;br /&gt;06 08 Pentium III processor, model 8, Pentium III Xeon processor,           &lt;br /&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; model 8, and Intel Celeron processor, model 8. Note(7)           &lt;br /&gt;06 09 Intel Pentium M processor model 9.           &lt;br /&gt;06 10 Pentium III Xeon processor, model A           &lt;br /&gt;06 11 Pentium III processor, model B           &lt;br /&gt;06 13 Intel Pentium M processor model D.           &lt;br /&gt;06 03 Intel Pentium II OverDrive processor           &lt;br /&gt;15 00 Intel Pentium 4 processor or Intel Xeon processor           &lt;br /&gt;15 01 Pentium 4 processor, Intel Xeon processor, Intel Xeon processor MP,           &lt;br /&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; and Intel Celeron processor.           &lt;br /&gt;15 02 Pentium 4 processor, Mobile Intel Pentium 4 processor – M, Intel           &lt;br /&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; Xeon processor, Intel Xeon processor MP, Intel Celeron           &lt;br /&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; processor, and Mobile Intel Celeron processor.           &lt;br /&gt;15 03 Pentium 4 processor, Mobile Intel Pentium 4 processor – M, Intel           &lt;br /&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; Xeon processor, Intel Celeron processor. &lt;/font&gt;&lt;/p&gt;      &lt;p&gt;&amp;#160;&lt;/p&gt;      &lt;h6&gt;64-bit Processors: Intel 64 – ‘NetBurst’ microarchitecture&lt;/h6&gt;      &lt;p&gt;&lt;strong&gt;Family 15, Model 6, Stepping 4          &lt;br /&gt;&lt;/strong&gt;Pentium D – 3.20 GHz (2×1 MB L2) &lt;font color="#ff0000"&gt;[!cpuid: 15,6,4 GenuineIntel 3192][!sysinfo cpuinfo: Intel(R) Pentium(R) D CPU 3.20GHz]         &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;      &lt;h6&gt;64-bit Processors: Intel 64 – ‘&lt;font style="font-weight: bold"&gt;Core’ &lt;/font&gt;microarchitecture&lt;/h6&gt;      &lt;p&gt;Xeon 5160 – 3.00 GHz (4 MB L2, 1333 MHz FSB)(80 W)        &lt;br /&gt;Xeon 5150 – 2.66 GHz (4 MB L2, 1333 MHz FSB)(65 W)         &lt;br /&gt;Xeon 5140 – 2.33 GHz (4 MB L2, 1333 MHz FSB)(65 W)         &lt;br /&gt;Xeon 5130 – 2.00 GHz (4 MB L2, 1333 MHz FSB)(65 W)         &lt;br /&gt;Xeon 5120 – 1.86 GHz (4 MB L2, 1066 MHz FSB)(65 W)         &lt;br /&gt;Xeon 5110 – 1.60 GHz (4 MB L2, 1066 MHz FSB)(65 W)         &lt;br /&gt;Xeon 5148LV – 2.33 GHz (4 MB L2, 1333 MHz FSB, 40 W)(Low Voltage)&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;Family 6, Model 15, Stepping 7 &lt;/strong&gt;        &lt;br /&gt;Xeon X5355 – 2.66 GHz (2×4 MB L2, 1333 MHz FSB)(105 W)         &lt;br /&gt;Xeon E5345 – 2.33 GHz (2×4 MB L2, 1333 MHz FSB)(80 W)         &lt;br /&gt;Xeon E5335 – 2.00 GHz (2×4 MB L2, 1333 MHz FSB)(80 W)         &lt;br /&gt;Xeon E5320 – 1.86 GHz (2×4 MB L2, 1066 MHz FSB)(65 W) &lt;font color="#ff0000"&gt;[!cpuid: 6,15,7 GenuineIntel 1861][!sysinfo cpuinfo: Intel(R) Xeon(R) CPU E5320 @ 1.86GHz]&lt;/font&gt;        &lt;br /&gt;Xeon E5310 – 1.60 GHz (2×4 MB L2, 1066 MHz FSB)(65 W)         &lt;br /&gt;Xeon L5320 – 1.86 GHz (2×4 MB L2, 1066 MHz FSB)(50 W)(Low Voltage)&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;Family 6, Model 23, Stepping 6          &lt;br /&gt;&lt;/strong&gt;Xeon E5405 – 2.00 GHz (4 cores, 4 MB L3) &lt;font color="#ff0000"&gt;[!cpuid: 6,23,6 GenuineIntel 2000][!sysinfo cpuinfo: Intel(R) Xeon(R) CPU E5405 @ 2.00GHz]&lt;/font&gt;&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;Family 6, Model 15, Stepping 6         &lt;br /&gt;&lt;/strong&gt;Core 2 Duo E6850 – 3.00 GHz (4 MB L2, 1333 MHz FSB)         &lt;br /&gt;Core 2 Duo X6800 – 2.93 GHz (4 MB L2, 1066 MHz FSB)         &lt;br /&gt;Core 2 Duo E6750 – 2.67 GHz (4 MB L2, 1333 MHz FSB)         &lt;br /&gt;Core 2 Duo E6700 – 2.67 GHz (4 MB L2, 1066 MHz FSB)         &lt;br /&gt;Core 2 Duo E6600 – 2.40 GHz (4 MB L2, 1066 MHz FSB)         &lt;br /&gt;Core 2 Duo E6550 – 2.33 GHz (4 MB L2, 1333 MHz FSB)         &lt;br /&gt;Core 2 Duo E6420 – 2.13 GHz (4 MB L2, 1066 MHz FSB)         &lt;br /&gt;Core 2 Duo E6400 – 2.13 GHz (2 MB L2, 1066 MHz FSB)         &lt;br /&gt;Core 2 Duo E6320 – 1.86 GHz (4 MB L2, 1066 MHz FSB)&lt;strong&gt;          &lt;br /&gt;&lt;/strong&gt;Core 2 Duo E6300 – 1.86 GHz (2 MB L2, 1066 MHz FSB)&lt;/p&gt;      &lt;p&gt;Core 2 Duo E4700 – 2.60 GHz (2 MB L2, 800 MHz FSB)        &lt;br /&gt;Core 2 Duo E4600 – 2.40 GHz (2 MB L2, 800 MHz FSB)         &lt;br /&gt;Core 2 Duo E4500 – 2.20 GHz (2 MB L2, 800 MHz FSB)         &lt;br /&gt;Core 2 Duo E4400 – 2.00 GHz (2 MB L2, 800 MHz FSB)         &lt;br /&gt;Core 2 Duo E4300 – 1.80 GHz (2 MB L2, 800 MHz FSB)&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;Family 6, Model 15, Stepping 6&lt;/strong&gt;         &lt;br /&gt;Core 2 Duo T7800 – 2.60 GHz (4 MB L2, 800 MHz FSB)         &lt;br /&gt;Core 2 Duo T7700 – 2.40 GHz (4 MB L2, 800 MHz FSB)         &lt;br /&gt;Core 2 Duo T7600 – 2.33 GHz (4 MB L2, 667 MHz FSB)         &lt;br /&gt;Core 2 Duo T7500 – 2.20 GHz (4 MB L2, 800 MHz FSB)         &lt;br /&gt;Core 2 Duo T7400 – 2.16 GHz (4 MB L2, 667 MHz FSB)         &lt;br /&gt;Core 2 Duo T7300 – 2.00 GHz (4 MB L2, 800 MHz FSB)         &lt;br /&gt;Core 2 Duo T7250 – 2.00 GHz (2 MB L2, 800 MHz FSB)         &lt;br /&gt;Core 2 Duo T7200 – 2.00 GHz (4 MB L2, 667 MHz FSB)         &lt;br /&gt;Core 2 Duo T7100 – 1.80 GHz (2 MB L2, 800 MHz FSB)         &lt;br /&gt;Core 2 Duo T5600 – 1.83 GHz (2 MB L2, 667 MHz FSB)         &lt;br /&gt;Core 2 Duo T5550 – 1.83 GHz (2 MB L2, 667 MHz FSB)(no VT)         &lt;br /&gt;Core 2 Duo T5500 – 1.66 GHz (2 MB L2, 667 MHz FSB)(no VT)         &lt;br /&gt;Core 2 Duo T5470 – 1.60 GHz (2 MB L2, 800 MHz FSB)(no VT)         &lt;br /&gt;Core 2 Duo T5450 – 1.66 GHz (2 MB L2, 667 MHz FSB)(no VT)         &lt;br /&gt;Core 2 Duo T5300 – 1.73 GHz (2 MB L2, 533 MHz FSB)(no VT)         &lt;br /&gt;Core 2 Duo T5270 – 1.40 GHz (2 MB L2, 800 MHz FSB)(no VT)         &lt;br /&gt;Core 2 Duo T5250 – 1.50 GHz (2 MB L2, 667 MHz FSB)(no VT)         &lt;br /&gt;Core 2 Duo T5200 – 1.60 GHz (2 MB L2, 533 MHz FSB)(no VT)         &lt;br /&gt;Core 2 Duo L7500 – 1.60 GHz (4 MB L2, 800 MHz FSB)(Low Voltage)         &lt;br /&gt;Core 2 Duo L7400 – 1.50 GHz (4 MB L2, 667 MHz FSB)(Low Voltage)         &lt;br /&gt;Core 2 Duo L7300 – 1.40 GHz (4 MB L2, 800 MHz FSB)(Low Voltage)         &lt;br /&gt;Core 2 Duo L7200 – 1.33 GHz (4 MB L2, 667 MHz FSB)(Low Voltage)         &lt;br /&gt;Core 2 Duo U7700 – 1.33 GHz (2 MB L2, 533 MHz FSB)(Ultra Low Voltage)         &lt;br /&gt;Core 2 Duo U7600 – 1.20 GHz (2 MB L2, 533 MHz FSB)(Ultra Low Voltage)         &lt;br /&gt;Core 2 Duo U7500 – 1.06 GHz (2 MB L2, 533 MHz FSB)(Ultra Low Voltage)&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;Family 6, Model 15, Stepping 11&lt;/strong&gt;         &lt;br /&gt;Core 2 Extreme QX6850 – 3 GHz (2×4 MB L2 Cache, 1333 MHz FSB)         &lt;br /&gt;Core 2 Extreme QX6800 – 2.93 GHz (2×4 MB L2 Cache, 1066 MHz FSB)         &lt;br /&gt;Core 2 Extreme QX6700 – 2.66 GHz (2×4 MB L2 Cache, 1066 MHz FSB)         &lt;br /&gt;Core 2 Quad Q6700 – 2.66 GHz (2×4 MB L2 Cache, 1066 MHz FSB)         &lt;br /&gt;Core 2 Quad Q6600 – 2.40 GHz (2×4 MB L2 Cache, 1066 MHz FSB)&lt;/p&gt;      &lt;p&gt;Core 2 Duo E8600 – 3.33 GHz (6 MB L2, 1333 MHz FSB)        &lt;br /&gt;Core 2 Duo E8500 – 3.16 GHz (6 MB L2, 1333 MHz FSB)         &lt;br /&gt;Core 2 Duo E8400 – 3.00 GHz (6 MB L2, 1333 MHz FSB)         &lt;br /&gt;Core 2 Duo E8300 – 2.83 GHz (6 MB L2, 1333 MHz FSB)         &lt;br /&gt;Core 2 Duo E8200 – 2.66 GHz (6 MB L2, 1333 MHz FSB)         &lt;br /&gt;Core 2 Duo E8190 – 2.66 GHz (6 MB L2, 1333 MHz FSB)(no TXT, no VT)&lt;/p&gt;      &lt;p&gt;Core 2 Duo E7600 – 3.06 GHz (3 MB L2, 1066 MHz FSB)        &lt;br /&gt;Core 2 Duo E7500 – 2.93 GHz (3 MB L2, 1066 MHz FSB)         &lt;br /&gt;Core 2 Duo E7400 – 2.80 GHz (3 MB L2, 1066 MHz FSB)         &lt;br /&gt;Core 2 Duo E7300 – 2.66 GHz (3 MB L2, 1066 MHz FSB)         &lt;br /&gt;Core 2 Duo E7200 – 2.53 GHz (3 MB L2, 1066 MHz FSB)&lt;/p&gt;      &lt;p&gt;Core 2 Extreme QX9770 – 3.20 GHz (2×6 MB L2, 1600 MHz FSB)        &lt;br /&gt;Core 2 Extreme QX9650 – 3.00 GHz (2×6 MB L2, 1333 MHz FSB)         &lt;br /&gt;Core 2 Quad Q9650 – 3 GHz (2×6 MB L2, 1333 MHz FSB)         &lt;br /&gt;Core 2 Quad Q9550 – 2.83 GHz (2×6 MB L2, 1333 MHz FSB)(95W TDP)         &lt;br /&gt;Core 2 Quad Q9550s – 2.83 GHz (2×6 MB L2, 1333 MHz FSB)(65W TDP)         &lt;br /&gt;Core 2 Quad Q9450 – 2.66 GHz (2×6 MB L2, 1333 MHz FSB)(95W TDP)         &lt;br /&gt;Core 2 Quad Q9505 – 2.83 GHz (2×3 MB L2, 1333 MHz FSB)(95W TDP)         &lt;br /&gt;Core 2 Quad Q9505s – 2.83 GHz (2×3 MB L2, 1333 MHz FSB)(65W TDP)         &lt;br /&gt;Core 2 Quad Q9500 – 2.83 GHz (2×3 MB L2, 1333 MHz FSB)(95W TDP)(no TXT)         &lt;br /&gt;Core 2 Quad Q9400 – 2.66 GHz (2×3 MB L2, 1333 MHz FSB)(95W TDP)         &lt;br /&gt;Core 2 Quad Q9400s – 2.66 GHz (2×3 MB L2, 1333 MHz FSB)(65W TDP)         &lt;br /&gt;Core 2 Quad Q9300 – 2.50 GHz (2×3 MB L2, 1333 MHz FSB)(95W TDP)         &lt;br /&gt;Core 2 Quad Q8400 – 2.66 GHz (2×2 MB L2, 1333 MHz FSB)(95W TDP)         &lt;br /&gt;Core 2 Quad Q8400s – 2.66 GHz (2×2 MB L2, 1333 MHz FSB)(65W TDP)         &lt;br /&gt;Core 2 Quad Q8300 – 2.50 GHz (2×2 MB L2, 1333 MHz FSB)(95W TDP)         &lt;br /&gt;Core 2 Quad Q8300s – 2.50 GHz (2×2 MB L2, 1333 MHz FSB)(65W TDP)         &lt;br /&gt;Core 2 Quad Q8200 – 2.33 GHz (2×2 MB L2, 1333 MHz FSB)(95W TDP)         &lt;br /&gt;Core 2 Quad Q8200s – 2.33 GHz (2×2 MB L2, 1333 MHz FSB)(65W TDP)         &lt;br /&gt;Core 2 Quad Q7600 – 2.70 GHz (2×1 MB L2, 800 MHz FSB)(no SSE4)&lt;/p&gt;      &lt;p&gt;Core 2 Quad Q9100 – 2.26 GHz (2×6 MB L2, 1066 MHz FSB)(45W TDP)        &lt;br /&gt;Core 2 Quad Q9000 – 2.00 GHz (2×3 MB L2, 1066 MHz FSB)(45W TDP)&lt;/p&gt;      &lt;p&gt;Intel Pentium E2220 – 2.40 GHz (1 MB L2, 800 MHz FSB)        &lt;br /&gt;Intel Pentium E2200 – 2.20 GHz (1 MB L2, 800 MHz FSB)         &lt;br /&gt;Intel Pentium E2180 – 2.00 GHz (1 MB L2, 800 MHz FSB)         &lt;br /&gt;Intel Pentium E2160 – 1.80 GHz (1 MB L2, 800 MHz FSB)         &lt;br /&gt;Intel Pentium E2140 – 1.60 GHz (1 MB L2, 800 MHz FSB)&lt;/p&gt;      &lt;p&gt;Intel Pentium E6800 – 3.33 GHz (2 MB L2,1066 MHz FSB)        &lt;br /&gt;Intel Pentium E6700 – 3.20 GHz (2 MB L2,1066 MHz FSB)         &lt;br /&gt;Intel Pentium E6600 – 3.06 GHz (2 MB L2,1066 MHz FSB)         &lt;br /&gt;Intel Pentium E6500 – 2.93 GHz (2 MB L2,1066 MHz FSB)         &lt;br /&gt;Intel Pentium E6300 – 2.80 GHz (2 MB L2,1066 MHz FSB)         &lt;br /&gt;Intel Pentium E5700 – 3.00 GHz (2 MB L2, 800 MHz FSB)         &lt;br /&gt;Intel Pentium E5500 – 2.80 GHz (2 MB L2, 800 MHz FSB)         &lt;br /&gt;Intel Pentium E5400 – 2.70 GHz (2 MB L2, 800 MHz FSB)         &lt;br /&gt;Intel Pentium E5300 – 2.60 GHz (2 MB L2, 800 MHz FSB)         &lt;br /&gt;Intel Pentium E5200 – 2.50 GHz (2 MB L2, 800 MHz FSB)         &lt;br /&gt;Intel Pentium E2210 – 2.20 GHz (1 MB L2, 800 MHz FSB)         &lt;br /&gt;&lt;/p&gt;      &lt;p&gt;Intel Celeron E1600 – 2.40 GHz (512 KB L2, 800 MHz FSB)        &lt;br /&gt;Intel Celeron E1500 – 2.20 GHz (512 KB L2, 800 MHz FSB)         &lt;br /&gt;Intel Celeron E1400 – 2.00 GHz (512 KB L2, 800 MHz FSB)         &lt;br /&gt;Intel Celeron E1300 – 1.80 GHz (512 KB L2, 800 MHz FSB)         &lt;br /&gt;Intel Celeron E1200 – 1.60 GHz (512 KB L2, 800 MHz FSB)&lt;/p&gt;      &lt;p&gt;Intel Celeron E3500 – 2.70 GHz (1 MB L2, 800 MHz FSB)        &lt;br /&gt;Intel Celeron E3400 – 2.60 GHz (1 MB L2, 800 MHz FSB)         &lt;br /&gt;Intel Celeron E3300 – 2.50 GHz (1 MB L2, 800 MHz FSB)         &lt;br /&gt;Intel Celeron E3200 – 2.40 GHz (1 MB L2, 800 MHz FSB)         &lt;br /&gt;&lt;/p&gt;      &lt;p&gt;Intel Celeron 450 – 2.20 GHz (512 KB L2, 800 MHz FSB)        &lt;br /&gt;Intel Celeron 440 – 2.00 GHz (512 KB L2, 800 MHz FSB)         &lt;br /&gt;Intel Celeron 430 – 1.80 GHz (512 KB L2, 800 MHz FSB)         &lt;br /&gt;Intel Celeron 420 – 1.60 GHz (512 KB L2, 800 MHz FSB)         &lt;br /&gt;Intel Celeron 220 – 1.20 GHz (512 KB L2, 533 MHz FSB)         &lt;br /&gt;&lt;/p&gt;      &lt;p&gt;Intel Celeron 445 – 1.87 GHz (512 KB L2, 1066 MHz FSB)&lt;/p&gt;      &lt;p&gt;Intel Celeron M 560 – 2.13 GHz (1 MB L2, 533 MHz FSB)        &lt;br /&gt;Intel Celeron M 550 – 2.00 GHz (1 MB L2, 533 MHz FSB)         &lt;br /&gt;Intel Celeron M 540 – 1.86 GHz (1 MB L2, 533 MHz FSB)         &lt;br /&gt;Intel Celeron M 530 – 1.73 GHz (1 MB L2, 533 MHz FSB)         &lt;br /&gt;Intel Celeron M 520 – 1.60 GHz (1 MB L2, 533 MHz FSB)&lt;/p&gt;      &lt;h6&gt;64-bit Processors: Intel 64 – ‘Nehalem&lt;font style="font-weight: bold"&gt;’ &lt;/font&gt;microarchitecture&lt;/h6&gt;      &lt;p&gt;Pentium G6950 - 2.8 GHz (No HyperThreading)&lt;/p&gt;      &lt;p&gt;Core i3 560 – 3.33 GHz Hyper-Threading (4 MB L3)        &lt;br /&gt;Core i3 550 – 3.2 GHz Hyper-Threading (4 MB L3)         &lt;br /&gt;Core i3 540 – 3.06 GHz Hyper-Threading (4 MB L3)         &lt;br /&gt;Core i3 530 – 2.93 GHz Hyper-Threading (4 MB L3)&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;Family 6, Model 30, Stepping 5 (a.k.a. &lt;strong&gt;Family 6, Model 1E, Stepping 5&lt;/strong&gt;)&lt;/strong&gt;         &lt;br /&gt;Core i5 760 – 2.80 GHz/3.33 GHz Turbo Boost (8 MB L3) &lt;font color="#ff0000"&gt;[!cpuid: 6,30,5 GenuineIntel 2800]          &lt;br /&gt;&lt;/font&gt;Core i5 750 – 2.66 GHz/3.20 GHz Turbo Boost (8 MB L3)         &lt;br /&gt;Core i5 750S – 2.40 GHz/3.20 GHz Turbo Boost (8 MB L3)&lt;/p&gt;      &lt;p&gt;Core i5 680 – 3.60 GHz Hyper-Threading Turbo Boost (4 MB L3)        &lt;br /&gt;Core i5 670 – 3.46 GHz Hyper-Threading Turbo Boost (4 MB L3)         &lt;br /&gt;Core i5 661 – 3.33 GHz Hyper-Threading Turbo Boost (4 MB L3)         &lt;br /&gt;Core i5 660 – 3.33 GHz Hyper-Threading Turbo Boost (4 MB L3)         &lt;br /&gt;Core i5 655K – 3.2 GHz Hyper-Threading Turbo Boost (4 MB L3)         &lt;br /&gt;Core i5 650 – 3.2 GHz Hyper-Threading Turbo Boost (4 MB L3)&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;Intel Erratum &lt;/strong&gt;&lt;a href="http://download.intel.com/design/processor/specupdt/320836.pdf"&gt;&lt;strong&gt;AAJ121&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; / Microsoft Hotfix &lt;/strong&gt;&lt;a href="http://support.microsoft.com/kb/975530"&gt;&lt;strong&gt;KB975530&lt;/strong&gt;&lt;/a&gt; (BugCheck 0x101 with Hyper-V)         &lt;br /&gt;Core i7 975 Extreme – 3.33 GHz/3.60 GHz Turbo Boost (8 MB L3)         &lt;br /&gt;Core i7 965 Extreme – 3.20 GHz/3.46 GHz Turbo Boost (8 MB L3)         &lt;br /&gt;Core i7 960 - 3.20 GHz/3.46 GHz Turbo Boost (8 MB L3)         &lt;br /&gt;Core i7 950 – 3.06 GHz/3.33 GHz Turbo Boost (8 MB L3)         &lt;br /&gt;Core i7 940 – 2.93 GHz/3.20 GHz Turbo Boost (8 MB L3)         &lt;br /&gt;Core i7 930 – 2.80 GHz/3.06 GHz Turbo Boost (8 MB L3)         &lt;br /&gt;Core i7 920 – 2.66 GHz/2.93 GHz Turbo Boost (8 MB L3)&lt;/p&gt;      &lt;p&gt;Core i7 880 – 3.06 GHz/3.73 GHz Turbo Boost (8 MB L3)(95W TDP)        &lt;br /&gt;Core i7 875K – 2.93 GHz/3.60 GHz Turbo Boost (8 MB L3)(95W TDP)         &lt;br /&gt;Core i7 870 – 2.93 GHz/3.60 GHz Turbo Boost (8 MB L3)(95W TDP)         &lt;br /&gt;Core i7 870S – 2.67 GHz/3.60 GHz Turbo Boost (8 MB L3)(82W TDP)         &lt;br /&gt;Core i7 860 – 2.80 GHz/3.46 GHz Turbo Boost (8 MB L3)(95W TDP)         &lt;br /&gt;Core i7 860S – 2.53 GHz/3.46 GHz Turbo Boost (8 MB L3)(82W TDP)&lt;/p&gt;      &lt;p&gt;Core i7 990X Extreme - 3.46 GHz/3.73 GHz Turbo Boost (12 MB L3)        &lt;br /&gt;Core i7 980X Extreme - 3.33 GHz/3.60 GHz Turbo Boost (12 MB L3)         &lt;br /&gt;Core i7 970 - 3.20 GHz/3.46 GHz Turbo Boost (12 MB L3)         &lt;br /&gt;&lt;/p&gt;      &lt;p&gt;Core i7 940XM Extreme - 2.13 GHz/3.33 GHz Turbo Boost (8 MB L3)(55W TDP)        &lt;br /&gt;Core i7 920XM Extreme - 2.00 GHz/3.20 GHz Turbo Boost (8 MB L3)(55W TDP)         &lt;br /&gt;Core i7 840QM - 1.86 GHz/3.20 GHz Turbo Boost (8 MB L3)(45W&amp;#160; TDP)         &lt;br /&gt;Core i7 820QM - 1.73 GHz/3.06 GHz Turbo Boost (8 MB L3)(45W TDP)         &lt;br /&gt;Core i7 740QM - 1.73 GHz/2.93 GHz Turbo Boost (6 MB L3)(45W TDP)         &lt;br /&gt;Core i7 720QM - 1.60 GHz/2.80 GHz Turbo Boost (6 MB L3)(45W TDP)&lt;/p&gt;      &lt;p&gt;Xeon W5590 – 3.33 GHz (4 Cores, 8 MB L3)(HT)(130W)        &lt;br /&gt;Xeon W5580 – 3.20 GHz (4 Cores, 8 MB L3)(HT)(130W)         &lt;br /&gt;Xeon X5570 – 2.93 GHz (4 Cores, 8 MB L3)(HT)(95W)         &lt;br /&gt;Xeon X5560 – 2.80 GHz (4 Cores, 8 MB L3)(HT)(95W)         &lt;br /&gt;Xeon X5550 – 2.66 GHz (4 Cores, 8 MB L3)(HT)(95W)         &lt;br /&gt;Xeon L5530 – 2.40 GHz (4 Cores, 8 MB L3)(HT)(60W)         &lt;br /&gt;Xeon L5520 – 2.26 GHz (4 Cores, 8 MB L3)(HT)(60W)         &lt;br /&gt;Xeon L5518 – 2.13 GHz (4 Cores, 8 MB L3)(HT)(60W)         &lt;br /&gt;Xeon L5508 – 2.00 GHz (2 Cores, 8 MB L3)(HT)(38W)         &lt;br /&gt;Xeon L5506 – 2.13 GHz (4 Cores, 8 MB L3)(60W)&lt;/p&gt;      &lt;p&gt;Xeon E5540 – 2.53 GHz (4 Cores, 8 MB L3)(HT)        &lt;br /&gt;Xeon E5530 – 2.40 GHz (4 Cores, 8 MB L3)(HT)         &lt;br /&gt;Xeon E5520 – 2.26 GHz (4 Cores, 8 MB L3)(HT)&lt;/p&gt;      &lt;p&gt;Xeon E5507 – 2.26 GHz (4 cores, 4 MB L3)        &lt;br /&gt;Xeon E5506 – 2.13 GHz (4 cores, 4 MB L3)         &lt;br /&gt;Xeon E5505 – 2.00 GHz (4 cores, 4 MB L3)         &lt;br /&gt;Xeon E5504 – 2.00 GHz (4 cores, 4 MB L3)         &lt;br /&gt;Xeon E5503 – 2.00 GHz (2 cores, 4 MB L3)&lt;/p&gt;   &lt;/font&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;font size="2" face="Book Antiqua"&gt;     &lt;h6&gt;       &lt;br /&gt;        &lt;br /&gt;References:-&lt;/h6&gt;      &lt;p&gt;&lt;strong&gt;&lt;u&gt;Specification Updates/Erratum&lt;/u&gt;           &lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;Intel® Core™ i7-900 Desktop Processor Series - &lt;a href="http://download.intel.com/design/processor/specupdt/320836.pdf"&gt;http://download.intel.com/design/processor/specupdt/320836.pdf&lt;/a&gt;           &lt;br /&gt;Intel® Core™ i7-800 Desktop Processor Series - &lt;/strong&gt;&lt;a href="http://download.intel.com/design/processor/specupdt/322166.pdf"&gt;http://download.intel.com/design/processor/specupdt/322166.pdf&lt;/a&gt;         &lt;br /&gt;&lt;strong&gt;Intel® Core™ i5-700 Desktop Processor Series&lt;/strong&gt; - &lt;a href="http://download.intel.com/design/processor/specupdt/322166.pdf"&gt;http://download.intel.com/design/processor/specupdt/322166.pdf&lt;/a&gt;         &lt;br /&gt;&lt;strong&gt;Intel® Xeon® Processor 5500 Series &lt;/strong&gt;- &lt;a title="http://www.intel.com/assets/pdf/specupdate/321324.pdf" href="http://www.intel.com/assets/pdf/specupdate/321324.pdf"&gt;http://www.intel.com/assets/pdf/specupdate/321324.pdf&lt;/a&gt;&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;&lt;u&gt;Processor Lists            &lt;br /&gt;&lt;/u&gt;Intel® Microprocessors - &lt;/strong&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_Intel_microprocessors"&gt;&lt;strong&gt;http://en.wikipedia.org/wiki/List_of_Intel_microprocessors&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;          &lt;br /&gt;Intel® Processor Identification Utility - &lt;/strong&gt;&lt;a href="http://www.intel.com/p/en_US/support/highlights/processors/toolspiu"&gt;&lt;strong&gt;http://www.intel.com/p/en_US/support/highlights/processors/toolspiu&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;          &lt;br /&gt;Intel® Xeon® Processor 5300 Series&lt;/strong&gt; - &lt;a href="http://ark.intel.com/ProductCollection.aspx?series=30807"&gt;http://ark.intel.com/ProductCollection.aspx?series=30807&lt;/a&gt;         &lt;br /&gt;&lt;strong&gt;Intel® Xeon® Processor 5400 Series&lt;/strong&gt; - &lt;a title="http://ark.intel.com/ProductCollection.aspx?series=33905" href="http://ark.intel.com/ProductCollection.aspx?series=33905"&gt;http://ark.intel.com/ProductCollection.aspx?series=33905&lt;/a&gt;&lt;strong&gt;&lt;strong&gt;            &lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/strong&gt;Intel® Xeon® Processor 5500 Series&lt;/strong&gt; - &lt;a href="http://ark.intel.com/ProductCollection.aspx?series=39565"&gt;http://ark.intel.com/ProductCollection.aspx?series=39565&lt;/a&gt;         &lt;br /&gt;&lt;strong&gt;Intel® Xeon® Processor 5600 Series&lt;/strong&gt; - &lt;a title="http://ark.intel.com/ProductCollection.aspx?series=47915" href="http://ark.intel.com/ProductCollection.aspx?series=47915"&gt;http://ark.intel.com/ProductCollection.aspx?series=47915&lt;/a&gt;         &lt;br /&gt;&lt;/p&gt;   &lt;/font&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10166941" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Debugger/">Debugger</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/WinDbg/">WinDbg</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/_2100_cpuid/">!cpuid</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Intel/">Intel</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/_2100_sysinfo/">!sysinfo</category></item><item><title>WinDbg File Association and Explorer Context Menu</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/05/05/windbg-context-menu.aspx</link><pubDate>Thu, 05 May 2011 08:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10161236</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10161236</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/05/05/windbg-context-menu.aspx#comments</comments><description>&lt;p&gt;For a long time now I've had a registry file to make context menu entries for WinDbg.&amp;nbsp; The entries allow you to select the x86 or x64 debugger.&amp;nbsp; Internally at Microsoft, I have another version of the registry file that contains two more context menu entries for the private symbol server.&amp;nbsp; You can see all 4 options I add internally in this screenshot.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-44-75/0654.Context-Menu.png"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-44-75/0654.Context-Menu.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Note, the registry file&amp;nbsp;assumes WinDBG is installed in c:\debuggers_x86 and c:\debuggers (for the x86 and AMD64 debuggers respectively).&amp;nbsp; FYI: The reason you need to install the debugger twice is the lack of architecture agnostic support in some extensions - yes, SOS.DLL I'm looking at you.&amp;nbsp; The multiple entries give you a quick way of jumping between the two architectures.&lt;/p&gt;
&lt;p&gt;The registry entries pass in the symbol path for the Microsoft Public Symbol Server (&lt;a href="http://msdl.microsoft.com/download/symbols"&gt;http://msdl.microsoft.com/download/symbols&lt;/a&gt;) and for me, the&amp;nbsp;Microsoft Private Symbol Server. In both cases, the symbols are cached locally (e.g. c:\symbols) through SRV* chaining.&amp;nbsp;Much like the architecture entries, this technique gives you a quick way to toggle between (in my case) the public and private symbols.&amp;nbsp; The passing of the symbol path, as opposed to using the _NT_SYMBOL_PATH environment variable is the only way to get around the concatination that WinDBG does. If you have the environment variable set, it will be prepended to the symbol path passed. This means that a environment variable path could still be used instead of a passed path.&amp;nbsp; I'll admit that this is only an issue for people needing support of both symbols stores and that for the vast majority of people, the environment variable is a better way to go. If you go this way, just remove the -y section of the command line.&lt;/p&gt;
&lt;p&gt;The registry file&amp;nbsp;makes an association for all of the dump variants, including reflected dumps (*.ini).&amp;nbsp; Reflected dumps can be&amp;nbsp;made using&amp;nbsp;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx" title="ProcDump"&gt;ProcDump&lt;/a&gt; with the -r switch (e.g. procdump.exe -r -ma notepad.exe). Currently, I piggy back on the Visual Studio 2010 keys so as to get an icon, and still support opening dumps in Visual Studio&amp;nbsp;via the Open entry (I have no idea why you would want to do that though).&lt;/p&gt;
&lt;p&gt;The other thing I do is load the debugger extensions that I commonly use.&amp;nbsp; In this (example) registry file, I just include one of my own extensions (myext.dll) via the&amp;nbsp;-a&amp;nbsp;switch (the extension I made for the&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/andrew_richards/archive/2011/04/23/writing-a-debugging-tools-for-windows-extension.aspx" title="MSDN Magazine Debugger API series"&gt;MSDN Magazine Debugging API series&lt;/a&gt;).&amp;nbsp; If you want to load more, you just include multiple&amp;nbsp;&lt;em&gt;-a myext.dll&lt;/em&gt;&amp;nbsp;entries in the command line.&amp;nbsp; (Side note, if you are doing the same with cdb, you can't have a space between -a and the dll name). In my personal version of this, I load six extensions.&lt;/p&gt;
&lt;p&gt;One thing you may want to&amp;nbsp;consider&amp;nbsp;is adding the -WX switch to ignore the default workspace.&amp;nbsp; I personally set up the default workspace the way I like it (command window docked, WinDbg maximized on my main monitor, font colors set for each text type, etc.) and use this as a template for each new debug session.&amp;nbsp; As such, I don't want the -WX switch (that's a double negative) as I want the workspace to apply.&amp;nbsp; If you however want to use the 'out of box' defaults always, add the -WX switch.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;Windows Registry Editor Version 5.00&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;[HKEY_CLASSES_ROOT\.dmp]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;@="VisualStudio.dmp.10.0"&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;[HKEY_CLASSES_ROOT\.hdmp]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;@="VisualStudio.dmp.10.0"&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;[HKEY_CLASSES_ROOT\.mdmp]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;@="VisualStudio.dmp.10.0"&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;[HKEY_CLASSES_ROOT\.kdmp]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;@="VisualStudio.dmp.10.0"&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;[HKEY_CLASSES_ROOT\.ini]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;@="VisualStudio.dmp.10.0"&lt;/span&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;[HKEY_CLASSES_ROOT\VisualStudio.dmp.10.0\shell]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;@="WinDbg_x64_public"&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;[HKEY_CLASSES_ROOT\VisualStudio.dmp.10.0\shell\WinDbg_x86_public]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;@="Open with WinDbg x86 (Public)"&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;[HKEY_CLASSES_ROOT\VisualStudio.dmp.10.0\shell\WinDbg_x86_public\Command]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;@="\"C:\\Debuggers_x86\\windbg.exe\" -z \"%1\" -a myext.dll -y \"SRV*C:\\Symbols*http://msdl.microsoft.com/download/symbols\""&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;[HKEY_CLASSES_ROOT\VisualStudio.dmp.10.0\shell\WinDbg_x64_public]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;@="Open with WinDbg x64 (Public)"&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;[HKEY_CLASSES_ROOT\VisualStudio.dmp.10.0\shell\WinDbg_x64_public\Command]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;@="\"C:\\Debuggers\\windbg.exe\" -z \"%1\" -a myext.dll -y \"SRV*C:\\Symbols*http://msdl.microsoft.com/download/symbols\""&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;WinDbg Support&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I've always known that WinDbg had a -I (that's a capital i) switch to set it as the (automatic) postmortem debugger.&amp;nbsp;This follows in the Dr.Watson footsteps&amp;nbsp;that has the same option. Of interest here,&amp;nbsp;you can&amp;nbsp;do this association twice on 64bit versions of Windows (running -I on the x86 and x64 debugger versions of WinDbg). By setting it twice,&amp;nbsp;the x64 debugger is used for x64 failures (via the HKLM AeDebug key) and the x86 debugger is used for x86 failures (via the HKLM WOW64 AeDebug key).&amp;nbsp; (Handy for those architecture agnostic extension issues.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug &lt;/li&gt;
&lt;li&gt;HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note, there is no built-in way to revert the -I setting to the WER default.&amp;nbsp; &lt;strong&gt;Maarten van de Bospoort&lt;/strong&gt; has posted about this &lt;a href="http://blogs.msdn.com/b/maartenb/archive/2008/07/10/how-to-roll-back-windbg-i.aspx" title="previously"&gt;previously&lt;/a&gt;.&amp;nbsp; You need to resort to a backup of the keys (i.e. export them prior to the running of WinDbg -I).&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;So what happened today to prompt me to write this post?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Today, I discovered that WinDbg can do &lt;strong&gt;file association&lt;/strong&gt; too!&amp;nbsp; WinDbg.exe supports a &lt;strong&gt;-IA&lt;/strong&gt; switch to register the file associations.&amp;nbsp; Both the -I and -IA options are both listed in the Debugger.chm file for the WinDbg command line topic; but the description is a little brief for -IA.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;So as to find out what -IA actually does, I recorded it's execution with &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx" title="ProcMon"&gt;ProcMon&lt;/a&gt;.&amp;nbsp;Running &lt;strong&gt;WinDbg.exe -IA&lt;/strong&gt; elevated from c:\debuggers produces the following screenshot and &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx" title="ProcMon"&gt;ProcMon&lt;/a&gt; log file (lots of filtering has been applied).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-44-75/0218.WinDbg-_2D00_IA.png"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-44-75/0218.WinDbg-_2D00_IA.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7253212 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegOpenKey&amp;nbsp;HKCR\.dmp&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: Read, Maximum Allowed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7254430 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\.dmp&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7255690 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\.dmp&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7256082 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\.dmp&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7257391 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\.dmp\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 36, Data: WinDbg.DumpFile.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7265370 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegOpenKey&amp;nbsp;HKCR\.hdmp&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: Read, Maximum Allowed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7266420 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\.hdmp&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7275875 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\.hdmp&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7276288 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\.hdmp&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7277548 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\.hdmp\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 36, Data: WinDbg.DumpFile.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7282217 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegOpenKey&amp;nbsp;HKCR\.mdmp&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: Read, Maximum Allowed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7283812 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\.mdmp&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7284834 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\.mdmp&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7285233 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\.mdmp&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7286521 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\.mdmp\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 36, Data: WinDbg.DumpFile.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7291973 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\.kdmp&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7307581 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\.kdmp&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7307980 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\.kdmp&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7309261 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\.kdmp\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 36, Data: WinDbg.DumpFile.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7332358 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\WinDbg.DumpFile.1&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7349016 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7349436 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7350913 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\WinDbg.DumpFile.1\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 58, Data: WinDbg Post-Mortem Dump File&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7373303 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7373793 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7377440 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\DefaultIcon&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7388456 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\DefaultIcon&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7388848 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\DefaultIcon&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7390150 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\WinDbg.DumpFile.1\DefaultIcon\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 64, Data: "C:\debuggers\windbg.exe",-3002&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7467553 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7474203 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7477828 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7511046 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7511515 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7513244 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 10, Data: Open&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7540113 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7540540 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7544075 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\Open&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7556393 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\Open&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7556785 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\Open&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7558143 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\Open\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 12, Data: &amp;amp;Open&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7576306 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\Open&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7576775 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\Open&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7580456 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\Open\command&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7592768 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\Open\command&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7593167 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\Open\command&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7594629 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\WinDbg.DumpFile.1\shell\Open\command\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 68, Data: "C:\debuggers\windbg.exe" -z "%1"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7630360 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\.wew&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7641811 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\.wew&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7642168 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\.wew&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7644407 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\.wew\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 38, Data: WinDbg.Workspace.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7677107 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\WinDbg.Workspace.1&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7688110 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7688488 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7690853 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\WinDbg.Workspace.1\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 44, Data: WinDbg Workspace File&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7708855 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7709275 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7712446 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\WinDbg.Workspace.1\DefaultIcon&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7722720 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\DefaultIcon&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7723098 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\DefaultIcon&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7724169 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\WinDbg.Workspace.1\DefaultIcon\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 64, Data: "C:\debuggers\windbg.exe",-3002&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7742535 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7742990 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7746364 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7784159 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7784565 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7785895 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 10, Data: Open&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7806080 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7806528 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7809825 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\Open&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7821576 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\Open&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7821933 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\Open&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7823025 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\Open\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 12, Data: &amp;amp;Open&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7840075 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\Open&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7840460 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\Open&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7856271 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegCreateKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\Open\command&amp;nbsp;SUCCESS&amp;nbsp;Desired Access: All Access&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7869639 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\Open\command&amp;nbsp;SUCCESS&amp;nbsp;Query: Name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7870052 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegQueryKey&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\Open\command&amp;nbsp;SUCCESS&amp;nbsp;Query: HandleTags, HandleTags: 0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier; font-size: x-small;"&gt;8:21:12.7871508 PM&amp;nbsp;windbg.exe&amp;nbsp;7140&amp;nbsp;RegSetValue&amp;nbsp;HKCR\WinDbg.Workspace.1\shell\Open\command\(Default)&amp;nbsp;SUCCESS&amp;nbsp;Type: REG_SZ, Length: 70, Data: "C:\debuggers\windbg.exe" -WF "%1"&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The context menu registered using the same technique as my regsitry file -&amp;nbsp;it uses shell commands in the HKCR hive.&lt;/p&gt;
&lt;p&gt;The dump associations aren't as useful as my registry file as only one debugger is supported and it skips *.ini files, but it does however associate the workspace files. I've personally never opened a workspace, but if you have, this might be a good thing to have.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;So what will I be doing on my systems from now on?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I'll be running &lt;strong&gt;WinDbg.exe -IA&lt;/strong&gt;&amp;nbsp;against my x64 debugger, I'll then run &lt;strong&gt;WinDbg.exe -I&lt;/strong&gt; against the x64 &lt;span style="text-decoration: underline;"&gt;and&lt;/span&gt; x86 debugger, and then I'll run my registry script to give me more flexibility (and file type support) in the way that dumps are loaded.&lt;/p&gt;
&lt;p&gt;BTW, if after doing this you find that you aren't getting the context menu, the odds are that you have a 'Open With...' file association in your HKCU hive. Find the .dmp key and delete it to revert to the global HKCR configuration.&lt;/p&gt;
&lt;p&gt;Note, if you have no intention of debugging the AeDebug dumps, you are much better off leaving WER as the postmortem debugger (i.e. don't run -I) and sending the issue to Microsoft for analysis.&amp;nbsp;Its the best way of getting the issue fixed.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10161236" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/ProcDump/">ProcDump</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Debugger/">Debugger</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/WinDbg/">WinDbg</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Registry/">Registry</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/ProcMon/">ProcMon</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Context+Menu/">Context Menu</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/File+Association/">File Association</category></item><item><title>ProcDump v3.04 - a cautionary MiniPlus update</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/05/04/procdump-v3-04-a-cautionary-miniplus-update.aspx</link><pubDate>Thu, 05 May 2011 02:26:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10161220</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10161220</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/05/04/procdump-v3-04-a-cautionary-miniplus-update.aspx#comments</comments><description>&lt;p&gt;ProcDump v3.04 has been &lt;a href="http://blogs.technet.com/b/sysinternals/archive/2011/05/03/updates-zoomit-v4-2-process-explorer-v14-11-procdump-v3-04-and-mark-live-zero-day-malware-cleaning-with-the-sysinternals-tools.aspx" title="released"&gt;released&lt;/a&gt;. The release just contains a tiny (edge case) sanity check I wrote in the MiniPlus stack traversal code.&amp;nbsp; Specifically, it caters for the case where esp/rsp is not within the stack base and stack limit.&amp;nbsp; In this highly unlikely scenario, ProcDump -mp now iterates between the stack limit and the base instead of between the stack pointer and the base.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10161220" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Memory/">Memory</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Mark+Russinovich/">Mark Russinovich</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/MiniPlus/">MiniPlus</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/ProcDump/">ProcDump</category></item><item><title>David Solomon Memory Management talks</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/05/01/david-solomon-memory-management-talks.aspx</link><pubDate>Sun, 01 May 2011 17:50:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10159842</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10159842</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/05/01/david-solomon-memory-management-talks.aspx#comments</comments><description>&lt;p&gt;These David Solomon talks on Memory Management (circa 2005) used to be on TechNet Spotlight but got pulled last year.&lt;/p&gt;
&lt;p&gt;I've found a repost of them here: &lt;a href="http://www.opsvault.com/david-solomon-technet-talks/"&gt;http://www.opsvault.com/david-solomon-technet-talks/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10159842" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Memory/">Memory</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/David+Solomon/">David Solomon</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Memory+Management/">Memory Management</category></item><item><title>Writing a 'Debugging Tools for Windows' Extension</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/04/23/writing-a-debugging-tools-for-windows-extension.aspx</link><pubDate>Sat, 23 Apr 2011 17:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10157161</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10157161</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/04/23/writing-a-debugging-tools-for-windows-extension.aspx#comments</comments><description>&lt;p&gt;I've written a three part series in &lt;strong&gt;MSDN Magazine&lt;/strong&gt; that covers the Debugging API (specifically, DbgEng).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Writing a Debugging Tools for Windows Extension - Part 1 - March 2011&lt;/h4&gt;
&lt;p&gt;Covers the build environment and the basics of Output, reading Memory and reading Registers&lt;/p&gt;
&lt;p&gt;Web: &lt;a href="http://msdn.microsoft.com/en-us/magazine/gg650659.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/gg650659.aspx&lt;/a&gt;&lt;br /&gt;PDF: &lt;a href="http://download.microsoft.com/download/4/D/4/4D40CAFF-528D-4AAF-80AA-2DD524A22BD2/MSDN_0311DG.pdf"&gt;http://download.microsoft.com/download/4/D/4/4D40CAFF-528D-4AAF-80AA-2DD524A22BD2/MSDN_0311DG.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Writing a Debugging Tools for Windows Extension - Part 2 - May 2011&lt;/h4&gt;
&lt;p&gt;Covers the how of Debugger Markup Language (DML)&lt;/p&gt;
&lt;p&gt;Web: &lt;a href="http://msdn.microsoft.com/en-us/magazine/hh148143.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/hh148143.aspx&lt;/a&gt;&lt;br /&gt;PDF: &lt;a href="http://download.microsoft.com/download/0/5/7/057B35F0-6EF1-4E27-AE3A-9E7FD2060A63/MSDN_0511DG.pdf"&gt;http://download.microsoft.com/download/0/5/7/057B35F0-6EF1-4E27-AE3A-9E7FD2060A63/MSDN_0511DG.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Writing a Debugging Tools for Windows Extension - Part 3 - June 2011&lt;/h4&gt;
&lt;p&gt;Covers the how and why to use Debugger Clients and Debugger Output Callbacks&lt;/p&gt;
&lt;p&gt;Web: &lt;a href="http://msdn.microsoft.com/en-us/magazine/hh205613.aspx"&gt;http://msdn.microsoft.com/en-us/magazine/hh205613.aspx&lt;/a&gt;&lt;br /&gt;PDF: &lt;a href="http://download.microsoft.com/download/8/F/3/8F3FC55F-AB8F-4F1C-88CB-844901839517/MSDN_Magazine_0611.pdf"&gt;http://download.microsoft.com/download/8/F/3/8F3FC55F-AB8F-4F1C-88CB-844901839517/MSDN_Magazine_0611.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10157161" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/DbgEng/">DbgEng</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/MSDN+Magazine/">MSDN Magazine</category></item><item><title>Linked List Performance Issues? Skip List to the Rescue!</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/04/21/skip-lists-where-have-you-been-all-my-life.aspx</link><pubDate>Fri, 22 Apr 2011 05:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10156968</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10156968</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/04/21/skip-lists-where-have-you-been-all-my-life.aspx#comments</comments><description>&lt;h3&gt;A Traditional Linked List&lt;/h3&gt;
&lt;p&gt;At some point in every developer&amp;rsquo;s life, you&amp;rsquo;ll have to write some code that works with a Linked List. You&amp;rsquo;ll start by making a structure like this:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;typedef struct &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; ULONG64 ulStartAddress; &lt;br /&gt;&amp;nbsp; ULONG64 ulEndAddress;&amp;nbsp;&lt;br /&gt;&amp;nbsp; MemoryNode* pNext; &lt;br /&gt;} MemoryNode;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And you&amp;rsquo;ll populate it&amp;hellip; (In this example, I&amp;rsquo;m using the DbgEng API to iterate over a target address space for memory regions.)&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;HRESULT LoopMemInfo(IDebugDataSpaces2* pDebugDataSpaces2, MemoryNode** ppNodeRoot) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; if ((pDebugDataSpaces2 == NULL) || (ppNodeRoot == NULL)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return E_INVALIDARG; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; *ppNodeRoot = NULL; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; ULONG64 ulPtr = 0;&amp;nbsp; &lt;br /&gt;&amp;nbsp; MEMORY_BASIC_INFORMATION64 memInfo; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;&amp;nbsp; MemoryNode* pPrev = NULL; &lt;br /&gt;&amp;nbsp; while (SUCCEEDED(pDebugDataSpaces2-&amp;gt;QueryVirtual(ulPtr, &amp;amp;memInfo)))&lt;br /&gt;&amp;nbsp; {&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemoryNode* pNode = new MemoryNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (*ppNodeRoot == NULL) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ppNodeRoot = pNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPrev-&amp;gt;pNext = pNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPrev = pNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode-&amp;gt;ulStartAddress = memInfo.BaseAddress; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode-&amp;gt;ulEndAddress = memInfo.BaseAddress + memInfo.RegionSize;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode-&amp;gt;pNext = NULL; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ulPtr = memInfo.BaseAddress + memInfo.RegionSize; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; return S_OK; &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After that, you&amp;rsquo;ll want to interact with the linker list, usually in a search type fashion.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;HRESULT Search(MemoryNode* pNodeRoot, MemoryNode** ppNode, ULONG64 addr) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; if ((pNodeRoot == NULL) || (ppNode == NULL)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return E_INVALIDARG; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; *ppNode = NULL; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; ULONG64 ulPtr = 0;&amp;nbsp; &lt;br /&gt;&amp;nbsp; MEMORY_BASIC_INFORMATION64 memInfo; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;&amp;nbsp; MemoryNode* pNode = pNodeRoot; &lt;br /&gt;&amp;nbsp; while (pNode != NULL) &lt;br /&gt;&amp;nbsp; {&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((addr &amp;gt;= pNode-&amp;gt;ulStartAddress) &amp;amp;&amp;amp; (addr &amp;lt;= pNode-&amp;gt;ulEndAddress)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ppNode = pNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S_OK; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (addr &amp;lt; pNode-&amp;gt;ulStartAddress) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp; // We have passed the point where it can be as the list is in order &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode = pNode-&amp;gt;pNext; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; return S_FALSE; &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The problem is, this code can run quite slow. For example, lets say that we modeled 200,000 memory regions.&amp;nbsp; (As you can probably guess, yes, this is based on a personal real-world observation). And lets say that you wanted to mark each a region that contains a particular address as being &amp;lsquo;used&amp;rsquo;. In a worse case scenario, you would need to traverse 200,000 pNext pointers to find out the region doesn&amp;rsquo;t exist (e.g. you search for 0xffffffff&amp;rsquo;ffffffff).&amp;nbsp; That&amp;rsquo;s really expensive if you need to do the search 100,000+ times (e.g. for every pointer in a stack &amp;ndash; 1Mb/8).&amp;nbsp; That&amp;rsquo;s a total of 200,000,000,000 (200 trillion) comparison operations!&lt;/p&gt;
&lt;p&gt;The interesting thing about this linked list is that it is ordered by virtue of the way it was built, and it will not experience any type of insertion or deletion after its creation. If you have a Linked List like this, a Skip List can be use to help speed up searches considerably!&lt;/p&gt;
&lt;h3&gt;Skip List&lt;/h3&gt;
&lt;p&gt;A Skip List works the same way as the various tokens work in the board game &lt;a href="http://en.wikipedia.org/wiki/Scotland_Yard_(board_game)"&gt;Scotland Yard&lt;/a&gt;. You jump a great distance with the Underground (train) tokens, a few streets with the Bus tokens, and then individual streets with the Taxi tokens. By keeping additional &amp;lsquo;Next&amp;rsquo; pointers to varying distances forward in the list, you can &amp;lsquo;skip&amp;rsquo; past a huge number of nodes with just a few jumps.&lt;/p&gt;
&lt;p&gt;The trick is to work out the number of skip pointers to have versus the cost of checking each skip pointer in each destination reached. If you take this to the n&amp;rsquo;th degree, you could have 200,000 skip pointers per node (as per my example), but it it would cost 199,999 &amp;lsquo;if-then&amp;rsquo; statements to determine that you only need to skip forward one node (in the worse case) &amp;ndash; the last statement being the only &amp;lsquo;if-then&amp;rsquo; statement that succeeds.&lt;/p&gt;
&lt;p&gt;Some basic math generates a pretty good idea of the size of the jump you&amp;rsquo;ll get by having &lt;em&gt;N&lt;/em&gt; skip pointers (there is no real mathematical theorem here behind what the size of the jumps should be &amp;ndash; I&amp;rsquo;m just using even size jumps as that seems a good way of making an &amp;lsquo;average&amp;rsquo; approach). What you do is, get the expected data set size (in my case, somewhere between 10,000 and 1,000,000 nodes) and calculate the square, cube and quad roots of the highest value.&lt;/p&gt;
&lt;p&gt;1,000,000 Square Root = 1,000x1,000 | Worse Case = ~ 1,000+1,000 = ~2,000 &lt;br /&gt;1,000,000 Cube Root = 100x100x100 | Worse Case = ~ 100+100+100 = ~300 &lt;br /&gt;1,000,000 Quad Root = 32x32x32x32 | Worse Case = ~ 32+32+32+32 = ~128&lt;/p&gt;
&lt;p&gt;The approximate worse-case cost is the sum of the jump sizes. So if you need to traverse 1,000,000 nodes to the last node, it would take 1million jumps if you have 1 skip (next) pointer, ~2,000 jumps if you have 2 skip pointers (0.2% cost), ~300 if you have 3 skip pointers (0.03% cost), and ~128 if you have 4 skips pointers (0.01% cost).&amp;nbsp; At a certain point, the increase in the number of skip pointers passes the benefit of adding them. In the case of 1,000,000 the magic number is around 9 (I think), but the benefits are seen around 3 or 4.&lt;/p&gt;
&lt;p&gt;Now my math isn&amp;rsquo;t very accurate as it hasn&amp;rsquo;t accounted for the conditional statements that fail along the way. That is, when you get to the last big jump, you check for this jump in all subsequent sub-nodes. Thus the cost is more like this (I think):&lt;/p&gt;
&lt;p&gt;1,000,000 Square Root = 1,000x1,000 | Worse Case = (1,000)+(1,000+999) = 2,999 &lt;br /&gt;1,000,000 Cube Root = 100x100x100 | Worse Case = (100)+(100+99)+(100+99+99) = 597 &lt;br /&gt;1,000,000 Quad Root = 32x32x32x32 | Worse Case = (32)+(32+31)+(32+31+31)+(32+31+31+31) = 314 &lt;br /&gt;1,000,000 Quin Root = 16x16x16x16x16 | Worse Case = (16)+(16+15)+(16+15+15)+(16+15+15+15)+(16+15+15+15+15) = 230&lt;/p&gt;
&lt;p&gt;The savings are still huge. And from experience, I can tell you that this reduced my application&amp;rsquo;s search from 20 minutes to under 100 msec. Compared to B-Tree storage, you&amp;rsquo;ll get a faster search, plus you don&amp;rsquo;t have to worry about rebalancing the tree to solve the right-tree only insertion issue (which you&amp;rsquo;ll get with linear data insertion).&lt;/p&gt;
&lt;h3&gt;So what does the code now look like?&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s the modified structure using 4 jump pointers:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;typedef struct &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; ULONG64 ulStartAddress; &lt;br /&gt;&amp;nbsp; ULONG64 ulEndAddress;&amp;nbsp;&lt;br /&gt;&amp;nbsp; Node* pNext4; // Skips 32k forward &lt;br /&gt;&amp;nbsp; Node* pNext3; // Skips 1k forward &lt;br /&gt;&amp;nbsp; Node* pNext2; // Skips 32 forward &lt;br /&gt;&amp;nbsp; Node* pNext1; // Skips 1 forward &lt;br /&gt;} MemoryNode;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the modified list builder using 4 jump pointers:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;HRESULT LoopMemInfo(IDebugDataSpaces2* pDebugDataSpaces2, MemoryNode** ppNodeRoot) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; if ((pDebugDataSpaces2 == NULL) || (ppNodeRoot == NULL)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return E_INVALIDARG; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; *ppNodeRoot = NULL; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; ULONG64 ulPtr = 0;&amp;nbsp; &lt;br /&gt;&amp;nbsp; MEMORY_BASIC_INFORMATION64 memInfo; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;&amp;nbsp; MemoryNode* pPrev4 = NULL; &lt;br /&gt;&amp;nbsp; MemoryNode* pPrev3 = NULL; &lt;br /&gt;&amp;nbsp; MemoryNode* pPrev2 = NULL; &lt;br /&gt;&amp;nbsp; MemoryNode* pPrev1 = NULL; &lt;br /&gt;&amp;nbsp; ULONG64 ulCount = 0; &lt;br /&gt;&amp;nbsp; while (SUCCEEDED(pDebugDataSpaces2-&amp;gt;QueryVirtual(ulPtr, &amp;amp;memInfo)))&lt;br /&gt;&amp;nbsp; {&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemoryNode* pNode = new MemoryNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ulCount == 0) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ppNodeRoot = pNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPrev1 = pNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPrev2 = pNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPrev3 = pNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPrev4 = pNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ulCount &amp;gt;= 1) { pPrev1-&amp;gt;pNext1 = pNode; pPrev1 = pPrev1-&amp;gt;pNext1; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ulCount &amp;gt;= 32) { pPrev2-&amp;gt;pNext2 = pNode; pPrev2 = pPrev2-&amp;gt;pNext1; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ulCount &amp;gt;= 1024) { pPrev3-&amp;gt;pNext3 = pNode; pPrev3 = pPrev3-&amp;gt;pNext1; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ulCount &amp;gt;= 32768) { pPrev4-&amp;gt;pNext4 = pNode; pPrev4 = pPrev4-&amp;gt;pNext1; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode-&amp;gt;ulStartAddress = memInfo.BaseAddress; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode-&amp;gt;ulEndAddress = memInfo.BaseAddress + memInfo.RegionSize;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode-&amp;gt;pNext4 = NULL; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode-&amp;gt;pNext3 = NULL; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode-&amp;gt;pNext2 = NULL; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode-&amp;gt;pNext1 = NULL; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ulPtr = memInfo.BaseAddress + memInfo.RegionSize;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ulCount++; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; return S_OK; &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the modified search using 4 jump pointers:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;HRESULT Search(MemoryNode* pNodeRoot, MemoryNode** ppNode, ULONG64 addr) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; if ((pNodeRoot == NULL) || (ppNode == NULL)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return E_INVALIDARG; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; *ppNode = NULL;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; MEMORY_BASIC_INFORMATION64 memInfo; &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;&amp;nbsp; MemoryNode* pNode = pNodeRoot; &lt;br /&gt;&amp;nbsp; while (pNode != NULL) &lt;br /&gt;&amp;nbsp; {&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((pNode-&amp;gt;pNext4 != NULL) &amp;amp;&amp;amp; (addr &amp;gt;= pNode-&amp;gt;pNext4-&amp;gt;ulStartAddress)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode = pNode-&amp;gt;pNext4; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((pNode-&amp;gt;pNext3 != NULL) &amp;amp;&amp;amp; (addr &amp;gt;= pNode-&amp;gt;pNext3-&amp;gt;ulStartAddress)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode = pNode-&amp;gt;pNext3; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((pNode-&amp;gt;pNext2 != NULL) &amp;amp;&amp;amp; (addr &amp;gt;= pNode-&amp;gt;pNext2-&amp;gt;ulStartAddress)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode = pNode-&amp;gt;pNext2; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((pNode-&amp;gt;pNext1 != NULL) &amp;amp;&amp;amp; (addr &amp;gt;= pNode-&amp;gt;pNext1-&amp;gt;ulStartAddress)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pNode = pNode-&amp;gt;pNext1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((addr &amp;gt;= pNode-&amp;gt;ulStartAddress) &amp;amp;&amp;amp; (addr &amp;lt;= pNode-&amp;gt;ulEndAddress)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ppNode = pNode; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S_OK; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Courier New; font-size: x-small;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // We haven&amp;rsquo;t found it based on our knowledge of the list order &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; return S_FALSE; &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;* Note: I just typed this code off the top of my head; I&amp;rsquo;ve never compiled or tested it. It could have bugs in it. No warranty of any type is given for its use.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So there you have it, an example implementation of a Skip List.&amp;nbsp; Note though, there are lots of caveats to its use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The data being modeled needs to linear&lt;/li&gt;
&lt;li&gt;The data being modeled needs to comparable&lt;/li&gt;
&lt;li&gt;Insertion is done all-at-once (so the cost of generating the pointers is low)&lt;/li&gt;
&lt;li&gt;An unconstrained amount of memory is available (you can afford the cost of the additional pointers)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Skips Lists are a simple concept, and aren&amp;rsquo;t too hard implement.&amp;nbsp; I&amp;rsquo;d love to hear about your success stories.&amp;nbsp; They fixed a massive performance problem within my own code without causing too much disruption to the applications linked-list design.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10156968" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/IDebugDataSpaces2/">IDebugDataSpaces2</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Skip+List/">Skip List</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Linked+List/">Linked List</category></item><item><title>IDebugDataSpaces2::QueryVirtual doesn’t act the same as VirtualQuery</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/04/20/idebugdataspaces2-queryvirtual-doesn-t-act-the-same-as-virtualquery.aspx</link><pubDate>Thu, 21 Apr 2011 02:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10156504</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10156504</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/04/20/idebugdataspaces2-queryvirtual-doesn-t-act-the-same-as-virtualquery.aspx#comments</comments><description>&lt;p&gt;One of my debugger extensions commands uses &lt;a href="http://msdn.microsoft.com/en-US/library/ff553502"&gt;IDebugDataSpaces2::QueryVirtual&lt;/a&gt; to iterate through the target’s address space to find particular size allocations (regions that are used for the TEB if you must know).&amp;#160; The code was working fine but on x64 dumps, I found that it was running quite slow.&lt;/p&gt;  &lt;p&gt;Looking in to it, I found out that &lt;a href="http://msdn.microsoft.com/en-US/library/ff553502"&gt;IDebugDataSpaces2::QueryVirtual&lt;/a&gt; doesn’t act the same as &lt;a href="http://msdn.microsoft.com/en-us/library/aa366902"&gt;VirtualQuery&lt;/a&gt;. When it encounters an area that doesn’t contain an allocation, it doesn’t return a MEM_FREE ‘State’ value in the &lt;a href="http://msdn.microsoft.com/en-us/library/aa366775"&gt;MEMORY_BASIC_INFORMATION64&lt;/a&gt; structure for the region (like &lt;a href="http://msdn.microsoft.com/en-us/library/aa366902"&gt;VirtualQuery&lt;/a&gt; does), instead it jumps forward to the next region.&amp;#160; Thus the pointer provided may not be in the region returned.&lt;/p&gt;  &lt;p&gt;In my code, I had this iterator:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;ulPtr += memInfo.RegionSize;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I was only using a 0x1800 byte increment because that was the size of the region jumped to. The performance problem stemmed from the size of the jump, from a Base Address of 0x13’00000000 to 0xffffff1e’00000000.&amp;#160; Needless to say, it took a while to traverse between the two (over 30 seconds).&lt;/p&gt;  &lt;p&gt;A quick change to this solved everything:&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; ulPtr = memInfo.BaseAddress + memInfo.RegionSize;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration: underline"&gt;Here is how to correctly do a Lookup and how to do a Loop.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;/////////////////////////////////////          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&lt;span style="color: #000000"&gt;// Lookup            &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #000000"&gt;/////////////////////////////////////&lt;/span&gt;&lt;/span&gt; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;HRESULT GetMemInfo(IDebugDataSpaces2* pDebugDataSpaces2, ULONG64 ulPtr, MEMORY_BASIC_INFORMATION64* pMemInfo)          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;{          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&lt;span style="color: #000000"&gt;&amp;#160; if ((pDebugDataSpaces2 == NULL) || (pMemInfo == NULL))            &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; return E_INVALIDARG;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160; MEMORY_BASIC_INFORMATION64 memInfo;          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160; if (SUCCEEDED(pDebugDataSpaces2-&amp;gt;QueryVirtual(ulPtr, &amp;amp;memInfo)))          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160; {          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; if ((ulPtr &amp;gt;= memInfo.BaseAddress) &amp;amp;&amp;amp;          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (ulPtr &amp;lt; (memInfo.BaseAddress+memInfo.RegionSize)))          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; {          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; memcpy(pMemInfo, &amp;amp;memInfo, sizeof(MEMORY_BASIC_INFORMATION64));          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return S_OK;          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; }          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160; }          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&lt;span style="color: #000000"&gt;&amp;#160; return E_FAIL;            &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;/////////////////////////////////////          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&lt;span style="color: #000000"&gt;// Loop            &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;span style="color: #000000"&gt;/////////////////////////////////////&lt;/span&gt;&lt;/span&gt; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;HRESULT LoopMemInfo(IDebugDataSpaces2* pDebugDataSpaces2)          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;{          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&lt;span style="color: #000000"&gt;&amp;#160; if (pDebugDataSpaces2 == NULL)            &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;#160;&amp;#160;&amp;#160; return E_INVALIDARG;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160; ULONG64 ulPtr = 0;          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160; MEMORY_BASIC_INFORMATION64 memInfo;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160; while ((ulPtr != 0) &amp;amp;&amp;amp; (SUCCEEDED(pDebugDataSpaces2-&amp;gt;QueryVirtual(ulPtr, &amp;amp;memInfo))))          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160; {          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; // Note, ulPtr may not be within the memory region!          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; // ...          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&amp;#160;&amp;#160;&amp;#160; ulPtr = memInfo.BaseAddress + memInfo.RegionSize;          &lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;&lt;span style="color: #000000"&gt;&amp;#160; }           &lt;br /&gt;&amp;#160; return S_OK;            &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: ; color: #000000"&gt;&lt;font size="2" face="Courier New"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2" face="Courier New"&gt;&amp;#160;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new; color: #000000"&gt;&lt;span style="font-size: x-small"&gt;&lt;font size="2"&gt;/////////////////////////////////////&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: courier new"&gt;&lt;span style="font-size: x-small"&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10156504" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/DbgEng/">DbgEng</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/IDebugDataSpaces2/">IDebugDataSpaces2</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Memory/">Memory</category></item><item><title>StackBase and StackLimit offsets</title><link>http://blogs.msdn.com/b/andrew_richards/archive/2011/04/20/stackbase-and-stacklimit-offsets.aspx</link><pubDate>Wed, 20 Apr 2011 23:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10156452</guid><dc:creator>AndrewRichards</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/andrew_richards/rsscomments.aspx?WeblogPostID=10156452</wfw:commentRss><comments>http://blogs.msdn.com/b/andrew_richards/archive/2011/04/20/stackbase-and-stacklimit-offsets.aspx#comments</comments><description>&lt;p&gt;To save a symbol lookup in a debugger extension, here are the hardcodes to use for StackBase and StackLimit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User Mode 32bit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;0:000&amp;gt; dt nt!_TEB.Stack*&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;ntdll!_TEB&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x000 NtTib : &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp; +0x004 StackBase : Ptr Void&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp; +0x008 StackLimit : Ptr Void&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User Mode 64bit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;0:000&amp;gt; dt nt!_TEB NtTib.Stack*&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;ntdll!_TEB&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x000 NtTib : &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp; +0x008 StackBase : Ptr64 Void&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp; +0x010 StackLimit : Ptr64 Void&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kernel Mode 32bit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;0:000&amp;gt; dt nt!_KTHREAD Stack*&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;ntdll!_KTHREAD&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x01c StackLimit : Ptr Void (NT v5.0 - Windows 2000)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x01c StackLimit : Ptr Void (NT v5.1 - Windows XP SP3)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x01c StackLimit : Ptr Void (NT v5.2 - Windows 2003 SP2)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x02c StackLimit : Ptr Void (NT v6.0 - Windows Vista/2008)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x02c StackLimit : Ptr Void (NT v6.1 - Windows 7/2008R2)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x15c StackBase : Ptr Void (NT v5.0 - Windows 2000)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x15c StackBase : Ptr Void (NT v5.1 - Windows XP SP3)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x158 StackBase : Ptr Void (NT v5.2 - Windows 2003 SP2)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x174 StackBase : Ptr Void (NT v6.0 - Windows Vista/2008)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x194 StackBase : Ptr Void (NT v6.1 - Windows 7/2008R2)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kernel Mode 64bit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;0:000&amp;gt; dt nt!_KTHREAD Stack*&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;ntdll!_KTHREAD&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x??? StackLimit : Ptr64 Void(NT v5.1 - Windows XP SP3)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x??? StackLimit : Ptr64 Void(NT v5.2 - Windows 2003 SP2)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x030 StackLimit : Ptr64 Void(NT v6.0 - Windows Vista/2008)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x030 StackLimit : Ptr64 Void(NT v6.1 - Windows 7/2008R2)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x??? StackBase : Ptr64 Void(NT v5.1 - Windows XP SP3)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x??? StackBase : Ptr64 Void(NT v5.2 - Windows 2003 SP2)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x250 StackBase : Ptr64 Void(NT v6.0 - Windows Vista/2008)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;+0x278 StackBase : Ptr64 Void(NT v6.1 - Windows 7/2008R2)&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10156452" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/_5F00_KTHREAD/">_KTHREAD</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/_5F00_TEB/">_TEB</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/DbgEng/">DbgEng</category><category domain="http://blogs.msdn.com/b/andrew_richards/archive/tags/Memory/">Memory</category></item></channel></rss>
