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 ?

4

2 回答 2

2

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

至于GetLastError()返回ERROR_FILE_NOT_FOUND,想必是别人调用了一个API调用的SetLastError(ERROR_FILE_NOT_FOUND)。从以下文档GetLastError()

返回值

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

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

于 2011-09-20T06:14:42.323 回答
-1

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

于 2011-09-20T06:21:40.617 回答