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

迈克尔·J·格雷

我有一个可以在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

在10.15.x中执行“不良CPU类型”可执行文件

来自分类Dev

Fiddler for Mac:可执行文件中的CPU类型错误:mono32

来自分类Dev

可执行文件中的CPU类型错误:wine @ macOS Catalina

来自分类Dev

OSX修复Selenium Chromedriver启动错误生成未知系统错误-86可执行文件中的CPU类型错误?

来自分类Dev

运行可执行文件的语法?

来自分类Dev

运行可执行文件

来自分类Dev

运行可执行文件的语法?

来自分类Dev

为什么我的64位可执行文件比32位可执行文件大3倍?

来自分类Dev

如何安装可执行文件

来自分类Dev

如何查找可执行文件

来自分类Dev

无法以32位可执行文件(在64位操作系统上)以编程方式访问EFS文件

来自分类Dev

如何在PowerShell中检查要安装的可执行文件是32位还是64位?

来自分类Dev

64位可执行文件的运行速度低于32位版本

来自分类Dev

无法在64位Ubuntu上运行32位动态可执行文件

来自分类Dev

在64位Debian Jessie上运行32位可执行文件

来自分类Dev

可执行文件包装程序,从PATH的末尾运行原始可执行文件

来自分类Dev

gfortran:在64位系统中编译32位可执行文件

来自分类Dev

没有设置可执行位时,如何从CD运行可执行文件?

来自分类Dev

访问.NET Core单个文件可执行文件中包含的文本文件

来自分类Dev

以编程方式修改(.net可执行文件的)元数据

来自分类Dev

以编程方式修改(.net可执行文件的)元数据

来自分类Dev

如何在vb.net可执行文件中创建和存储JSON对象?

来自分类Dev

从LLVM位代码生成Rust可执行文件

来自分类Dev

从LLVM位代码生成Rust可执行文件

来自分类Dev

在 .NET 中为可执行文件快捷方式设置热键

来自分类Dev

在Ubuntu 13.10中运行32位可执行文件

来自分类Dev

在Ubuntu 13.10中运行32位可执行文件

来自分类Dev

C ++可执行文件无法在Windows 7中运行-64位不兼容

Related 相关文章

  1. 1

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

  2. 2

    在10.15.x中执行“不良CPU类型”可执行文件

  3. 3

    Fiddler for Mac:可执行文件中的CPU类型错误:mono32

  4. 4

    可执行文件中的CPU类型错误:wine @ macOS Catalina

  5. 5

    OSX修复Selenium Chromedriver启动错误生成未知系统错误-86可执行文件中的CPU类型错误?

  6. 6

    运行可执行文件的语法?

  7. 7

    运行可执行文件

  8. 8

    运行可执行文件的语法?

  9. 9

    为什么我的64位可执行文件比32位可执行文件大3倍?

  10. 10

    如何安装可执行文件

  11. 11

    如何查找可执行文件

  12. 12

    无法以32位可执行文件(在64位操作系统上)以编程方式访问EFS文件

  13. 13

    如何在PowerShell中检查要安装的可执行文件是32位还是64位?

  14. 14

    64位可执行文件的运行速度低于32位版本

  15. 15

    无法在64位Ubuntu上运行32位动态可执行文件

  16. 16

    在64位Debian Jessie上运行32位可执行文件

  17. 17

    可执行文件包装程序,从PATH的末尾运行原始可执行文件

  18. 18

    gfortran:在64位系统中编译32位可执行文件

  19. 19

    没有设置可执行位时,如何从CD运行可执行文件?

  20. 20

    访问.NET Core单个文件可执行文件中包含的文本文件

  21. 21

    以编程方式修改(.net可执行文件的)元数据

  22. 22

    以编程方式修改(.net可执行文件的)元数据

  23. 23

    如何在vb.net可执行文件中创建和存储JSON对象?

  24. 24

    从LLVM位代码生成Rust可执行文件

  25. 25

    从LLVM位代码生成Rust可执行文件

  26. 26

    在 .NET 中为可执行文件快捷方式设置热键

  27. 27

    在Ubuntu 13.10中运行32位可执行文件

  28. 28

    在Ubuntu 13.10中运行32位可执行文件

  29. 29

    C ++可执行文件无法在Windows 7中运行-64位不兼容

热门标签

归档