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.
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.
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.
Vous auriez besoin de privilèges élevés. Regardez aussi une question similaire ici .
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
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