如何在内核调试会话中确定WinDBG正在等待的事件

Ben*_*enj 3 windows winapi kernel windbg

我是一个完整的WinDbg新手,我一直在尝试调试客户发给我的WindowsXP问题我们的软件和一些第三方软件阻止Windows注销.我已经重现了这个问题并且已经验证只有当我们的软件和客户软件都安装时(虽然不一定在注销时运行)才会出现注销问题.我观察到当用户尝试注销时WM_ENDSESSION消息没有到达正在运行的窗口,我知道第三方软件使用内核驱动程序.

我一直在看WinDbg中的进程,我知道csrss.exe通常会向所有窗口发送WM_ENDSESSION消息.我跑的时候:

!过程82356020 6

要查看csrss.exe的堆栈,我可以看到:

WARNING: Frame IP not in any known module. Following frames may be wrong.
        00000000 00000000 00000000 00000000 00000000 0x7c90e514

        THREAD 8246d998  Cid 0248.02a0  Teb: 7ffd7000 Win32Thread: e1627008 WAIT: (WrUserRequest) UserMode Non-Alertable
            8243d9f0  SynchronizationEvent
            81fe0390  SynchronizationEvent
        Not impersonating
        DeviceMap                 e1004450
        Owning Process            82356020       Image:         csrss.exe
        Attached Process          N/A            Image:         N/A
        Wait Start TickCount      1813           Ticks: 20748 (0:00:05:24.187)
        Context Switch Count      3                 LargeStack
        UserTime                  00:00:00.000
        KernelTime                00:00:00.000
        Start Address 0x75b67cdf
        Stack Init f80bd000 Current f80bc9c8 Base f80bd000 Limit f80ba000 Call 0
        Priority 14 BasePriority 13 PriorityDecrement 0 DecrementCount 0
        Kernel stack not resident.
        ChildEBP RetAddr  Args to Child              
        f80bc9e0 80500ce6 00000000 8246d998 804f9af2 nt!KiSwapContext+0x2e (FPO: [Uses EBP] [0,0,4])
        f80bc9ec 804f9af2 804f986e e1627008 00000000 nt!KiSwapThread+0x46 (FPO: [0,0,0])
        f80bca24 bf80a4a3 00000002 82475218 00000001 nt!KeWaitForMultipleObjects+0x284 (FPO: [Non-Fpo])
        f80bca5c bf88c0a6 00000001 82475218 00000000 win32k!xxxMsgWaitForMultipleObjects+0xb0 (FPO: [Non-Fpo])
        f80bcd30 bf87507d bf9ac0a0 00000001 f80bcd54 win32k!xxxDesktopThread+0x339 (FPO: [Non-Fpo])
        f80bcd40 bf8010fd bf9ac0a0 f80bcd64 00bcfff4 win32k!xxxCreateSystemThreads+0x6a (FPO: [Non-Fpo])
        f80bcd54 8053d648 00000000 00000022 00000000 win32k!NtUserCallOneParam+0x23 (FPO: [Non-Fpo])
        f80bcd54 7c90e514 00000000 00000022 00000000 nt!KiFastCallEntry+0xf8 (FPO: [0,0] TrapFrame @ f80bcd64)
Run Code Online (Sandbox Code Playgroud)

这个waitForMultipleObjects看起来很有趣,因为我想知道csrss.exe是否正在等待某些未到达的事件以允许注销.任何人都可以告诉我,我怎么会发现它正在等待我可能做的其他事情以进一步调查问题?

sno*_*one 7

正在等待的对象就在输出中:

    THREAD 8246d998  Cid 0248.02a0  Teb: 7ffd7000 Win32Thread: e1627008 WAIT: (WrUserRequest) UserMode Non-Alertable  
        8243d9f0  SynchronizationEvent  
        81fe0390  SynchronizationEvent  
Run Code Online (Sandbox Code Playgroud)

我会注意到,你所看到的线程是一个共同的线程,几乎每个你看到的系统都会有它(不确定那个线程究竟是什么,但我认识到堆栈...有时候我觉得就像我一直这样做太久了!).

我还要注意,你不能一直信任堆栈中的参数.请在此处查看一些详细信息:http://analyze-v.com/?p = 7

斯科特