GetThreadContext返回错误6,无效句柄

GetThreadContext returning error 6, Invalid Handle?

本文关键字:无效 句柄 返回 错误 GetThreadContext      更新时间:2023-10-16
#include <iostream>
#include <Windows.h>
using std::cout;
using std::endl;
using std::cin;
int main()
{
    cout << "1." << GetLastError() << endl;
    PROCESS_INFORMATION processInfo;
    STARTUPINFOA startupInfo = {0};
    CONTEXT context;
    context.ContextFlags = CONTEXT_FULL;
    cout << "3." << GetLastError() << endl;
    if (CreateProcess((PCHAR)"rsclient.exe", NULL, NULL, NULL, false, CREATE_SUSPENDED, NULL, NULL, &startupInfo, &processInfo) == false) {
        cout << "CreateProcess error: " << GetLastError() << endl;
    }
    cout << "4." << GetLastError() << endl;
    if (GetThreadContext(processInfo.hProcess, &context) == false) {
        cout << "GetThreadContext error:" << GetLastError() << endl;
    }
    return 0;
}
输出:

1.2
3.2
4.1813
GetThreadContext error:6

我可以在任务管理器中看到挂起的进程,但我得到一个无效的句柄错误?

为什么GetLastError()在程序开始时给出ERROR_FILE_NOT_FOUND ?

您应该使用processInfo.hThread,因为它是新进程的主线程句柄。processInfo.hProcess是进程句柄,而不是线程句柄。

对于GetLastError()返回ERROR_FILE_NOT_FOUND,可能是别人调用了一个API,叫做SetLastError(ERROR_FILE_NOT_FOUND)。来自GetLastError()的文档:

返回值

返回值是调用线程的最后一个错误代码。

文档中每个函数的返回值部分设置最后错误代码,记录函数所处的条件设置最后一个错误代码。设置线程的大多数函数最后错误代码在它们失败时设置它。然而,有些函数也当它们成功时设置最后错误代码。如果函数不是文档用于设置最后一个错误代码,由此返回值函数只是最近设置的最后错误代码;有些函数在成功时将最后错误代码设置为0,而其他函数则设置为0不是。

当你用进程id作为输入调用GetThreadContext时,因此Windows无法找到任何此类线程,因此返回ERROR_FILE_NOT_FOUND。你最好给新创建的进程的主线程,你会得到想要的结果。