オンサイトセミナー
豊田孝の「IT談話館」 Windowsメモリフォレンジックを依頼する WinDbg




本「IT談話館」はDKOMベースの高度なメモリフォレンジックサービスを提供しています!



Windows 8/10、割り込み、DPC


 本稿では、Windows 8.1環境で採取されたカーネルメモリダンプを本「IT談話館」の独自解析コードで解析し、割り込みとDPCを調査しています。Windows 8.1環境で採取されたカーネルメモリダンプをWinDbgにロードし、「!thread」コマンドを実行しますと、たとえば、次のような情報が返され、システムクラッシュ当時割り込みが発生していたことが分かります。
2: kd> !thread
THREAD ffffe00149748880  Cid 1140.173c  Teb: 00000000fe5ba000 Win32Thread: fffff901438da2b0 RUNNING on processor 2
IRP List:
    ffffe0014708b4b0: (0006,0118) Flags: 00060000  Mdl: 00000000
Not impersonating
DeviceMap                 ffffc00190fc6450
Owning Process            ffffe00143a4c080       Image:         chrome.exe
Attached Process          N/A            Image:         N/A
Wait Start TickCount      3143176        Ticks: 1281 (0:00:00:20.015)
Context Switch Count      3141798        IdealProcessor: 0             
UserTime                  00:03:02.015
KernelTime                00:00:51.890
Win32 Start Address 0x0000000000e783f8
Stack Init ffffd0002235ac90 Current ffffd00022359fc0
Base ffffd0002235b000 Limit ffffd00022355000 Call 0
Priority 12 BasePriority 8 UnusualBoost 0 ForegroundBoost 2 IoPriority 2 PagePriority 5
Child-SP          RetAddr           : Args to Child                                                           : Call Site
ffffd001`30d8dc98 fffff801`68808cc2 : 00000000`00000133 00000000`00000000 00000000`00000501 00000000`00000500 : nt!KeBugCheckEx
ffffd001`30d8dca0 fffff801`686ee808 : 00000000`00000000 00000000`00000000 00000000`00000001 00000000`00000000 : nt! ?? ::FNODOBFM::`string'+0x18b12
ffffd001`30d8dd30 fffff801`6862467f : 00000000`000000ff fffff801`68779ae6 ffffe001`42c003b0 fffff801`6868c000 : nt!KeClockInterruptNotify+0x788
ffffd001`30d8df40 fffff801`687650e3 : ffffe001`42c00300 ffffd001`30d79b50 ffff06bf`d1d1ea46 fffff801`687e1105 : hal!HalpTimerClockInterrupt+0x4f
ffffd001`30d8df70 fffff801`687e112a : ffffe001`42c00300 ffffe001`43c91cd0 00000000`0000005f ffffe001`43c91d78 : nt!KiCallInterruptServiceRoutine+0xa3
ffffd001`30d8dfb0 fffff801`687e150f : 00000000`00000000 00000000`000000ff 00000000`0000005f ffffe001`489155b0 : nt!KiInterruptSubDispatchNoLockNoEtw+0xea (TrapFrame @ ffffd001`30d8de70)
ffffd001`30d86b30 fffff800`5236fcb3 : ffffd001`30d86e02 ffffe001`48921010 ffffe001`43493708 00000000`00000008 : nt!KiInterruptDispatchLBControl+0x11f (TrapFrame @ ffffd001`30d86b30)
ffffd001`30d86cc0 fffff801`686ce760 : ffffd001`30d86e50 00000000`02ed643d ffffd001`30d86e00 00000000`00000f45 : usb8023x!CancelSendsTimerDpc+0x5b
ffffd001`30d86d00 fffff801`687e2dd5 : 00000000`00000000 ffffd001`30d50180 ffffe001`42c00300 00000000`00000007 : nt!KiRetireDpcList+0x4f0
ffffd001`30d86fb0 fffff801`687e2bd9 : 00000000`00000000 00000000`00000010 00000000`009dfdb0 00000000`77640000 : nt!KxRetireDpcList+0x5 (TrapFrame @ ffffd001`30d86e70)
ffffd000`2235aac0 fffff801`687e4e45 : ffffe001`49748880 fffff801`687e1587 00000000`00000000 00000000`00000010 : nt!KiDispatchInterruptContinue
ffffd000`2235aaf0 fffff801`687e1587 : 00000000`00000000 00000000`00000010 fffff901`44ab6c50 ffffd000`00000000 : nt!KiDpcInterruptBypass+0x25
ffffd000`2235ab00 00000000`7663c6ff : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiInterruptDispatchLBControl+0x197 (TrapFrame @ ffffd000`2235ab00)
00000000`00addd60 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : 0x7663c6ff
 このカーネルメモリダンプを本「IT談話館」の独自解析コードで解析しますと、次のような結果が返されてきます。
0xffffe00143a4c080	ActiveThreads->041	chrome.exe
	Thread->0xffffe00143a8c080	Core->2	IsrDpcStats->0xffffe00142c003b0
		KInterrupt->0xffffe00142c00300	Service->hal!HalpTimerClockInterrupt (fffff801`68624630)
		+Interrupt_TrapFrame->0xffffd00130d86b30	Rip->usb8023x!CancelSendsTimerDpc+0x5b (fffff800`5236fcb3)
	Thread->0xffffe001495fa300	Core->2	IsrDpcStats->0xffffe00142c003b0
		KInterrupt->0xffffe00142c00300	Service->hal!HalpTimerClockInterrupt (fffff801`68624630)
		+Interrupt_TrapFrame->0xffffd00130d86b30	Rip->usb8023x!CancelSendsTimerDpc+0x5b (fffff800`5236fcb3)
	Thread->0xffffe00149738380	Core->2	IsrDpcStats->0xffffe00142c003b0
		KInterrupt->0xffffe00142c00300	Service->hal!HalpTimerClockInterrupt (fffff801`68624630)
		+Interrupt_TrapFrame->0xffffd00130d86b30	Rip->usb8023x!CancelSendsTimerDpc+0x5b (fffff800`5236fcb3)
	Thread->0xffffe0014babc080	Core->2	IsrDpcStats->0xffffe00142c003b0
		KInterrupt->0xffffe00142c00300	Service->hal!HalpTimerClockInterrupt (fffff801`68624630)
		+Interrupt_TrapFrame->0xffffd00130d86b30	Rip->usb8023x!CancelSendsTimerDpc+0x5b (fffff800`5236fcb3)
	Thread->0xffffe0014c7be700	Core->2	IsrDpcStats->0xffffe00142c003b0
		KInterrupt->0xffffe00142c00300	Service->hal!HalpTimerClockInterrupt (fffff801`68624630)
		+Interrupt_TrapFrame->0xffffd00130d86b30	Rip->usb8023x!CancelSendsTimerDpc+0x5b (fffff800`5236fcb3)
	Thread->0xffffe0014d4b1880	Core->2	IsrDpcStats->0xffffe00142c003b0
		KInterrupt->0xffffe00142c00300	Service->hal!HalpTimerClockInterrupt (fffff801`68624630)
		+Interrupt_TrapFrame->0xffffd00130d86b30	Rip->usb8023x!CancelSendsTimerDpc+0x5b (fffff800`5236fcb3)
	Thread->0xffffe00143fba080	Core->2	IsrDpcStats->0xffffe00142c003b0
		KInterrupt->0xffffe00142c00300	Service->hal!HalpTimerClockInterrupt (fffff801`68624630)
		+Interrupt_TrapFrame->0xffffd00130d86b30	Rip->usb8023x!CancelSendsTimerDpc+0x5b (fffff800`5236fcb3)
 この実行結果は、コアー2上で割り込みが発生し、DPCルーチン内で何らかの問題が発生したことを示しています。この結果にはプロセスオブジェクト、スレッドオブジェクト、割り込みオブジェクト、および、トラップフレームなどがすでに含まれていますから、本格的な解析作業を行う準備は完了しています。初歩的な情報を収集するだけでしたら、次のようなWindows 10対応WinDbgコマンドを使用することもできます。
2: kd> !dpcwatchdog

All durations are in seconds (1 System tick = 15.625000 milliseconds)

Circular Kernel Context Logger history: !logdump 0x2
DPC and ISR stats: !intstats /d

--------------------------------------------------
CPU#0
--------------------------------------------------
Current DPC: Wdf01000!FxInterrupt::_InterruptDpcThunk (Normal DPC)
Debugger Saved IRQL: 0
Cumulative DPC Time Limit: 120.000 seconds
Current Cumulative DPC Time: 19.531 seconds
Single DPC Time Limit: 20.000 seconds
Current Single DPC Time: 19.109 seconds
dt nt!_ISRDPCSTATS ffffd001311700b0
IsrActive: FALSE

Pending DPCs:
----------------------------------------
CPU Type      KDPC       Function

dpcs: no pending DPCs found

--------------------------------------------------
CPU#1
--------------------------------------------------
Current DPC: No Active DPC

Pending DPCs:
----------------------------------------
CPU Type      KDPC       Function
 1: Normal  : 0xffffd00130bd9c28 0xfffff80168791028 nt!KiEntropyDpcRoutine


--------------------------------------------------
CPU#2
--------------------------------------------------
Current DPC: usb8023x!CancelSendsTimerDpc (Normal DPC)
Debugger Saved IRQL: 13
Cumulative DPC Time Limit: 120.000 seconds
Current Cumulative DPC Time: 20.203 seconds
Single DPC Time Limit: 20.000 seconds
Current Single DPC Time: 20.016 seconds
dt nt!_ISRDPCSTATS ffffe00142c003b0
IsrActive: TRUE

Pending DPCs:
----------------------------------------
CPU Type      KDPC       Function
 2: Normal  : 0xfffff8016895dae0 0xfffff8016878a190 nt!KiBalanceSetManagerDeferredRoutine


--------------------------------------------------
CPU#3
--------------------------------------------------
Current DPC: No Active DPC

Pending DPCs:
----------------------------------------
CPU Type      KDPC       Function

dpcs: no pending DPCs found
 今回使用した独自解析コードは、無修正でWindows 10のカーネルメモリダンプやActive Memory Dumpの解析に適応できますが、Windows 7環境で採取されたカーネルメモリダンプの解析には適応できません。Windows 7からWindows 8.1へのバージョンアップの過程でカーネルレベルでの変更が加えられ、たとえば、「!dpcwatchdog」コマンドをWindows 7環境で採取されたカーネルメモリダンプに適応いたしますと、次のようなエラーが返されてきます。
Current DPC: Unable to read nt!_KDPC_DATA.ActiveDpc
 Windows XPからWindows 8.1までの割り込みメカニズムに関しましては、本「IT談話館」の「オンサイトセミナー教材」で詳しく解説しています。また、Windows 10の割り込みメカニズムは、本館「別稿」で取り上げています。



本「IT談話館」はDKOMベースの高度なメモリフォレンジックサービスを提供しています!



 今回使用した独自解析コードは、「Windows内部解析者のツールボックス」に収録してございます。


サービスメニュー
Windowsクラッシュダンプ解析サービス 技術資料 WinDbg

Copyright©豊田孝 2004- 2017
本日は2017-10-21です。