Ошибка OpenProcess 87, неверный параметр - PullRequest
2 голосов
/ 14 февраля 2011

Я пытаюсь написать программу, которая выполняет make.exe из дистрибутива MinGW в текущем каталоге и использует его данные STDOUT и код выхода. У меня есть дескриптор для обработки STDOUT, откуда я получаю данные, созданные с помощью CreatePipe. Когда я получаю ERROR_HANDLE_EOF на этом канале, я предполагаю, что процесс завершился, и пытаюсь получить код выхода:

if(session->pid == 0) return;
HANDLE hp = OpenProcess(PROCESS_QUERY_INFORMATION |
            PROCESS_TERMINATE, TRUE, session->pid);
if(hp == NULL) {
    printf("OpenProcess(%i) failed, error: %i\n",
        session->pid, (int)GetLastError());
    return;
}

Мой код работает на всех других протестированных мной утилитах MinGW (таких как pwd, ls и т. Д.), Я получаю STDOUT и код выхода без проблем. Но когда я пытаюсь это сделать, в приведенном выше коде отображается следующее сообщение:

"Ошибка OpenProcess (2032), ошибка: 87"

Я погуглил для кода ошибки 87, и он говорит "Неверный параметр". Я не понимаю, что может быть недопустимым в положительном идентификаторе процесса, таком как 2032. Есть идеи?

Ответы [ 2 ]

4 голосов
/ 14 февраля 2011

Вы должны использовать дескриптор из CreateProcess вместо OpenProcess в PID.

OpenProcess работает, только если объект процесса все еще существует. К тому времени, когда вы вызовете OpenProcess, если объект процесса исчезнет - результатом будет вызов с недопустимым параметром.

Успех, который вы достигли с другими утилитами, обусловлен либо состоянием гонки (которое может несколько раз выйти из строя), либо вы сохранили исходный дескриптор дочернего процесса открытым.

0 голосов
/ 10 июля 2017

Хотя пост старый: я заметил, что получил ERROR_INVALID_PARAMETER, когда процесс существовал, но принадлежал другому пользователю и / или сеансу рабочего стола Windows и / или терминального сервера.

Как ни странно, функция WTSEnumerateProcess() не страдает от этой ошибки, но намного дороже, особенно в системе, которая уже находится под большой нагрузкой со многими процессами (и вызовом даже ресурсов ядра Windows).

Таким образом, невозможно сделать «реальный» недопустимый параметр и получить доступ к ошибкам. Вместо этого я ожидал бы ERROR_ACCESS_DENIED (но диспетчер задач, вызываемый как обычный / не повышенный уровень пользователя, по-прежнему показывает все процессы).

Похоже на некоторые несоответствия в Windows?

...