La lecture des Arguments de Ligne de Commande d'un Autre Processus (Win32 code C)
J'ai besoin d'être en mesure de répertorier les arguments de ligne de commande (le cas échéant) transmis à d'autres processus en cours d'exécution. J'ai le PIDs déjà des processus en cours d'exécution sur le système, donc en gros j'ai besoin de déterminer les arguments passés à traiter avec le PID XXX.
Je suis en train de travailler sur une partie essentielle d'un Module Python pour gérer les processus. Le code est écrit comme une extension Python en C et seront enveloppés par une hausse du niveau de la bibliothèque Python. Le but de ce projet est d'éviter la dépendance envers des tiers libs comme le pywin32 extensions, ou sur laide hacks comme un appel " ps " ou taskkill sur la ligne de commande, donc je suis à la recherche d'un moyen de le faire dans le code C.
J'ai Googlé ce autour et a trouvé quelques suggestions d'utilisation de CreateRemoteThread() à injecter moi-même dans les autres processus, puis exécutez GetCommandLine() mais j'espérais que quelqu'un pourrait avoir des exemples de code et/ou de meilleures suggestions.
Mise à JOUR: j'ai trouvé plein de travail le code de démonstration et une solution à l'aide de NtQueryProcessInformation sur CodeProject: http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx - Ce n'est pas idéal car il est non pris en charge "" la réforme de l'information directement à partir de la NTDLL structures, mais je vais vivre avec elle. Merci à tous pour les suggestions.
Mise à JOUR 2: j'ai réussi grâce à plus de Googler pour creuser une version C qui n'utilise pas de code C++, et est un peu plus direct, de façon concise, pointé vers ce problème. Voir http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/ pour plus de détails.
Merci!
OriginalL'auteur Jay | 2009-01-13
Vous devez vous connecter pour publier un commentaire.
Pour répondre à ma propre question, j'ai enfin trouvé un CodeProject solution qui répond exactement à ce que je cherche:
http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx
@Ruben déjà souligné, vous pouvez utiliser NtQueryProcessInformation pour récupérer cette information. Malheureusement ce n'est pas une méthode recommandée, mais compte tenu de la seule autre solution semble être d'assumer les frais généraux d'une requête WMI, je pense que nous allons profiter de cette approche pour l'instant.
Noter que cela semble ne pas fonctionner si vous utilisez le code compilé à partir de Windows 32 bits sur 64 bits de Windows OS, mais comme nos modules sont compilés à partir de la source sur la cible, qui doit être OK pour nos fins. Je préfère utiliser ce code existant et doit-il rompre dans Windows 7 ou à une date ultérieure, nous pouvons regarder à nouveau à l'aide de WMI. Merci pour les réponses!
Mise à JOUR: plus concis et C seulement (contrairement à C++) version de la même technique est illustré ici:
http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/
OriginalL'auteur Jay
La mise en cache de la solution:
http://74.125.45.132/search?q=cache:-wPkE2PbsGwJ:windowsxp.mvps.org/listproc.htm+running+process+command+line&hl=es&ct=clnk&cd=1&gl=ar&client=firefox-a
Aussi:
http://mail.python.org/pipermail/python-win32/2007-December/006498.html
Vous pouvez appeler WMI à partir de C par l'intermédiaire de son interface COM, bien que ce ne sera pas la plus élégante de code à jamais.
c'est vrai...ce serait peu de sérieux de surcharge pour cette tâche apparemment simple, mais ça commence à ressembler à ce que je n'ai pas beaucoup d'options.
OriginalL'auteur Ironicnet
En utilisant psutil ( https://github.com/giampaolo/psutil ):
OriginalL'auteur Giampaolo Rodolà
WMI approche mentionné dans une autre réponse est probablement le plus fiable moyen de le faire. À la recherche par le biais de MSDN, j'ai repéré ce qui ressemble à une autre approche possible; il est documenté, mais il n'est pas clair s'il est entièrement pris en charge. Dans MSDN de la langue, il--
En tout cas, à condition que votre processus a le droit d'autorisations, vous devriez être en mesure d'appeler
NtQueryProcessInformation
avec unProcessInformationClass
deProcessBasicInformation
. Dans le retour de l'PROCESS_BASIC_INFORMATION
de la structure, vous devez récupérer un pointeur vers la cible du processus l'exécution de processus de bloc de (en tant que champPebBaseAddress
). LeProcessParameters
domaine de la PEB vous donnera un pointeur vers unRTL_USER_PROCESS_PARAMETERS
structure. LeCommandLine
champ de cette structure sera unUNICODE_STRING
structure. (Attention à ne pas trop faire trop d'hypothèses sur la chaîne; il n'y a aucune garantie que ça va être NUL, et il n'est pas clair si oui ou non vous aurez besoin d'enlever le nom de l'application exécutée à partir du début de la ligne de commande.)Je n'ai pas essayé cette approche--et comme je l'ai mentionné ci-dessus, il semble un peu douteux... (lire: non portable), mais il pourrait être la peine d'essayer. Bonne chance...
OriginalL'auteur reuben
Si vous n'êtes pas le parent de ces processus, alors ce n'est pas possible en utilisant les fonctions documentées 🙁 Maintenant, si vous êtes parent, vous pouvez faire votre CreateRemoteThread truc, mais sinon, vous aurez certainement Accès Refusé, à moins que votre application a des droits d'administrateur.
OriginalL'auteur Paul Betts