GetThreadContext 返回错误 6,句柄无效?

发布于 2024-12-05 14:09:09 字数 1068 浏览 1 评论 0原文

#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 ?

#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;
}

output:

1.2
3.2
4.1813
GetThreadContext error:6

I can see the suspended process in task manager yet I'm getting an invalid handle error?

Also why does GetLastError() give an ERROR_FILE_NOT_FOUND at the start of the program?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一张白纸 2024-12-12 14:09:09

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

至于 GetLastError() 返回 ERROR_FILE_NOT_FOUND,可能是其他人调用了一个名为 SetLastError(ERROR_FILE_NOT_FOUND) 的 API。来自 的文档GetLastError()

返回值

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

文档中每个函数的返回值部分
设置最后一个错误代码,记录该功能的条件
设置最后一个错误代码。大多数设置线程的函数
最后错误代码在失败时设置它。不过,有些功能也
成功时设置最后一个错误代码。如果该功能不是
记录设置最后一个错误代码,返回的值
function 只是最近设置的最后一个错误代码;
某些函数在成功时将最后一个错误代码设置为 0,而其他函数则这样做
不是。

You should use processInfo.hThread as that is the handle to the primary thread of the new process. processInfo.hProcess is a process handle, not a thread handle.

As for GetLastError() returning ERROR_FILE_NOT_FOUND, presumably someone else called an API that called SetLastError(ERROR_FILE_NOT_FOUND). From the documentation of GetLastError():

Return value

The return value is the calling thread's last-error code.

The Return Value section of the documentation for each function that
sets the last-error code notes the conditions under which the function
sets the last-error code. Most functions that set the thread's
last-error code set it when they fail. However, some functions also
set the last-error code when they succeed. If the function is not
documented to set the last-error code, the value returned by this
function is simply the most recent last-error code to have been set;
some functions set the last-error code to 0 on success and others do
not.

微暖i 2024-12-12 14:09:09

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

As you are calling GetThreadContext with process id as input, so Windows is not able to find any such kind of thread, so returning ERROR_FILE_NOT_FOUND. Better you give the main thread of newly created process and you will get the desired result.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文