Как узнать, готов ли дескриптор процесса - PullRequest
0 голосов
/ 07 октября 2011

Я открываю процесс с OpenProcess в c ++, но не могу использовать его сразу после того, как получаю его, потому что я получаю «Недопустимая ошибка дескриптора».Я знаю, что правильный дескриптор, потому что он дает мне правильный PID, когда я выполняю GetProcessId для этого дескриптора.Вот как я открываю процесс.

#include <windows.h>
#include <stdio.h>
#include <dbghelp.h>
#pragma (lib, "dbghelp.lib");

bool EnablePrivilege(LPCTSTR lpszPrivilegeName, BOOL bEnable) 
{ 
    HANDLE hToken; 
    TOKEN_PRIVILEGES    tp; 
    LUID luid; 
    bool ret; 

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ, &hToken)) 
        return FALSE; 

    if (!LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid)) 
        return FALSE; 

    tp.PrivilegeCount           = 1; 
    tp.Privileges[0].Luid       = luid; 
    tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0; 

    ret = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); 
    CloseHandle(hToken); 

    return ret; 
}

void main()
{
    EnablePrivilege(SE_DEBUG_NAME, TRUE);

    STARTUPINFOA startInfo;
    PROCESS_INFORMATION processInfo;
    ZeroMemory( &startInfo, sizeof(startInfo) );
    startInfo.cb = sizeof(startInfo);
    ZeroMemory( &processInfo, sizeof(processInfo) );
    DWORD creationFlags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS | PROCESS_VM_READ | PROCESS_QUERY_INFORMATION;
    const char* comLine = "Some process path and name";

//     Start the child process. 
    if( CreateProcessA( NULL,   // No module name (use command line)
       (LPSTR)comLine, //argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        creationFlags,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &startInfo,            // Pointer to STARTUPINFO structure
        &processInfo )           // Pointer to PROCESS_INFORMATION structure
     == false ) 
    {
        printf("FAIL!");
return;
    }

    SetLastError(0);
    bool ok = SymInitialize(processInfo.hProcess, NULL, true);
    int err = GetLastError();

}

По какой-то причине последнее значение ошибки - мусор.
Есть ли способ проверить, готов ли дескриптор процесса к использованию?

1 Ответ

2 голосов
/ 07 октября 2011

Из документации по рассматриваемой функции:

Return value

If the function succeeds, the return value is an open handle to the specified process.

Это означает, что если функция завершается успешно, вы уже получаете пригодный для использования дескриптор, то есть вы либо получаете его, либо нет, не существует среднего уровня, где «вы»придется ждать ", чтобы это можно было использовать.В вашем конкретном случае есть вероятность, что ваш дескриптор недействителен, т.е. функция не работает.Вы проверяете возвращаемое значение для NULL?Вы использовали GetLastError () , чтобы увидеть, что происходит?

...