gpt4 book ai didi

c# - 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

转载 作者:太空狗 更新时间:2023-10-29 19:39:25 25 4
gpt4 key购买 nike

我有一个 C# 应用程序可以在 32 位和 64 位处理器上运行。我试图枚举给定系统上所有进程的模块,当我试图从 64 位应用程序中枚举 32 位进程模块时,这就成了问题; Windows 或 .NET 禁止它。

我认为如果我可以从内部重新启动该应用程序会非常酷,但强制它以 32 位运行,然后它会正确枚举它在上次运行时错过的进程模块。

我如何以编程方式运行可执行文件并指示即使它是使用 任何 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)查询所需信息...请参阅第三篇提到 UseWMIToGetProcesses() 的帖子。

使用 EnumProcessModulesEx(在 Vista 及更高版本中支持...当您检测到您处于 64 位模式时),因为它可以枚举 32 位和 64 位进程列表(请参阅此链接的最末尾):

使用 CreateToolhelp32Snapshot 枚举进程(在定义结构时必须小心):

关于c# - 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17892623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com