【PDC_WATCHDOG_TIMEOUT】BSODダンプ解析してみた

ストレージ整理してたら古いダンプがあったので開いてみました。

#ダンプ情報
Surface
Windows 10x64 1703
「スリープに入る直前にBSODになった」

# エラー内容
PDC_WATCHDOG_TIMEOUTはスリープやスタンバイ状態になる際、pdc(Power Dependency Coordinator Driver)の処理が
一定時間内に終わらない場合に発生するようです。

参考
http://www.surfaceforums.net/threads/bsod-pdc_watchdog_timeout.19893/
http://bsodanalysis.blogspot.jp/2014/08/pdcwatchdogtimeout-14f-debugging.html

#解析開始

pdcの処理について確認します。
すべてのカーネルスレッドの中で「pdc」(pdc.sysの処理)を検索すると以下のスレッドがヒットしました。

```
fffffe8b`06dd1f60 fffff800`e1f23ef0 : nt!KiSwapContext+0x76
fffffe8b`06dd20a0 fffff800`e1f2386e : nt!KiSwapThread+0x190
fffffe8b`06dd2160 fffff800`e1f23049 : nt!KiCommitThreadWait+0x10e
fffffe8b`06dd2200 fffff800`e1f5cbd6 : nt!KeWaitForSingleObject+0x1c9
fffffe8b`06dd22e0 fffff800`e1f5e867 : nt!ExpAcquireFastMutexContended+0x96
fffffe8b`06dd2320 fffff805`f469ce4d : nt!ExAcquireFastMutexUnsafe+0x127
fffffe8b`06dd2370 fffff805`f46a1eb5 : dam!DampPdcResiliencyCallback+0xbd
fffffe8b`06dd2420 fffff805`f2dc71f9 : dam!PdcpResiliencyClientCallback+0xd5
fffffe8b`06dd2750 fffff800`e1ea2145 : pdc!PdcPortMessageWorkerThread+0xe9
fffffe8b`06dd2a80 fffff800`e1f986e7 : nt!ExpWorkerThread+0xf5
fffffe8b`06dd2b10 fffff800`e1ffe036 : nt!PspSystemThreadStartup+0x47
fffffe8b`06dd2b60 00000000`00000000 : nt!KiStartSystemThread+0x16
```

上記から`pdc`の処理は`dam.sys`の処理を待っているように見受けられ、`dam`はMutexの待機をしています。
`dam`について検索すると以下のスレッドがヒットしました。

```
fffffe8b`095ae4f0 fffff800`e1f23ef0 : nt!KiSwapContext+0x76
fffffe8b`095ae630 fffff800`e1f2386e : nt!KiSwapThread+0x190
fffffe8b`095ae6f0 fffff800`e1f23049 : nt!KiCommitThreadWait+0x10e
fffffe8b`095ae790 fffff800`e1f20c9e : nt!KeWaitForSingleObject+0x1c9
fffffe8b`095ae870 fffff800`e2352c46 : nt!AlpcpSignalAndWait+0x5e
fffffe8b`095ae8b0 fffff800`e235295c : nt!AlpcpReceiveSynchronousReply+0x56
fffffe8b`095ae910 fffff800`e23e3a5e : nt!AlpcpProcessSynchronousRequest+0x34c
fffffe8b`095aea30 fffff800`e23e39ae : nt!LpcpRequestWaitReplyPort+0x86
fffffe8b`095aea90 fffff800`e2009403 : nt!NtRequestWaitReplyPort+0x6e
fffffe8b`095aead0 fffff800`e1ffa2a0 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffffe8b`095aead0)
fffffe8b`095aec68 fffff805`f4499f5d : nt!KiServiceLinkage
fffffe8b`095aec70 fffff805`f449ab31 : tmcomm!KmSetCommPortAPIs+0x795
fffffe8b`095af1a0 fffff805`f449978a : tmcomm!InitKmLPC+0x23d
fffffe8b`095af220 fffff800`f7c7b29b : tmcomm!KmCallUmEx+0x26
fffffe8b`095af250 fffff800`f7c7db58 : tmactmon+0xb29b
fffffe8b`095af2f0 fffff800`f7c7d949 : tmactmon+0xdb58
fffffe8b`095af360 fffff800`f7c5170e : tmactmon+0xd949
fffffe8b`095af3d0 fffff800`f7c5aa91 : tmevtmgr+0x170e
fffffe8b`095af420 fffff800`e2317c07 : tmevtmgr!TMEvtCommunicateRoutine+0x205d
fffffe8b`095af4e0 fffff800`e238a76e : nt!CmpCallCallBacksEx+0x207
fffffe8b`095af600 fffff800`e2009403 : nt!NtSetValueKey+0x51e
fffffe8b`095af7c0 fffff800`e1ffa2a0 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffffe8b`095af830)
fffffe8b`095af9c8 fffff805`f469ffbb : nt!KiServiceLinkage
fffffe8b`095af9d0 fffff800`e1f8de27 : dam!DampRegEventWorkItemRoutine+0x13b
fffffe8b`095afa10 fffff800`e1ea2145 : nt!IopProcessWorkItem+0x87
fffffe8b`095afa80 fffff800`e1f986e7 : nt!ExpWorkerThread+0xf5
fffffe8b`095afb10 fffff800`e1ffe036 : nt!PspSystemThreadStartup+0x47
fffffe8b`095afb60 00000000`00000000 : nt!KiStartSystemThread+0x16
```

