web-dev-qa-db-fra.com

comment obtenir un descripteur de processus à partir d'un identifiant de processus?

J'ai l'ID de processus, je veux obtenir son descripteur de processus.

Existe-t-il une API disponible pour cela?.

J'ai essayé d'utiliser OpenProcess mais il renvoie NULL et GetLastError = 0.

C'est ce que j'essaye sur Vista.

Je suppose que je dois activer SeDebugPrivilege avant d’utiliser OpenProcess. Mais pour activer SeDebugPrivilege, je dois obtenir son descripteur de processus.

20
anand
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);

Vous devrez vérifier que vous utilisez un ID de processus valide et que vous disposez des droits d'accès que vous demandez au processus.

23
Matt Joiner

Est-ce ce que vous recherchez?

HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
CloseHandle(processHandle); 

En outre, voici quelques codes que j'utilise pour définir debug privledge avant d'injecter des DLL.

void Loader::EnableDebugPriv(void)
{
    HANDLE              hToken;
    LUID                SeDebugNameValue;
    TOKEN_PRIVILEGES    TokenPrivileges;

    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &SeDebugNameValue))
        {
            TokenPrivileges.PrivilegeCount              = 1;
            TokenPrivileges.Privileges[0].Luid          = SeDebugNameValue;
            TokenPrivileges.Privileges[0].Attributes    = SE_PRIVILEGE_ENABLED;

            if(AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
            {
                CloseHandle(hToken);
            }
            else
            {
                CloseHandle(hToken);
                throw std::exception("Couldn't adjust token privileges!");              
            }
        }
        else
        {
            CloseHandle(hToken);
            throw std::exception("Couldn't look up privilege value!");
        }
    }
    else
    {
        throw std::exception("Couldn't open process token!");
    }
}

J'ai utilisé le code ci-dessus avec Windows Vista avec succès. 

10
bdd

Vous auriez besoin de privilèges élevés. Regardez aussi une question similaire ici .

1
Igor

Je viens d'avoir exactement le même problème que décrit: OpenProcess () == NULL et GetLastError () == 0. Il s'est avéré que le paramètre de prise en charge du Common Language RunTime était défini sur "Pure" aurait dû être simplement "Commun". Il m'a fallu des siècles pour trouver.

Pour VS2010 c ++ goto -> Propriétés du projet -> Propriétés de configuration -> C/C++ -> Général

1
trgs

Si vous avez un identificateur de processus, vous pouvez obtenir le descripteur de processus en appelant la fonction OpenProcess . OpenProcess vous permet de spécifier les droits d'accès du descripteur et de déterminer s'il peut être hérité.

FYI:
http://msdn.Microsoft.com/en-us/library/windows/desktop/ms684868(v=vs.85).aspx

0
herodot