【问题标题】:GetThreadContext registers always return 0xCCCCCCCCGetThreadContext 寄存器总是返回 0xCCCCCCCC
【发布时间】:2013-08-14 07:01:11
【问题描述】:

我正在尝试利用 GetThreadContext 来查看当前调试寄存器的设置。无论我调试什么程序,它都会返回 0xCCCCCCCC。我能够成功设置断点 ctx.Dr0,然后使用自定义异常处理程序捕获这些断点,但是如果我尝试查看存储在 ctx.Dr0 中的地址,它总是显示为 0xCCCCCCCC。这是为什么呢?

谢谢

    CONTEXT ctx;
    GetThreadContext(GetCurrentThread(),&ctx);
    cout << hex << ctx.Eip << endl;

编辑**

我觉得我的问题问得不够好,因为当时我还没有意识到我的思维错误。我实际上是在尝试从我想要获取它的上下文的线程中调用 GetThreadContext。由于明显的原因,这不起作用。相反,我认为 CONTEXT ctx = {CONTEXT_FULL} 有效。最有帮助的答案是下面的 Hans Passant 评论。

【问题讨论】:

标签: c++ windows winapi msdn


【解决方案1】:

您无法获得正在运行的线程的有效上下文。您需要暂停要为其获取上下文的线程。因此,尝试在当前线程中执行此操作是行不通的。这在GetThreadContext() 文档中有明确说明:

您无法获取正在运行的线程的有效上下文。在调用 GetThreadContext 之前使用 SuspendThread 函数暂停线程。

如果为当前线程调用GetThreadContext,则函数返回成功;但是,返回的上下文无效。

【讨论】:

  • 哦,我正在编辑自己将链接放入 MSDN 页面...做得好,雷米 ;)
【解决方案2】:

在 64 位平台上,您可以使用 RtlCaptureContext。然而,这不适用于 32 位平台,因此您需要一个不同的解决方案。一种可能的方法是使用本博文Walking the stack of the current thread 中描述的程序集。

CONTEXT Context;
ZeroMemory( &Context, sizeof( CONTEXT ) );
Context.ContextFlags = CONTEXT_CONTROL;

__asm
{
Label:
  mov [Context.Ebp], ebp;
  mov [Context.Esp], esp;
  mov eax, [Label];
  mov [Context.Eip], eax;
}

【讨论】:

    猜你喜欢
    • 2013-07-04
    • 2011-11-18
    • 2014-02-07
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多