```
fffffe8b`0b71dfe0 fffff800`e1f23ef0 : nt!KiSwapContext+0x76
fffffe8b`0b71e120 fffff800`e1f2386e : nt!KiSwapThread+0x190
fffffe8b`0b71e1e0 fffff800`e1f23049 : nt!KiCommitThreadWait+0x10e
fffffe8b`0b71e280 fffff800`e0675f34 : nt!KeWaitForSingleObject+0x1c9
fffffe8b`0b71e360 fffff800`e0670e6f : dxgmms2!VIDMM_GLOBAL::WaitForFences+0x264
fffffe8b`0b71e470 fffff800`e0670f9c : dxgmms2!VIDMM_GLOBAL::QueueSystemCommandAndWaitInternal+0x183
fffffe8b`0b71e530 fffff800`e066166c : dxgmms2!VIDMM_GLOBAL::QueueSystemCommandAndWait+0x4c
fffffe8b`0b71e570 fffff800`e0623fa9 : dxgmms2!VIDMM_DEVICE::SuspendResume+0x50
fffffe8b`0b71e600 fffff805`f40d250b : dxgmms2!VidMmSuspendResumeDevice+0x9
fffffe8b`0b71e630 fffff805`f40af583 : dxgkrnl!DXGDEVICE::NotifyProcessThaw+0x113
fffffe8b`0b71e690 fffff805`f40892a1 : dxgkrnl!DXGPROCESS::NotifyProcessThaw+0xf7
fffffe8b`0b71e6f0 ffff811b`2503f2ab : dxgkrnl!DxgkNotifyProcessThawCallout+0x61
fffffe8b`0b71e780 ffff811b`2525103a : win32kbase!W32CalloutDispatch+0x53b
fffffe8b`0b71e7e0 fffff800`e23233cd : win32k!W32CalloutDispatchThunk+0xa
fffffe8b`0b71e810 fffff800`e23d1cb1 : nt!PsInvokeWin32Callout+0x7d
fffffe8b`0b71e840 fffff800`e23a0b33 : nt!PsThawProcess+0x169
fffffe8b`0b71e8a0 fffff800`e1f63f0a : nt!PspChangeProcessExecutionState+0x1e3
fffffe8b`0b71e960 fffff800`e239f628 : nt!PspExecuteJobFreezeThawCallback+0x5a
fffffe8b`0b71e9b0 fffff800`e239f4e2 : nt!PspCallJobHierarchyCallbacks+0xe8
fffffe8b`0b71ea00 fffff800`e23a2923 : nt!PspEnumJobsAndProcessesInJobHierarchy+0x1e2
fffffe8b`0b71ea80 fffff800`e239c688 : nt!PspFreezeJobTree+0x137
fffffe8b`0b71eb60 fffff800`e2009403 : nt!NtSetInformationJobObject+0x6f8
fffffe8b`0b71f720 fffff800`e1ffa2a0 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffffe8b`0b71f720)
fffffe8b`0b71f8b8 fffff805`f469a9b9 : nt!KiServiceLinkage
fffffe8b`0b71f8c0 fffff805`f469b2c0 : dam!DampFreezeSession0Job+0xc9
fffffe8b`0b71f960 fffff800`e1f8de27 : dam!DampS0WorkItemRoutine+0x150
fffffe8b`0b71fa10 fffff800`e1ea2145 : nt!IopProcessWorkItem+0x87
fffffe8b`0b71fa80 fffff800`e1f986e7 : nt!ExpWorkerThread+0xf5
fffffe8b`0b71fb10 fffff800`e1ffe036 : nt!PspSystemThreadStartup+0x47
fffffe8b`0b71fb60 00000000`00000000 : nt!KiStartSystemThread+0x16
```

前者については、`tmactmon`が処理を行っており、何らかのイベント待ちとなっています。

このスレッドについては「**トレンドマイクロ(ウィルスバスター)の処理が終わらないから悪い**」という結論とします。

後者のスレッドについては`dxgmms2`がイベントの待機を行っています(雰囲気的な話ですが、スタックに表示されている関数名からスリープ状態に入る際に行われる処理と推測されます）。

`dxgmms2`について検索します。

```
fffffe8b`06bf5f10 fffff800`e1f23ef0 : nt!KiSwapContext+0x76
fffffe8b`06bf6050 fffff800`e1f2386e : nt!KiSwapThread+0x190
fffffe8b`06bf6110 fffff800`e1f23049 : nt!KiCommitThreadWait+0x10e
fffffe8b`06bf61b0 fffff800`e1f20c9e : nt!KeWaitForSingleObject+0x1c9
fffffe8b`06bf6290 fffff800`e2352c46 : nt!AlpcpSignalAndWait+0x5e
fffffe8b`06bf62d0 fffff800`e235295c : nt!AlpcpReceiveSynchronousReply+0x56
fffffe8b`06bf6330 fffff800`e23e3a5e : nt!AlpcpProcessSynchronousRequest+0x34c
fffffe8b`06bf6450 fffff800`e23e39ae : nt!LpcpRequestWaitReplyPort+0x86
fffffe8b`06bf64b0 fffff800`e2009403 : nt!NtRequestWaitReplyPort+0x6e
fffffe8b`06bf64f0 fffff800`e1ffa2a0 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffffe8b`06bf64f0)
fffffe8b`06bf6688 fffff805`f4499f5d : nt!KiServiceLinkage
fffffe8b`06bf6690 fffff805`f449ab31 : tmcomm!KmSetCommPortAPIs+0x795
fffffe8b`06bf6bc0 fffff805`f449978a : tmcomm!InitKmLPC+0x23d
fffffe8b`06bf6c40 fffff800`f7c7b29b : tmcomm!KmCallUmEx+0x26
fffffe8b`06bf6c70 fffff800`f7c7b959 : tmactmon+0xb29b
fffffe8b`06bf6d10 fffff800`f7c7c256 : tmactmon+0xb959
fffffe8b`06bf6e50 fffff800`f7c7c0b6 : tmactmon+0xc256
fffffe8b`06bf6ed0 fffff800`f7c5a84f : tmactmon+0xc0b6
fffffe8b`06bf6f00 fffff800`f7c5a137 : tmevtmgr!TMEvtCommunicateRoutine+0x1e1b
fffffe8b`06bf6f30 fffff800`e231d26b : tmevtmgr!TMEvtCommunicateRoutine+0x1703
fffffe8b`06bf7000 fffff800`e230edd5 : nt!ObpCreateHandle+0xa5b
fffffe8b`06bf7260 fffff800`e23d99a4 : nt!PsOpenProcess+0x535
fffffe8b`06bf75a0 fffff800`e2009403 : nt!NtOpenProcess+0x24
fffffe8b`06bf75e0 fffff800`e1ffa2a0 : nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ fffffe8b`06bf75e0)
fffffe8b`06bf7778 fffff800`e0681b8f : nt!KiServiceLinkage
fffffe8b`06bf7780 fffff800`e066936b : dxgmms2!VIDMM_GLOBAL::SendWnfNotificationToProcess+0x7f
fffffe8b`06bf7810 fffff800`e066983f : dxgmms2!VIDMM_GLOBAL::SendTrimWnf+0x6b
fffffe8b`06bf7880 fffff800`e068715b : dxgmms2!VIDMM_GLOBAL::HandleTrimWnf+0x49f
fffffe8b`06bf7920 fffff800`e0686e39 : dxgmms2!VIDMM_WORKER_THREAD::Run+0x26b
fffffe8b`06bf7ae0 fffff800`e1f986e7 : dxgmms2!VidMmWorkerThreadProc+0x9
fffffe8b`06bf7b10 fffff800`e1ffe036 : nt!PspSystemThreadStartup+0x47
fffffe8b`06bf7b60 00000000`00000000 : nt!KiStartSystemThread+0x16
```

このスレッドがヒットし`tmactmon`が処理を行っており、何らかのイベント待ちとなっています。

予想としては、`dxgmms2!VIDMM_GLOBAL::WaitForFences+264`で待機しているイベントは、もう一方のスレッドでセットされるはずで、
これを待っているため、処理が終わらないのではないかと考えました。
しかし、アセンブラを確認しましたが両スレッドの関連があるとは断言できません。

#結論
ウイルスバスターがスリープを阻害しているために発生しているように見受けられますが、断言はできません。
ウイルスバスターと1703の組み合わせでBSODになったという報告がありました。
参考
[KB4049179を適用の際、ウイルスバスタークラウドを削除しなければブルースクリーンに](http://picico.net/computer/kb4049179/)

#あとがき
ダンプ解析の講座を行っていた際、後輩から「そのスタックの中で、なぜそこが怪しいと着目したんですか？」と言われて
「ほら、周りのスタックと全然雰囲気が違うじゃん」とひどい回答をしてしまいました。
もっと精進します。

今回の解析ではwindbgを使用しています。
使用した各種コマンドはまた別記事でまとめたいと思います。