<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_飞天舞者</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/32528/rss</id><updated>2011-04-12T03:27:17Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/32528/rss"/><entry><id>http://www.cnblogs.com/Winston/archive/2010/03/16/1687649.html</id><title type="text">Windows的SEH机理简要介绍</title><summary type="text">一般来说,我们把Exception分为2类，一类是CPU产生的异常，我们称之为CPU异常(或者硬件异常）。另一类为是通过调用RaiseException API产生的软件异常，我们称之为软件异常。Windows使用同一的方式(KiDispatchException)来描述和分发这两类异常。但是，在处理各自异常时，会略有区别。</summary><published>2010-03-16T13:53:00Z</published><updated>2010-03-16T13:53:00Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Winston/archive/2010/03/16/1687649.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/archive/2010/03/16/1687649.html"/><content type="html">&lt;p&gt;1.异常分类&lt;/p&gt;&#xD;
&lt;p&gt;一般来说,我们把Exception分为2类，一类是CPU产生的异常，我们称之为CPU异常(或者硬件异常）。另一类为是通过调用RaiseException API产生的软件异常，我们称之为软件异常。&lt;/p&gt;&#xD;
&lt;p&gt;Windows使用同一的方式(KiDispatchException)来描述和分发这两类异常。但是，在处理各自异常时，会略有区别。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一般来说，异常处理过程可以分为2个阶段，第1阶段：异常登记过程；第2阶段：异常分发过程。下面分别简要介绍。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.异常登记&lt;/p&gt;&#xD;
&lt;p&gt;1) CPU异常（硬件异常）登记：&lt;/p&gt;&#xD;
&lt;p&gt;在windows kernel中，存在一张中断描述符表(IDT, Interupt Descriptor Table). IDT是一张位于内核态物理内存中的线性表，其有256个表项。IDT中的每个表项叫做门描述符(Gate Descriptor)。门描述符的基本作用就是将CPU异常对应的中断号与其对应的异常处理函数KiTrapXX关联起来。 &lt;/p&gt;&#xD;
&lt;p&gt;例如，0号中断(即除0错误)对应的处理例程为nt!KiTrap00&lt;/p&gt;&#xD;
&lt;p&gt;同时，我们可以通过以下debug comnand来列出IDT表中的各个表项。&lt;/p&gt;&#xD;
&lt;p&gt;lkd&amp;gt;!idt -a&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于CPU异常，通过中断向量找到其中断处理例程 KiTrapXX后，该KiTrapXX会调用CommDispatchException函数，其会获取异常发生时候的适当参数，用来初始化EXCEPTION_RECORD结构体之后，开始调用KiDispatchException进行异常分发。&lt;/p&gt;&#xD;
&lt;p&gt;（简述如下：中断向量 - 〉KiTrapXX - &amp;gt; CommonDispatchException - &amp;gt;KiDispatchException）&lt;/p&gt;&#xD;
&lt;p&gt;EXCEPTION_RECORD的结构如下：&lt;br /&gt;0:000&amp;gt; dt ntdll!_EXCEPTION_RECORD&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x000 ExceptionCode&amp;nbsp;&amp;nbsp;&amp;nbsp; : Int4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x004 ExceptionFlags&amp;nbsp;&amp;nbsp; : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x008 ExceptionRecord&amp;nbsp; : Ptr32 _EXCEPTION_RECORD&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x00c ExceptionAddress : Ptr32 Void&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x010 NumberParameters : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x014 ExceptionInformation : [15] Uint4B&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2) 软件异常登记&lt;/p&gt;&#xD;
&lt;p&gt;软件异常是通过直接或者间接调用内核服务NtRaiseException而产生的。而用户态中可以通过RaiseException API，或者Try-catch等高级语言来调用这个内核服务，而通过RaiseException来登记软件异常的过程可以简单表述如下：&lt;/p&gt;&#xD;
&lt;p&gt;RaiseException在初始化一个EXCEPTION_RECORD结构体之后，开始调用NTDLL中的RtlRaiseException; RtlRaiseException在初始化CONTEXT结构体之后，开始调用内核中NtRaiseException, NtRaiseException再调用另外一个内核函数KiRaiseException。接下来KiRaiseException会调用KiDispatchException开始异常的分发。&lt;/p&gt;&#xD;
&lt;p&gt;如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/winston/exception-register1.jpg" width="705" height="482" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;CONTEXT是一个用来保存用户态-核心态切换现场的数据结构，主要是切换状态时候的各个寄存器的状态，其结构如下：&lt;br /&gt;struct _CONTEXT&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x000 ContextFlags&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Uint4B&lt;br /&gt;　　...&lt;/p&gt;&#xD;
&lt;p&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;+0x09c Edi&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; : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x0a0 Esi&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; : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x0a4 Ebx&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; : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x0a8 Edx&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; : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x0ac Ecx&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; : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x0b0 Eax&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; : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x0b4 Ebp&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; : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; +0x0b8 Eip&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; : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;+0x0c4 Esp&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; : Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; ...&lt;/p&gt;&#xD;
&lt;p&gt;...&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3. 异常派发过程(Dispatch Exception)&lt;/p&gt;&#xD;
&lt;p&gt;当产生CPU异常或者软件异常之后，最后都会调用到系统服务KiDispatchException进行异常的派发和处理。 对于CPU异常和软件异常，其处理过程略有不同。下面分别简要介绍&lt;/p&gt;&#xD;
&lt;p&gt;1）CPU异常派发过程：&lt;/p&gt;&#xD;
&lt;p&gt;对于第一轮的异常,其会尝试先让内核调试器来处理该异常(KiDebugRoutine)。如果KiDebugRoutine返回为True,也就是内核调试器处理了该异常，那么便停止异常分发。否则，会调用kernel mode下的RtlDispatchException (NTOSKRNL)来试图寻找已经注册的结构化异常处理器。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果没有相应的异常处理器，系统会尝试进行第二次分发。如果这次KeDebugRoutine仍然返回FAlSE,表明这是一个无人处理的异常，从而调用KeBugCheckEx引发蓝屏。&lt;/p&gt;&#xD;
&lt;p&gt;其过程如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/winston/exception-register3.jpg" width="579" height="307" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2) 软件异常派发过程：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/winston/exception-register2.jpg" width="581" height="399" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当软件异常被派发到user-mode之后，如何处理这个exception呢？实际上，在TEB中有一个非常重要的结构体，叫做_NT_TIB。在_NT_TIB中有一个_EXCEPTION_REGISTRATION_RECORD类型的字段叫做exceptionlist， 他的值就是指向异常处理器(_exception_handler)的首地址。EXCEPTION_REGISTRATION_RECORD是一个单向链表。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;那么这个EXCEPTION_REGISTRATION_RECORD的首地址值从何而来呢？他是保存在FS:[0]寄存器中的。也就是说，当异常发生时，取得FS:[0]中的值，即为EXCEPTION_REGISTRATION_RECORD的首地址。我们从windbg中可以得到验证，如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('973f7e2a-0e4f-4d88-8c7d-e3bfdc9fd5f7')"&gt;&lt;img id="code_img_opened_973f7e2a-0e4f-4d88-8c7d-e3bfdc9fd5f7"  onclick="cnblogs_code_hide('973f7e2a-0e4f-4d88-8c7d-e3bfdc9fd5f7',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_973f7e2a-0e4f-4d88-8c7d-e3bfdc9fd5f7"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;/span&gt;&lt;span style="color: #800080"&gt;000&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;teb&lt;br /&gt;TEB&amp;nbsp;at&amp;nbsp;7ffdf000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ExceptionList:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;0012fd04&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StackBase:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00130000&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StackLimit:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0012e000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SubSystemTib:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00000000&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FiberData:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;00001e00&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArbitraryUserPointer:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00000000&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Self:&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;7ffdf000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EnvironmentPointer:&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00000000&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ClientId:&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;0000312c&amp;nbsp;.&amp;nbsp;00001a50&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RpcHandle:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00000000&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tls&amp;nbsp;Storage:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00000000&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PEB&amp;nbsp;Address:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7ffdb000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastErrorValue:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastStatusValue:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c0000135&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Count&amp;nbsp;Owned&amp;nbsp;Locks:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HardErrorMode:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;/span&gt;&lt;span style="color: #800080"&gt;000&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;r&amp;nbsp;fs&lt;br /&gt;fs&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;0000003b&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;/span&gt;&lt;span style="color: #800080"&gt;000&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;dd&amp;nbsp;fs:[&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;]&amp;nbsp;L4&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;003b:&lt;/span&gt;&lt;span style="color: #800080"&gt;00000000&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;0012fd04&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00130000&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;0012e000&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;00000000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在得到该异常处理链表之后，便开始遍历该链表。在遍历链表的过程中，当前节点的Exception_hanlder会判断是否能否handle当前的异常。如不能，则返回枚举类型_EXCEPTION_DISPOSITION的一个值 (ExceptionContinueSearch),以便让其继续向后遍历该链表，直到找到该exception_handler，并最终返回ExceptionContinueExecution，以便停止向下遍历的过程。其过程如下图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/winston/exceptionfig02.gif" width="415" height="115" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;但是，如果遍历到最后都没有找到handle当前exception的exception handler,那么便会触发unhandled exception并最终调用ntdll!RtlUnhandledExceptionFilter,对于桌面型应用程序，其就会崩溃； 而对于服务端程序，为了更好的用户体验，这时候比如asp.net 的runtime 就会捕捉到该exception,在客户端可能就看到service unavailable,或者服务器端错误等等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('e3ef9364-b0b2-43ff-8f37-0039b743f4c6')"&gt;&lt;img id="code_img_opened_e3ef9364-b0b2-43ff-8f37-0039b743f4c6"  onclick="cnblogs_code_hide('e3ef9364-b0b2-43ff-8f37-0039b743f4c6',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_e3ef9364-b0b2-43ff-8f37-0039b743f4c6"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;_TEB&amp;nbsp;(thread&amp;nbsp;environment&amp;nbsp;blcok即线程环境块）定义如下：&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;=============&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;typedef struct &lt;/span&gt;&lt;span style="color: #000000"&gt;_TEB&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x000&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;NtTib&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;_NT_TIB&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x01c&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;EnvironmentPointer&amp;nbsp;:&amp;nbsp;Ptr32&amp;nbsp;Void&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x020&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ClientId&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;_CLIENT_ID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x028&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ActiveRpcHandle&amp;nbsp;&amp;nbsp;:&amp;nbsp;Ptr32&amp;nbsp;Void&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x02c&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ThreadLocalStoragePointer&amp;nbsp;:&amp;nbsp;Ptr32&amp;nbsp;Void&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x030&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ProcessEnvironmentBlock&amp;nbsp;:&amp;nbsp;Ptr32&amp;nbsp;_PEB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x034&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;LastErrorValue&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Uint4B&lt;br /&gt;&amp;nbsp;&amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp; ...&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;}&lt;/span&gt;&lt;span style="color: #000000"&gt;TEB&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;　　　&lt;br /&gt;_NT_TIB的结构定义如下：&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;===========&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;typedef struct &lt;/span&gt;&lt;span style="color: #000000"&gt;_NT_TIB&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x000&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;ExceptionList&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Ptr32&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: yellow; color: #000000"&gt;_EXCEPTION_REGISTRATION_RECORD&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x004&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;StackBase&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Ptr32&amp;nbsp;Void&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x008&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;StackLimit&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Ptr32&amp;nbsp;Void&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;...&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp; ...&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x018&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Self&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;Ptr32&amp;nbsp;_NT_TIB&lt;br /&gt;}NT_TIB&lt;br /&gt;而ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;_EXCEPTION_REGISTRATION_RECORD的定义如下：&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;===========&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;typedef struct _EXCEPTION_REGISTRATION_RECORD&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x000&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Next&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;Ptr32&amp;nbsp;_EXCEPTION_REGISTRATION_RECORD&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #800080"&gt;0x004&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Handler&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Ptr32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_EXCEPTION_DISPOSITION&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;}EXCEPTION_REGISTRATION_RECORD&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;ntdll!_EXCEPTION_DISPOSITION的定义如下：&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;============&lt;br /&gt;&amp;nbsp;&amp;nbsp;typedef enum&amp;nbsp;_EXCEPTION_DISPOSITION&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;{&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="color: #000000"&gt;　　ExceptionContinueExecution = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp; ExceptionContinueSearch = 1&lt;br /&gt;&amp;nbsp;&amp;nbsp; ExceptionNestedException = 2&lt;br /&gt;&amp;nbsp;&amp;nbsp; ExceptionCollidedUnwind = 3&lt;br /&gt;}EXCEPTION_DISPOSITION&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;附件1：&lt;br /&gt;NTDLL模块中与exception处理相关的常见几个系统服务和相关函数&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('5ca81a91-9470-4ded-91b7-f93b4077e718')"&gt;&lt;img id="code_img_opened_5ca81a91-9470-4ded-91b7-f93b4077e718"  onclick="cnblogs_code_hide('5ca81a91-9470-4ded-91b7-f93b4077e718',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt; &#xD;
&lt;div id="cnblogs_code_open_5ca81a91-9470-4ded-91b7-f93b4077e718"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;RtlpUnhandledExceptionFilter&amp;nbsp;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;RtlpDphRaiseException&amp;nbsp;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;RtlpHeapExceptionFilter&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;RtlpDphUnexpectedExceptionFilter&amp;nbsp;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;RtlUnhandledExceptionFilter2&amp;nbsp;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;RtlSetUnhandledExceptionFilter&amp;nbsp;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;RtlDispatchException&amp;nbsp;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;RtlRaiseException&amp;nbsp;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;RtlpExecuteHandlerForException&lt;br /&gt;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;KiRaiseUserExceptionDispatcher&amp;nbsp;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;KiUserCallbackExceptionHandler&amp;nbsp;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;KiUserExceptionDispatcher&amp;nbsp;&lt;br /&gt;&amp;nbsp;ntdll&lt;/span&gt;&lt;span style="color: #000000"&gt;!&lt;/span&gt;&lt;span style="color: #000000"&gt;KiUserApcExceptionHandler&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;参考文档：&lt;/p&gt;&#xD;
&lt;p&gt;=======&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font color="#000080" size="5"&gt;&lt;span style="font-size: 12pt"&gt;A Crash Course on the Depths of Win32&amp;#8482; Structured Exception Handling&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.microsoft.com/msj/0197/exception/exception.aspx" target="_blank"&gt;http://www.microsoft.com/msj/0197/exception/exception.aspx&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/Winston/aggbug/1687649.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/Winston/archive/2010/03/16/1687649.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/Winston/archive/2009/12/16/1625844.html</id><title type="text">如何调试由于heap corruption导致的程序崩溃的简单示例</title><summary type="text">很多情况下，很多程序的崩溃都是与heap corruption有关。一旦找到程序的崩溃是由heap corruption导致后，我们就需要启用debug page heap.这样可以在heap corruption的时候最大可能的获取更多关于heap的相关信息。 </summary><published>2009-12-16T09:31:00Z</published><updated>2009-12-16T09:31:00Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Winston/archive/2009/12/16/1625844.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/archive/2009/12/16/1625844.html"/></entry><entry><id>http://www.cnblogs.com/Winston/archive/2009/09/27/1574902.html</id><title type="text">利用定制行为扩展WCF之-利用MessageInsepctor behaviourExtension扩展WCF行为（自定义消息头）</title><summary type="text">利用定制行为扩展WCF之-利用MessageInsepctor behaviourExtension扩展WCF行为（自定义消息头）</summary><published>2009-09-27T03:58:00Z</published><updated>2009-09-27T03:58:00Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Winston/archive/2009/09/27/1574902.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/archive/2009/09/27/1574902.html"/></entry><entry><id>http://www.cnblogs.com/Winston/archive/2009/06/18/1506121.html</id><title type="text">(转载）如何在WCF实现impersonnate客户端的功能</title><summary type="text">(转载）如何在WCF实现impersonnate客户端的功能</summary><published>2009-06-18T12:11:00Z</published><updated>2009-06-18T12:11:00Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Winston/archive/2009/06/18/1506121.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/archive/2009/06/18/1506121.html"/></entry><entry><id>http://www.cnblogs.com/Winston/archive/2009/06/07/1498000.html</id><title type="text">关于COM的Reg-Free（免注册）技术简介及实例讲解。</title><summary type="text">传统调用COM时，需要事先将COM采用regsvr32进行注册。其实，将COM进行注册并不是必须的过程。本文介绍了一种Reg-Free的COM调用技术。</summary><published>2009-06-07T14:12:00Z</published><updated>2009-06-07T14:12:00Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Winston/archive/2009/06/07/1498000.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/archive/2009/06/07/1498000.html"/></entry><entry><id>http://www.cnblogs.com/Winston/archive/2009/06/06/1487250.html</id><title type="text">COM中的error handling机制及示例（ISupportEfforInfo,ICreateErrorInfo,IErrorInfo）</title><summary type="text">客户端在调用ＤＣＯＭ／ＣＯＭ＋时，无法通过try-catch这样的technology-specific的异常处理机制来处理COM Exception。而只能通过返回的HRESULT code来判断异常。为了弥补这种缺陷，COM有其自身的COM Exception propogation机制。本文介绍了COM中的error handling机制介绍及简单示例。</summary><published>2009-06-06T08:11:00Z</published><updated>2009-06-06T08:11:00Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Winston/archive/2009/06/06/1487250.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/archive/2009/06/06/1487250.html"/></entry><entry><id>http://www.cnblogs.com/Winston/archive/2009/06/04/1496411.html</id><title type="text">如何实现DCOM或者COM+的远程调用</title><summary type="text">远程调用DCOM时，远比在本地调用DCOM时的情形要复杂的多，往往会出现80070005，800406ba等等例如权限，接口各类错误。本文介绍了常规情况下远程调用DCOM的一般方法。</summary><published>2009-06-04T10:03:00Z</published><updated>2009-06-04T10:03:00Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Winston/archive/2009/06/04/1496411.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/archive/2009/06/04/1496411.html"/></entry><entry><id>http://www.cnblogs.com/Winston/archive/2009/05/10/1453528.html</id><title type="text">转载推荐:COM中不同字符类型相互转换，例如char*, BSTR, CString等等</title><summary type="text">原文链接如下：http://vip.6to23.com/louis228/techPapers/convertstring.htm当然，文中类型转换汉书所涉及的头文件并没有一一列举出来，比如_bstr_t所涉及到的&amp;lt;comdef.h&amp;gt;头文件，_com_util::*所涉及到的&amp;lt;comutil.h&amp;gt;及其静态链接库文件comsupp.lib等 //#pragma comment...</summary><published>2009-05-10T01:44:00Z</published><updated>2009-05-10T01:44:00Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Winston/archive/2009/05/10/1453528.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/archive/2009/05/10/1453528.html"/></entry><entry><id>http://www.cnblogs.com/Winston/archive/2009/04/24/1443044.html</id><title type="text">一种强行指定dll assembly读取其相应*.dll.config配置文件的方法(又名：如何创建.net 的DCOM)</title><summary type="text">如何指定dll assembly读取其相应*.dll.config配置文件,本文也演示了如何创建利用.net 创建一个DCOM</summary><published>2009-04-24T08:49:00Z</published><updated>2009-04-24T08:49:00Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Winston/archive/2009/04/24/1443044.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/archive/2009/04/24/1443044.html"/></entry><entry><id>http://www.cnblogs.com/Winston/archive/2009/04/19/1439184.html</id><title type="text">[软件调试学习笔记]防止栈缓冲区溢出的基于Cookie的安全检查机制</title><summary type="text">本文介绍了stack buffer overrun的基本原理及编译器对于stack buffer overrun的检测和处理机制。</summary><published>2009-04-19T11:18:00Z</published><updated>2009-04-19T11:18:00Z</updated><author><name>飞天舞者</name><uri>http://www.cnblogs.com/Winston/</uri></author><link rel="alternate" href="http://www.cnblogs.com/Winston/archive/2009/04/19/1439184.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/Winston/archive/2009/04/19/1439184.html"/></entry></feed>
