<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.technet.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>Escape From The Troubles : Debugging</title><link>http://blogs.technet.com/escape/archive/tags/Debugging/default.aspx</link><description>Tags: Debugging</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Bugcheck BAD_POOL_HEADER (19)</title><link>http://blogs.technet.com/escape/archive/2009/06/12/bugcheck-bad-pool-header-19.aspx</link><pubDate>Fri, 12 Jun 2009 10:10:00 GMT</pubDate><guid isPermaLink="false">d5e57398-b9ef-4490-9955-07cbb4e4a80d:3253816</guid><dc:creator>escapetrouble</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.technet.com/escape/comments/3253816.aspx</comments><wfw:commentRss>http://blogs.technet.com/escape/commentrss.aspx?PostID=3253816</wfw:commentRss><description>&lt;P&gt;Buggy kernel mode 드라이버에 의해서 블루스크린 Bugcheck BAD_POOL_HEADER (19) 가 발생한 사례입니다.&amp;nbsp;이 오류는 커널 모드 드라이버에서 자신이 할당 받은 pool 블록보다 더 많은 데이터를 write하여 next pool 블록의 헤더가 손상된 경우입니다. User mode에서 heap 메모리 손상과 마찬가지로 Kernel mode에서 pool 메모리의 손상은 메모리가 손상된 시점에 시스템이 crash되지 않고, ExFreePool 등이 실행될 때, 메모리 손상을 감지하고 시스템이 crash 됩니다.&lt;/P&gt;
&lt;P&gt;kd&amp;gt; !analyze -v&lt;BR&gt;*******************************************************************************&lt;BR&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;BR&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bugcheck Analysis&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;BR&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;BR&gt;*******************************************************************************&lt;/P&gt;
&lt;P&gt;BAD_POOL_HEADER (19)&lt;BR&gt;The pool is already corrupt at the time of the current request.&lt;BR&gt;This may or may not be due to the caller.&lt;BR&gt;The internal pool links must be walked to figure out a possible cause of&lt;BR&gt;the problem, and then special pool applied to the suspect tags or the driver&lt;BR&gt;verifier to a suspect driver.&lt;BR&gt;Arguments:&lt;BR&gt;Arg1: 00000020, a pool block header size is corrupt.&lt;BR&gt;Arg2: 82fd27c8, The pool entry we were looking for within the page.&lt;BR&gt;Arg3: 82fd27f0, The next pool entry.&lt;BR&gt;Arg4: 0a050008, (reserved)&lt;/P&gt;
&lt;P&gt;kd&amp;gt; kbL&lt;BR&gt;ChildEBP RetAddr&amp;nbsp; Args to Child&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;BR&gt;f8ae3540 80532f7e 00000003 82fe72b0 82fd27c8 nt!KiBugCheckDebugBreak+0x19&lt;BR&gt;f8ae3920 8053356e 00000019 00000020 82fd27c8 nt!KeBugCheck2+0x574&lt;BR&gt;f8ae3940 8054b9c1 00000019 00000020 82fd27c8 nt!KeBugCheckEx+0x1b&lt;BR&gt;f8ae3990 8054b339 82fd27d0 00000000 f8ae39c0 nt!ExFreePoolWithTag+0x2be&lt;BR&gt;f8ae39a0 f894a743 82fd27d0 0000001b 82fd27d0 nt!ExFreePool+0xf&lt;BR&gt;f8ae39c0 f894c01f f894d860 82fe72b0 82e8b2e8 Wolf!WolfEventMessageA+0xa3&lt;BR&gt;...&lt;BR&gt;00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16&lt;/P&gt;
&lt;P&gt;kd&amp;gt; !pool 82fd27c8 2&lt;BR&gt;Pool page 82fd27c8 region is Nonpaged pool&lt;BR&gt;*82fd27c8 size:&amp;nbsp;&amp;nbsp; 28 previous size:&amp;nbsp;&amp;nbsp; 40&amp;nbsp; (Allocated) *None&lt;BR&gt;&amp;nbsp;&amp;nbsp;Pooltag None : call to ExAllocatePool&lt;BR&gt;82fd27f0 is not a valid small pool allocation, checking large pool...&lt;/P&gt;
&lt;P&gt;kd&amp;gt; dc 82fd27c8&lt;BR&gt;82fd27c8&amp;nbsp; 0a050008 656e6f4e 006f0057 0066006c&amp;nbsp; ....NoneW.o.l.f.&lt;BR&gt;82fd27d8&amp;nbsp; 00730020 00610074 00740072 00640065&amp;nbsp;&amp;nbsp; .s.t.a.r.t.e.d.&lt;BR&gt;82fd27e8&amp;nbsp; 00740020 0020006f 00640061 00200064&amp;nbsp;&amp;nbsp; .t.o. .a.d.d. .&lt;/P&gt;
&lt;P&gt;kd&amp;gt; dc 82fd27f0&lt;BR&gt;82fd27f0&amp;nbsp; 00640061 00200064 00650064 00690076&amp;nbsp; a.d.d. .d.e.v.i.&lt;BR&gt;82fd2800&amp;nbsp; 00650063 00000000 00000000 00000000&amp;nbsp; c.e.............&lt;/P&gt;
&lt;P&gt;Pool buffer overrun&lt;/P&gt;
&lt;P&gt;kd&amp;gt; dt nt!_POOL_HEADER 82fd27c8&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x000 PreviousSize&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0y000001000 (0x8)&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x000 PoolIndex&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0y0000000 (0)&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x002 BlockSize&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0y000000101 (0x5)&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x002 PoolType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0y0000101 (0x5)&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x000 Ulong1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0xa050008&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x004 ProcessBilled&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x656e6f4e _EPROCESS&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x004 PoolTag&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x656e6f4e&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x004 AllocatorBackTraceIndex : 0x6f4e&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x006 PoolTagHash&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x656e&lt;/P&gt;
&lt;P&gt;kd&amp;gt; dt nt!_POOL_HEADER 82fd27f0&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x000 PreviousSize&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0y001100001 (0x61)&amp;nbsp;=&amp;gt; It should be 0x5&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x000 PoolIndex&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0y0000000 (0)&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x002 BlockSize&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0y001100100 (0x64)&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x002 PoolType&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0y0000000 (0)&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x000 Ulong1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x640061&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x004 ProcessBilled&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x00200064 _EPROCESS&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x004 PoolTag&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x200064&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x004 AllocatorBackTraceIndex : 0x64&lt;BR&gt;&amp;nbsp;&amp;nbsp; +0x006 PoolTagHash&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x20&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;대부분의 경우, pool buffer overrun이 발생한&amp;nbsp;pool block을&amp;nbsp;사용한 드라이버가&amp;nbsp;문제를 일으킨 것으로 판단할 수 있습니다.&amp;nbsp;따라서 위&amp;nbsp;crash에서는 Wolf 드라이버가 pool buffer overrun을 유발시켰다고&amp;nbsp;결론을 내릴 수 있습니다.&amp;nbsp;좀 더 정확하게 pool block이 손상된 바로 그 시점을 잡아내기 위해서는 special pool 기능을 이용할 수 있습니다. 디버깅을 위하여 Special pool 을 활성화시키는 방법은&amp;nbsp;아래 KB 문서에 자세히 설명되어 있습니다.&lt;/P&gt;
&lt;P&gt;How to use the special pool feature to isolate pool damage (&lt;A href="http://support.microsoft.com/?id=188831"&gt;http://support.microsoft.com/?id=188831&lt;/A&gt;)&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.technet.com/aggbug.aspx?PostID=3253816" width="1" height="1"&gt;</description><category domain="http://blogs.technet.com/escape/archive/tags/Debugging/default.aspx">Debugging</category></item></channel></rss>