我有一个可在 32 位和 64 位处理器上运行的 C# 应用程序。我试图枚举给定系统上所有进程的模块,当尝试从 64 位应用程序枚举 32 位进程模块时,这会出现问题; Windows 或.NET 禁止它。
我认为如果我可以从应用程序内部重新启动应用程序,但强制它以 32 位运行,然后它会正确枚举上次运行时错过的进程模块,那就太酷了。
我如何以编程方式运行可执行文件并表明即使它是用ANY CPU
配置,它应该作为 32 位进程运行?
下面的代码抛出一个System.ComponentModel.Win32Exception
文本“32 位进程无法访问 64 位进程的模块”。
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(
[In] IntPtr hProcess,
[Out] out bool lpSystemInfo);
private static void Main()
{
Process[] processes = Process.GetProcesses();
using (FileStream fileStream = new FileStream("ProcessModulesDump.dat", FileMode.Create, FileAccess.Write, FileShare.None))
{
using (GZipStream gzipStream = new GZipStream(fileStream, CompressionLevel.Optimal))
{
using (TextWriter writer = new StreamWriter(gzipStream))
{
foreach (Process process in processes)
{
writer.WriteLine("{0} - {1}", process.Id, process.ProcessName);
//bool lpSystemInfo;
//if ((Environment.Is64BitProcess &&
IsWow64Process(process.Handle, out lpSystemInfo)) ||
(!Environment.Is64BitProcess &&
!IsWow64Process(process.Handle, out lpSystemInfo)))
//{
foreach (ProcessModule module in process.Modules)
{
writer.WriteLine("\t{0} - {1} ({2})",
module.BaseAddress,
module.ModuleName,
module.FileName);
}
//}
}
}
}
}
}