GetThreadContext寄存器始终返回0xCCCCCCCC

时间:2013-08-12 20:16:46

标签: c++ windows winapi msdn

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

由于

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

编辑**

我想我没有充分问我的问题,因为当时我没有意识到我的想法中的错误。我实际上是试图从线程中调用GetThreadContext,我希望得到它的上下文。由于显而易见的原因,这不起作用。相反,我认为CONTEXT ctx = {CONTEXT_FULL}有效。最有帮助的答案是Hans Passant的评论。

2 个答案:

答案 0 :(得分:10)

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

  

无法为正在运行的线程获取有效的上下文。在调用GetThreadContext之前,使用SuspendThread函数挂起线程。

     

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

答案 1 :(得分:3)

在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;
}