Ich habe eine C # -Anwendung, die sowohl für 32-Bit- als auch für 64-Bit-Prozessoren geeignet ist. Ich versuche, die Module aller Prozesse auf einem bestimmten System aufzulisten, und dies wird problematisch, wenn Sie versuchen, 32-Bit-Prozessmodule von einer 64-Bit-Anwendung aufzulisten; Windows oder .NET verbietet es.
Ich dachte, es wäre ziemlich cool, wenn ich die Anwendung von selbst starten könnte, sie aber zwingen würde, sie als 32-Bit auszuführen, und dann würde sie die beim letzten Durchlauf verpassten Prozessmodule korrekt aufzählen.
Wie kann ich eine ausführbare Datei programmgesteuert ausführen und angeben, dass sie, obwohl sie mit einer ANY CPU
-Konfiguration erstellt wurde, als 32-Bit-Prozess ausgeführt werden sollte?
Der folgende Code gibt ein System.ComponentModel.Win32Exception
mit dem Text "Ein 32-Bit-Prozess kann nicht auf Module eines 64-Bit-Prozesses zugreifen."
Nach dem Aussehen ist Ihr Problem mit der Ausgabe des IsWow64Process
Calls, wenn es nicht verfügbar / nicht angemessen ist .... versuchen Sie, Ihre Erkennung mit diesem Code:
Wenn Sie darüber hinauskommen, können Sie dann nach Möglichkeiten suchen, die Module von 32-Bit- und 64-Bit-Prozessen plattformunabhängig aufzulisten:
Verwenden Sie WMI (Windows-Verwaltungsinstrumentation), um die erforderlichen Informationen abzufragen ... siehe den 3. Post down, der UseWMIToGetProcesses
() erwähnt.
Verwenden Sie EnumProcessModulesEx
(wird in Vista unterstützt ... wenn Sie feststellen, dass Sie sich im 64bit-Modus befinden), da es die 32-Bit- und 64-Bit-Prozessliste auflisten kann (siehe ganz am Ende dieses Links):
Verwenden Sie CreateToolhelp32Snapshot
, um die Prozesse aufzuzählen (Sie müssen beim Definieren der Strukturen vorsichtig sein):
Laut Artikel von Rick Byer Irgendwelche CPU-Exes sind in der Regel mehr Probleme als sie wert sind , die Entscheidung über die" Bitness ", die zum Starten von AnyCPU-Anwendungen verwendet wird, wird vom OS-Loader bestimmt und Sie haben keine sag in der Sache.
Speziell:
AnyCPU-EXEs sind ein wenig komplizierter, da der OS-Loader dies erfordert entscheiden, wie der Prozess initialisiert wird. Auf 64-Bit-Betriebssystemen werden sie als ausgeführt 64-Bit-Prozesse (außer der Master-OS-Switch 'ldr64' sagt etwas anderes), Bei 32-Bit-Betriebssystemen werden sie als 32-Bit-Prozesse ausgeführt.
Es sieht also so aus, als wäre es die beste Option, eine zweite 32-Bit-Exe zu erstellen und zu starten und diese zu starten.