troushoo

強制終了できないプロセスの原因を、ダンプ / カーネルデバッグで調査

強制終了できないプロセスの原因調査の方法を紹介します。

強制終了できないプロセスとは
タスクマネージャーを起動し、プロセスを強制終了させようとすると「アクセスが拒否されました。」と表示されます。




強制終了できないプロセスの原因調査の方法
1. プロセスが強制終了できない状態でダンプをとるか、カーネルデバッガーをアタッチします。

2. 強制終了できないプロセスの状態を確認します。
すると、IRP 発行済みの状態であることがわかります。(黄色の部分です)

2: kd> !process 0 1f notmyfault.exe
PROCESS ffffe001a984e900
    SessionId: 1  Cid: 0294    Peb: 7ff6bb9ef000  ParentCid: 0634
    DirBase: 122bbb000  ObjectTable: ffffc001f52a3680  HandleCount: <Data Not Accessible>
    Image: NotMyfault.exe
    VadRoot ffffe001aa9d99b0 Vads 68 Clone 0 Private 318. Modified 320. Locked 0.
    DeviceMap ffffc001f4651cb0
    Token                             ffffc001f4e00060
    ElapsedTime                       00:00:27.774
    UserTime                          00:00:00.000
    KernelTime                        00:00:00.000
    QuotaPoolUsage[PagedPool]         156672
    QuotaPoolUsage[NonPagedPool]      8800
    Working Set Sizes (now,min,max)  (1803, 50, 345) (7212KB, 200KB, 1380KB)
    PeakWorkingSetSize                2607
    VirtualSize                       79 Mb
    PeakVirtualSize                   125 Mb
    PageFaultCount                    2942
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      367

        THREAD ffffe001aab50240  Cid 0294.08c8  Teb: 00007ff6bb9eb000 Win32Thread: 0000000000000000 WAIT: (UserRequest) UserMode Non-Alertable
            fffff80154bca100  SynchronizationEvent
        IRP List:
            ffffe001a9d91d90: (0006,0118) Flags: 00060000  Mdl: 00000000
        Not impersonating
        DeviceMap                 ffffc001f4651cb0
        Owning Process            ffffe001a984e900       Image:         NotMyfault.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      33317          Ticks: 1498 (0:00:00:23.406)
        Context Switch Count      2              IdealProcessor: 3            
        UserTime                  00:00:00.000
        KernelTime                00:00:00.000
        Win32 Start Address msvcrt!_threadstart (0x00007ffce1167a60)
        Stack Init ffffd000cd609dd0 Current ffffd000cd6095c0
        Base ffffd000cd60a000 Limit ffffd000cd604000 Call 0
        Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
        Child-SP          RetAddr           Call Site
        ffffd000`cd609600 fffff803`2bf344ee nt!KiSwapContext+0x76
        ffffd000`cd609740 fffff803`2bf33f69 nt!KiSwapThread+0x14e
        ffffd000`cd6097e0 fffff803`2bee9563 nt!KiCommitThreadWait+0x129
        ffffd000`cd609860 fffff801`54bc86f2 nt!KeWaitForSingleObject+0x373
        ffffd000`cd6098f0 fffff803`2c235960 myfault!MyfaultDispatch+0x82
        ffffd000`cd609950 fffff803`2c3196b6 nt!IopSynchronousServiceTail+0x160
        ffffd000`cd609a20 fffff803`2c2ea572 nt!IopXxxControlFile+0xd86
        ffffd000`cd609b60 fffff803`2bfd5ab3 nt!NtDeviceIoControlFile+0x56
        ffffd000`cd609bd0 00007ffc`e395072a nt!KiSystemServiceCopyEnd+0x13 (TrapFrame @ ffffd000`cd609c40)
        00000000`0409fae8 00007ffc`e0ba6043 ntdll!NtDeviceIoControlFile+0xa
        00000000`0409faf0 00007ffc`e1881bb0 KERNELBASE!DeviceIoControl+0x121
        00000000`0409fb60 00007ff6`bba822f2 KERNEL32!DeviceIoControlImplementation+0x80
        00000000`0409fbb0 00007ffc`e1167aef NotMyfault!IoctlThreadProc+0x32
        00000000`0409fc00 00007ffc`e1167abd msvcrt!_callthreadstart+0x2b
        00000000`0409fc30 00007ffc`e18813d2 msvcrt!_threadstart+0x7c
        00000000`0409fc60 00007ffc`e38d54e4 KERNEL32!BaseThreadInitThunk+0x22
        00000000`0409fc90 00000000`00000000 ntdll!RtlUserThreadStart+0x34


3. 発行済みのIRP を見てみます。
すると、myfault.sys がIRP を所持していることがわかります。(緑色の部分です)
これが、プロセスが強制終了できない原因です。

2: kd> !irp ffffe001a9d91d90
Irp is active with 1 stacks 1 is current (= 0xffffe001a9d91e60)
No Mdl: No System Buffer: Thread ffffe001aab50240:  Irp stack trace. 
     cmd  flg cl Device   File     Completion-Context
>[IRP_MJ_DEVICE_CONTROL(e), N/A(0)]
            5  0 ffffe001a9770840 ffffe001aab16f20 00000000-00000000   
           \Driver\MYFAULT

            Args: 00000000 00000000 83360020 00000000

そのため、なぜ、myfault.sys がIRP を保持したままになっているかを、myfault.sys の開発元に問い合わせる必要があります。

補足
今回使用した、notmyfault.exe やmyfault.sys は、Microsoft が公開しているドライバーのバグを紹介するためのツール NotMyFault です。
今回は、notmyfault.exe の「Hang with IRP」を実行した結果です。


NotMyFault はソースコードも公開されていたので、ソースコードを見てみます。
(最新版の NotMyFault は、ソースコードは公開されておりませんでしたが、以前はダウンロードした NotMyFault の中にソースも含まれておりました。)
結果、KeWaitForSingleObject で、イベントを待ち続けていることがわかりました。
VOID
HangIrp(
    VOID
    )
{
    //
    // This can't be on the stack because the stack is pageable
    // when the thread performs a user-mode wait
    //
    static KEVENT event;
 
    KeInitializeEvent( &event, SynchronizationEvent, FALSE );
    KeWaitForSingleObject( &event, UserRequest, UserMode, FALSE, NULL );
}


情報元
Unkillable Processes (英語)

関連記事
ブート時ハングのダンプ解析
  1. 2016/07/18(月) 22:59:54|
  2. WinDbg
  3. | トラックバック:0
  4. | コメント:0
<<一般公開されたWinDBG のデバッガーエクステンション MEX | ホーム | パケットキャプチャーから、通信相手のOS の種類を判断する方法>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/298-8e277cdd
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (22)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する