gpt4 book ai didi

c++ - GetThreadContext() 返回 87

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:22 24 4
gpt4 key购买 nike

我正在尝试获取暂停写字板的线程上下文。但是,无论我对代码进行什么更改,它都返回 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();
}

最佳答案

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

64 位 Windows 中存在 32-64 位问题:

  • 64位应用程序可以通过调用获取任何线程的64位上下文 GetThreadContext
  • 64位应用程序可以通过调用获取WOW64线程的32位上下文 Wow64GetThreadContext .注意在这种情况下你需要使用 WOW64_CONTEXT .
  • 32 位应用程序只能获取 WOW64 线程的 32 位上下文调用GetThreadContext
  • 当 32 位应用程序尝试获取 64 位线程的上下文时应用-GetThreadContext总是失败ERROR_INVALID_PARAMETER

因此,根据您的错误,我可以说您在 64 位 Windows 上运行。这里 write.exe 是 64 位进程,而您的代码是 32 位的。在这种情况下,您无法获得上下文。

另外,作为一般注意事项,我们始终必须初始化 ctxContextFlags 成员。这是强制性的:

The function retrieves a selective context based on the value of the ContextFlags member of the context structure.

所以当 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);
}

关于c++ - GetThreadContext() 返回 87,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46380166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com