如何在内核debugging会话中计算出使用WinDBG等待的事件

我是一个完整的WinDbg新手,我一直在试图debugging一个客户寄给我的软件和一些第三方软件阻止Windows注销的WindowsXP问题。 我已经重现了这个问题,并且已经validation了,只有当我们的软件和客户软件都被安装(尽pipe不一定在注销时运行),注销问题才会发生。 我发现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) 

这waitForMultipleObjects看起来很有趣,因为我想知道如果csrss.exe正在等待一些事件,而不是允许注销。 任何人都可以告诉我,我可能会发现什么事件等待我可能做什么来进一步调查问题?

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

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

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

我也会注意到你不能总是信任栈上的参数。 请参阅http://analyze-v.com/?p=7

斯科特

首先,尝试!object 82475218 ,看看是否告诉你该对象是什么。

如果没有帮助,试试这个:

http://blogs.msdn.com/search/SearchResults.aspx?q=KeWaitForMultipleObjects

它是在NT调试博客上搜索KeWaitForMultipleObjects的,这是一个了解Windows内部知识的好博客。

编辑:

以下是KeWaitForMultipleObjects的文档:

http://msdn.microsoft.com/en-us/library/ff553324.aspx干杯。 雅。