我有一个可以在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);
}
//}
}
}
}
}
}
从外观上看,您的问题是IsWow64Process
在不可用/不合适时发出呼叫..尝试使用以下代码进行检测:
当您克服了这一点,便可以探索与平台无关的方式列出32位和64位进程模块的方法:
使用WMI(Windows Management Instrumentation)查询所需的信息...请参阅第3篇提到UseWMIToGetProcesses
()的文章。
使用EnumProcessModulesEx
(当您检测到您处于64位模式时,在Vista以及更高版本中受支持...),因为它可以枚举32位和64位进程列表(请参阅此链接的结尾):
使用CreateToolhelp32Snapshot
枚举进程(你必须在定义结构小心):
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句