我试图获取暂停写字板的线程上下文。但是,无论我对代码做了什么更改,它都会返回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 :(得分:2)
CONTEXT
结构包含特定于处理器的寄存器数据。所以它的定义取决于目标架构。对 x86 和 amd64 说明不同的CONTEXT
定义。
在64位窗口中存在32-64位问题:
GetThreadContext
Wow64GetThreadContext
。注意在这种情况下你需要使用
WOW64_CONTEXT
。GetThreadContext
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);
}