我一直在使用我在以下帖子中找到的代码:
How to get thread state (e.g. suspended), memory + CPU usage, start time, priority, etc
我正在检查线程状态,并且下面的枚举描述了线程等待的原因'状态 -
enum KWAIT_REASON
{
Executive,
FreePage,
PageIn,
PoolAllocation,
DelayExecution,
Suspended,
UserRequest,
WrExecutive,
WrFreePage,
WrPageIn,
WrPoolAllocation,
WrDelayExecution,
WrSuspended,
WrUserRequest,
WrEventPair,
WrQueue,
WrLpcReceive,
WrLpcReply,
WrVirtualMemory,
WrPageOut,
WrRendezvous,
Spare2,
Spare3,
Spare4,
Spare5,
Spare6,
WrKernel,
MaximumWaitReason
};
任何人都可以解释WrQueue
是什么,以及WrUserRequest
和UserRequest
之间的区别是什么?
使用NtQuerySystemInformation()
SystemProcessInformation
获取信息。
答案 0 :(得分:5)
WrQueue
这是线程在内核中等待KQUEUE
对象(在wdm.h
中查找它)的时候。这可以调用ZwRemoveIoCompletion
或Win32 shell GetQueuedCompletionStatus
( IOCP 正好是KQUEUE
个对象)。或者线程(从vista开始)调用ZwWaitForWorkViaWorkerFactory
(worker factory在内部使用KQUEUE
。也可能在内核调用KeRemoveQueue
中的线程 - 这通常是系统工作线程。
WrUserRequest
。通常这是线程调用GetMessage
时。因此,如果我们查看WrUserRequest
,我们可以确定线程正在等待窗口消息。
UserRequest
- 这意味着线程通过WaitForSingleObject[Ex]
或WaitForMultipleObjects[Ex]
或MsgWaitForMultipleObjects[Ex]
(或等价物)等待某些对象