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 に答える