首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WaitForDebugEvent[Ex]如何报告超时?

WaitForDebugEvent[Ex]如何报告超时?
EN

Stack Overflow用户
提问于 2021-01-05 09:30:10
回答 1查看 185关注 0票数 2

WaitForDebugEventWaitForDebugEventEx API允许调用方指定超时。函数在调试事件发生时返回,或超时过期时返回,以先发生者为准。虽然文档描述了如何报告调试事件,但是在超时的情况下,根本没有关于API的行为的信息。

问题

  • API是如何报告超时的?
  • 该协议是否也适用于0dwMilliseconds值?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-05 10:20:48

API是如何报告超时的?

函数返回FALSE并将最后一个错误设置为ERROR_SEM_TIMEOUT(0x79)。

对于dwMilliseconds来说,这个协议的值也是0吗?

是。

因为它没有文档化,所以我们将使用实现(我在Win 10上)。

kernelbase!WaitForDebugEventkernelbase!WaitForDebugEventEx API都调用相同的代码(简单地使用不同的arg)。

在共享代码中,第二个调用是在ntdll!DbgUiWaitStateChange上进行的,它本身就是ntdll!NtWaitForDebugEvent的一个简单包装器。

在函数返回时,代码检查返回的状态是STATUS_ALERTED (0x101)还是STATUS_USER_APC (0xc0)。如果是的话,它会继续调用前一个函数(ntdll!DbgUiWaitStateChange),否则它会检查状态是否是一个错误(更准确地说,如果状态是签名的话)。

如果没有签名,则检查状态是否为STATUS_TIMEOUT (0x102)。如果是,则将NT状态转换为win32错误--从STATUS_TIMEOUT转换为ERROR_SEM_TIMEOUT (0x79) -并退出该函数。

nt!NtWaitForDebugEvent (内核级别)中,我们可以很好地概述ReactOS源代码正在发生的事情。

在对调试对象调用nt!KeWaitForSingleObject之后,代码检查(来源)调用的状态。如果是STATUS_TIMEOUT (如果我没有弄错的话,在0超时的情况下应该发生这种情况),则函数退出并返回当前状态,正如上面所解释的,在userland中将其转换为ERROR_SEM_TIMEOUT

代码语言:javascript
复制
         Status = KeWaitForSingleObject(&DebugObject->EventsPresent,
                                        Executive,
                                        PreviousMode,
                                        Alertable,
                                        Timeout);
         if (!NT_SUCCESS(Status) ||
             (Status == STATUS_TIMEOUT) ||
             (Status == STATUS_ALERTED) ||
             (Status == STATUS_USER_APC))
         {
             /* Break out the wait */
             break;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65576253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档