definieren:
[DllImport("kernel32.dll")]
internal static extern void GetNativeSystemInfo(ref SystemInfo lpSystemInfo);
[DllImport("kernel32.dll")]
internal static extern void GetSystemInfo(ref SystemInfo lpSystemInfo);
[StructLayout(LayoutKind.Sequential)]
internal struct SystemInfo
{
public ushort wProcessorArchitecture;
public ushort wReserved;
public uint dwPageSize;
public IntPtr lpMinimumApplicationAddress;
public IntPtr lpMaximumApplicationAddress;
public UIntPtr dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public ushort wProcessorLevel;
public ushort wProcessorRevision;
}
internal const ushort ProcessorArchitectureIntel = 0;
internal const ushort ProcessorArchitectureIa64 = 6;
internal const ushort ProcessorArchitectureAmd64 = 9;
internal const ushort ProcessorArchitectureUnknown = 0xFFFF;
GetNativeSystemInfo kehren Sie Informationen über die Maschine laufen lassen Sie. GetSystemInfo gibt Ihnen Informationen über die virtualisierte Umgebung zurück, in der Sie sich befinden (die gleiche wie GetNativeSystemInfo, wenn es keine gibt).
Ie: Auf 32-Bit-Windows haben Sie immer wProcessorArchitecture == ProcessorArchitectureIntel.
Auf 64-Bit-Windows werden Sie wProcessorArchitecture == ProcessorArchitectureIntel für GetSystemInfo, aber wProcessorArchitecture == ProcessorArchitectureAmd64 für GetNativeSystemInfo haben, wenn Sie sich als 32-Bit-Prozess ausgeführt werden.
Sie werden offensichtlich beide ProcessorArchitectureAmd64 sein, wenn Sie ein 64-Bit-Prozess auf 64-Bit-Windows sind.
Wenn Sie Code-Injektion implementieren, rufen Sie wahrscheinlich eine Menge von Win32-APIs? Könnte ich vorschlagen, dass die Verwendung von C++/CLI für das wird viel einfacher sein ... Sie enden damit.NET-Klassen genau so, als ob Sie sie in C# geschrieben hätten, aber Sie müssen sich nicht mit der Übersetzung aller Strukturen herumschlagen, da der C++ - Compiler das für Sie direkt aus den Win32-Header-Dateien erledigt. –
+1 zu Ben. Vergessen Sie auch nicht, dass 1.0/1.1/2.0 CLR nicht 2 Laufzeiten im Prozess hosten kann. Sie müssen also herausfinden, ob der Prozess verwalteten Code ausführt (oder ob später andere Versionen von verwaltetem Code ausgeführt werden) und passenden Code injizieren (Sie sollten mindestens 2.0 Version des Codes zusätzlich zu 4.0 haben) –
@Alexei: Kann nicht der gleiche Prozess .NET 4 zur gleichen Zeit wie 1.0/1.1/2.0 haben? Wenn Sie also .NET 4-Code injizieren, ist es egal, ob bereits eine CLR-Version geladen wurde. –