如何在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

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

运行可执行文件的语法?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何安装可执行文件

来自分类Dev

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

来自分类Dev

如何查找可执行文件

来自分类Dev

运行可执行文件

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

运行可执行文件的语法?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

    运行可执行文件的语法?

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

    如何安装可执行文件

  15. 15

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

  16. 16

    如何查找可执行文件

  17. 17

    运行可执行文件

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

    运行可执行文件的语法?

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档