如何调试是否设置了 Windows 事件对象

How to debug if windows event object is set or not?

本文关键字:设置 Windows 事件 对象 是否 何调试 调试      更新时间:2023-10-16

使用 Visual Studio 调试器时,我有一个 HANDLE 到 Windows 事件同步对象的值。是否可以判断(理想情况下设置一个监视(以显示事件是否已设置?

使用 Visual Studio 调试器无法做到这一点。另一方面,WinDbg 提供了 !handle 扩展命令。传递 UMFlags 0xf会显示大量信息,包括事件对象是否发出信号。虽然可以从Visual Studio使用WinDbg,但我发现这样做有点乏味。

另一个值得考虑的选项是在ntdll.dll!NtSetEvent上设置断点(调试 -> 新断点 -> 函数中断...添加条件(右键单击断点 ->条件...( 只有当参数是您感兴趣的特定<handle value>时,@rax == <handle value>才会中断。这适用于 64 位版本。对于 32 位构建,条件将是 *((unsigned int*)(@esp+4)) == <handle value>

如上所述设置断点

有一个可能很重要的限制:仅当从用户模式代码设置事件对象时,断点才会被命中。如果在为用户模式请求提供服务时事件对象从内核模式发出信号,则不会命中驻留在用户 land 中的断点。

可能跑题了;如果你有内核调试器连接到目标,你可以检查事件的DISPATCHER_HEADER::SignalState。 非零可能意味着发出信号。为什么只有可能?因为它没有记录在案。