GetThreadContext возвращает ошибку 6, неверный дескриптор? - PullRequest
0 голосов
/ 20 сентября 2011
#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 при запуске программы?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2011

Вы должны использовать processInfo.hThread, так как это дескриптор основного потока нового процесса.processInfo.hProcess - это дескриптор процесса, а не дескриптор потока.

Что касается GetLastError(), возвращающего ERROR_FILE_NOT_FOUND, предположительно кто-то еще назвал API, который называется SetLastError(ERROR_FILE_NOT_FOUND).Из документации GetLastError():

Возвращаемое значение

Возвращаемым значением является код последней ошибки вызывающего потока.

В разделе «Возвращаемое значение» документации по каждой функции, которая устанавливает код последней ошибки, отмечаются условия, при которых функция устанавливает код последней ошибки.Большинство функций, которые устанавливают код последней ошибки потока, устанавливают его при сбое.Тем не менее, некоторые функции также устанавливают код последней ошибки, когда они завершаются успешно.Если функция не задокументирована для установки кода последней ошибки, значение, возвращаемое этой функцией, является просто самым последним кодом последней ошибки, который был установлен;некоторые функции устанавливают код последней ошибки равным 0 в случае успеха, а другие нет.

0 голосов
/ 20 сентября 2011

Поскольку вы вызываете GetThreadContext с идентификатором процесса в качестве входных данных, Windows не может найти такой поток, поэтому возвращает ERROR_FILE_NOT_FOUND. Лучше отдайте основной поток вновь создаваемого процесса и получите желаемый результат.

...