Von nem anderen Prozess-Befehlszeile in Windows
Ich versuche einen anderen Prozess Kommandozeile (unter WinXP 32bit).
Ich Tue das folgende:
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, ProcList.proc_id_as_numbers[i]);
BytesNeeded = sizeof(PROCESS_BASIC_INFORMATION);
ZwQueryInformationProcess(hProcess, ProcessBasicInformation, UserPool, sizeof(PROCESS_BASIC_INFORMATION), &BytesNeeded);
pbi = (PPROCESS_BASIC_INFORMATION)UserPool;
BytesNeeded = sizeof(PEB);
res = ZwReadVirtualMemory(hProcess, pbi->PebBaseAddress, UserPool, sizeof(PEB), &BytesNeeded);
/* zero value returned */
peb = (PPEB)UserPool;
BytesNeeded = sizeof(RTL_USER_PROCESS_PARAMETERS);
res = ZwReadVirtualMemory(hProcess, peb->ProcessParameters, UserPool, sizeof(RTL_USER_PROCESS_PARAMETERS), &BytesNeeded);
ProcParam = (PRTL_USER_PROCESS_PARAMETERS)UserPool;
Nach dem ersten Aufruf von pbi.UniqueProcessID korrekt ist.
Aber nach dem Aufruf ZwReadVirtualMemory ich bekomme Befehlszeile für meinen Prozess, nicht angeforderte.
Ich auch ReadProcessMemore & NtQueryInformationProcess, aber das gleiche Ergebnis erhalten.
Kann jemand helfen?
Hier http://forum.sysinternals.com/get-commandline-of-running-processes_topic6510_page1.html gesagt wird, dass dieser code funktioniert. Leider weiß ich nicht haben Zugang zu post in diesem forum, sich der Frage zu stellen.
- Vielleicht haben Sie 0 für die Prozess-id in die OpenProcess nennen, oder sowas in der Art?
- Nein. hProcess korrekt ist und pbi die ich bekomme, ist auch richtig.
- Vielleicht die Befehlszeile Ihres eigenen Prozesses ist die gleiche wie in der Befehlszeile des anderen Prozesses? 🙂
- Nein. Das ist es nicht. Ich bin versucht zu finden, javaw-Prozess von c++ - Programms.
- Möchten Sie vielleicht, dies zu Lesen: blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx
Du musst angemeldet sein, um einen Kommentar abzugeben.
Duplizieren von Wie die Abfrage eines Laufenden Prozesses für it-Parameter-Liste? (windows, C++) , so werde ich kopiere einfach meine Antwort von dort hier:
Können Sie nicht zuverlässig diese Informationen erhalten. Es gibt verschiedene tricks, um zu versuchen und abrufen, aber es gibt keine Garantie, dass der soll-Prozess noch nicht entstellten, die-Abschnitt des Speichers. Raymond Chen diskutiert dieses eine Weile zurück auf "The Old New Thing.
Sieht es aus wie ZwReadVirtualMemory nur einmal aufgerufen wird. Das ist nicht genug. Es ist zu berufen, für jede Ebene der Dereferenzierung Zeiger. In anderen Worten, wenn Sie, um einen Zeiger verweist es auf andere Prozess-Adressraum. Sie kann es nicht Lesen direkt. Sie müssen rufen Sie ZwReadVirtualMemory wieder. Für den Fall, dass diese Datenstrukturen ZwReadVirtualMemory als 3-mal: einmal zu Lesen PEB (das ist das, was der code oben macht), einmal zu Lesen RTL_USER_PROCESS_PARAMETERS und einmal zu Lesen UNICODE_STRING Puffer.
Das folgende code-fragment für mich gearbeitet (Fehlerbehandlung aus Gründen der übersichtlichkeit weggelassen und ich habe dokumentiert ReadProcessMemory-API anstelle von ZwReadVirtualMemory):
Warum wir Sie sehen, sehen Sie den Befehl der Linie von unseren eigenen Prozess? Das ist, weil die Prozesse festgelegt, die in einer ähnlichen Weise. Befehlszeile und PEB-Verwandte Strukturen sind wahrscheinlich die gleichen Adressen. Also, wenn Sie verpasste ReadProcessMemory Sie am Ende genau mit den lokalen Prozess' Befehlszeile.
NULL
Charakter wBufferCopy .Ich versuche zu tun, die gleiche Sache mit mingw & Qt. Ich lief in ein problem mit "undefined reference to CLSID_WbemLocator". Nach einigen Forschung scheint es, dass die version von libwbemuuid.eine, die war im Lieferumfang meiner version von mingw nur definiert IID_IWbemLocator aber nicht CLSID_WbemLocator.
Ich festgestellt, dass manuell definieren CLSID_WbemLocator funktioniert (obwohl wahrscheinlich nicht die "richtige" Art und Weise, Dinge zu tun).
Der endgültige code:
und in meinem Qt-Projekt-Datei (.pro -) ich link die folgenden Bibliotheken:
CommandLine
undExecutablePath
BSTR. Jedoch, mithilfe von WMI ist die einzige zuverlässige Ansatz, um Kommandozeilen-Parameter, also +1 von mir.Müssen Sie mehr diszipliniert mit der überprüfung der return-codes. Kann es sein, dass alle Ihre
ZwReadVirtualMemory
Anrufe Ertrag ein Fehler-code, die Punkte, die Sie in die richtige Richtung.Insbesondere die
ProcList.proc_id_as_numbers[i]
Teil deutet darauf hin, dass Sie die Ausführung dieses Codes in einer Schleife. Die Chancen sind, dass dieprocPeb.ProcessParameters
Struktur ist immer noch gefüllt mit den Werten einer früheren loop-iteration - und da dieZwReadVirtualMemory
rufen Sie schlägt auf Ihr Ziel-Prozess, erhalten Sie zu sehen, die Befehl Linie, von welchem Prozess war zuvor abgefragt.Müssen Sie nicht Lesen Sie die VM von der Ziel-Prozess, dies zu tun. Nur stellen Sie sicher, dass Sie die richtige Prozess-ID des zielprozesses.
Sobald Sie den Vorgang Griff über
OpenProcess
, dann können Sie NtQueryInformationProcess detaillierte Prozess-info. Verwenden Sie die ProcessBasicInformation option, um die PEB des Prozesses - diese enthält eine andere Struktur Zeiger RTL_USER_PROCESS_PARAMETERS, über die Sie bekommen können die Befehl Linie.