Comment interroger un processus en cours d'exécution pour la liste des paramètres? (windows, C++)
pour un processus de windows, je veux savoir avec quels paramètres de ligne de commande il a été lancé. Le gestionnaire des tâches de windows est capable de montrer que, par exemple,.
Vous en remercie d'avance!
- Compte tenu de ce commentaire Il semble que vous avez la mauvaise solution au problème, plutôt que de demander comment faire ce que vous voulez à l'origine. Si vous voulez arrêter de multiples processus faisant le même travail, vous pouvez utiliser un mutex ou sémaphore de "verrouiller" une section particulière de travail.
Vous devez vous connecter pour publier un commentaire.
En supposant que vous connaissez l'ID de processus, utilisez OpenProcess pour obtenir une poignée (ce qui nécessite des privilèges élevés, comme indiqué dans les docs). Ensuite, utilisez NtQueryInformationProcess obtenir de l'informations de processus. Utiliser le
ProcessBasicInformation
option pour obtenir les PEB du processus - ce qui contient un autre pointeur de structure, à travers lequel vous canget de la ligne de commande.CommandLine
de propriété sur la classe Win32_Process msdn.microsoft.com/en-us/library/aa394372%28v=VS.85%29.aspxÀ distance de l'injection de thread:
Vous utilisez à distance de l'injection de thread, appel
GetCommandLine()
, puis de la CIB à nouveau le résultat. Cela fonctionne la plupart du temps sur Windows XP, mais sous Windows Vista ou version ultérieure, il ne fonctionne pas sur le système et les processus de service. C'est parce queCreateRemoteThread
ne fonctionne que sur les processus dans le même ID de session en tant qu'appelant – dans Windows Vista, les services et les autres processus du système dans la session 0, tandis que les programmes de l'utilisateur d'exécuter, en plus de séances. Le meilleur et le plus sûr moyen est de lire une structure présente dans tous les processus de Windows.PEB structure:
La Environnement de processus de Bloc (PEB) est généralement stocké dans les hautes régions de la mémoire du processus, au-dessus de
0x7ff00000
. Ces régions contiennent également du Fil de l'Environnement de Blocs (TEBs). Le PEB de l'adresse est différente pour presque tous les processus, de sorte que vous ne pouvez pas simplement utiliser une codé en dur constante.Pour plus de détails, rendez-vous sur Obtenir la ligne de commande d'un processus
MODIFIER (plus d'information):
Premier auteur dit :
C'est la même chose avec OpenProcess, vous ne pouvez pas ouvrir un processus qui est un service ou un processus ouvert par SYSTÈME ou SERVICE LOCAL ou SERVICE RÉSEAU, si vous exécutez votre programme par un utilisateur (même administrateur).
Si votre programme est un service, il est probablement déjà en cours d'exécution par compte système local, donc pas de problème.
Mais sinon, une solution est de le lancer avec psexec:
Vous devriez voir que vous êtes SYSTÈME, maintenant vous pouvez lancer votre programme et de voir la ligne de commande pour tous les processus.
Eh bien, vous pourriez injecter une dll à l'étranger espace d'adressage du processus, et ensuite appeler GetCommandLine.
Vous ne pouvez pas de manière fiable obtenir cette information. Il existe différentes astuces pour essayer de la récupérer, mais il n'y a aucune garantie que le processus cible n'a pas déjà mutilé que la section de la mémoire. Raymond Chen discuté de cela un certain temps de retour sur Le Vieux Chose De Nouveau.