C++ GetThreadContext寄存器始终返回0xCCCC
我试图利用GetThreadContext查看当前调试寄存器的设置。无论我调试什么程序,它都返回0xCCCC。我能够成功地设置断点ctx.Dr0,然后使用自定义异常处理程序捕获这些断点,但是如果我尝试查看存储在ctx.Dr0的地址,它总是显示为0xCCCC。为什么呢 谢谢C++ GetThreadContext寄存器始终返回0xCCCC,c++,windows,winapi,msdn,C++,Windows,Winapi,Msdn,我试图利用GetThreadContext查看当前调试寄存器的设置。无论我调试什么程序,它都返回0xCCCC。我能够成功地设置断点ctx.Dr0,然后使用自定义异常处理程序捕获这些断点,但是如果我尝试查看存储在ctx.Dr0的地址,它总是显示为0xCCCC。为什么呢 谢谢 CONTEXT ctx; GetThreadContext(GetCurrentThread(),&ctx); cout << hex << ctx.Eip <&l
CONTEXT ctx;
GetThreadContext(GetCurrentThread(),&ctx);
cout << hex << ctx.Eip << endl;
CONTEXT-ctx;
GetThreadContext(GetCurrentThread(),&ctx);
无法为正在运行的线程获取有效的上下文。您需要挂起要获取上下文的线程。因此,在当前线程中尝试这样做是行不通的。文件中明确说明了这一点:
无法为正在运行的线程获取有效的上下文。在调用GetThreadContext之前,请使用SuspendThread函数挂起线程
如果为当前线程调用GetThreadContext,函数将成功返回;但是,返回的上下文无效。
在64位平台上,您可以使用。但是,这不适用于32位平台,因此您需要一个不同的解决方案。一种可能的方法是使用本文所述的汇编
哦,我自己编辑了MSDN页面的链接。。。干得好,雷米;)当您不检查winapi函数的返回值是否有错误时,就会发生这种情况,您只是不知道为什么它不起作用。
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;
}