2017-09-23 50 views
3

我试图获取暂停写字板的线程上下文。但是,不管我对代码做什么样的变化,它会返回87GetThreadContext()返回87

STARTUPINFO si = { 0 }; 
PROCESS_INFORMATION pi = { 0 }; 
CONTEXT ctx; 

if (CreateProcess(L"C:\\Windows\\write.exe", NULL, NULL, NULL, false, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) 
{ 
    cout << "-> Success <-" << endl; 
} 

else 
{ 
    cout << GetLastError(); 
} 

if (GetThreadContext(pi.hThread, &ctx)) 
{ 
    cout << "-> Success <-" << endl; 
} 

else 
{ 
    cout << GetLastError(); 
} 
+0

您是否尝试过:'如果函数调用失败,返回值是零。要获得扩展的错误信息,请调用GetLastError.'? – Stefan

+0

*此结构的ContextFlags成员的值指定检索线程上下文的哪些部分*,但您不初始化此成员。 – RbMm

+0

争用条件'CreateProcess':_“...请注意,函数在进程完成初始化之前返回......”_ source:https://msdn.microsoft.com/en-us/library/windows/desktop /ms682425(v=vs.85).aspx –

回答

1

CONTEXT结构包含特定处理器的寄存器中的数据。所以它的定义取决于目标架构。对于x86amd64不同的CONTEXT的定义。

这里存在32-64位问题64位Windows:

  • 64位应用程序可以通过调用 GetThreadContext
  • 64位应用程序得到任何线索的情况下64位可以得到32位上下文WOW64线程调用 Wow64GetThreadContext。请注意,在这种情况下,您需要使用 WOW64_CONTEXT
  • 32位应用程序只能得到的WOW64线程通过 呼叫GetThreadContext
  • 当32位应用程序尝试获取线程的上下文64位 应用32位文脉 - GetThreadContext总是失败, ERROR_INVALID_PARAMETER

所以根据你的错误我可以说你在64位窗口上运行。这里write.exe是64位进程,你的代码是32位。在这种情况下你无法获得背景。

另外,正如一般笔记我们总是必须初始化ContextFlags成员ctx。这是强制性的:

该函数检索基于所述 ContextFlags中上下文结构的成员的值的选择性上下文。

所以当ContextFlags中是不确定的 - GetThreadContext返回未定义的结果

所以代码必须是下一个:

STARTUPINFO si = { sizeof(si) }; 
    PROCESS_INFORMATION pi ; 

    if (CreateProcess(L"C:\\Windows\\write.exe", NULL, NULL, NULL, false, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) 
    { 
     union { 
      CONTEXT ctx; 
#ifdef _WIN64 
      WOW64_CONTEXT wow_ctx; 
#endif 
     }; 

     BOOL fOk = FALSE; 
     BOOL Wow; 
#ifdef _WIN64 
     if (IsWow64Process(pi.hProcess, &Wow)) 
     { 
      if (Wow) 
      { 
       wow_ctx.ContextFlags = WOW64_CONTEXT_DEBUG_REGISTERS|WOW64_CONTEXT_CONTROL|WOW64_CONTEXT_INTEGER; 
       fOk = Wow64GetThreadContext(pi.hThread, &wow_ctx); 
      } 
      else 
      { 
       ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS|CONTEXT_INTEGER|CONTEXT_CONTROL; 
       fOk = GetThreadContext(pi.hThread, &ctx); 
      } 
     } 
#else 
     BOOL MyWow; 
     if (IsWow64Process(NtCurrentProcess(), &MyWow) && IsWow64Process(pi.hProcess, &Wow)) 
     { 
      if ((MyWow != 0)^(Wow != 0)) 
      { 
       //32-bit app can not got context of 64-bit app 
       SetLastError(ERROR_GEN_FAILURE); 
      } 
      else 
      { 
       ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS|CONTEXT_INTEGER|CONTEXT_CONTROL; 
       fOk = GetThreadContext(pi.hThread, &ctx); 
      } 
     } 

     if (!fOk) 
     { 
      DbgPrint("error=%u\n", GetLastError()); 
     } 
#endif 
     ResumeThread(pi.hThread); 
     CloseHandle(pi.hThread); 
     CloseHandle(pi.hProcess); 
    } 
+0

感谢您的回复 - 我尝试设置上下文标志,并且不幸地得到了相同的结果。 –

+0

@ DennisFlores - 理解 - 你的过程是一个过程(64位窗口中的32位过程)。 * write.exe *是64位进程。他根本没有32位上下文 – RbMm

+0

谢谢你,非常高质量的答案。 Stackoverflow永远不会失望。我感到尴尬,我不知道记事本是x64 haha​​h –

相关问题