【问题标题】:How to determine whether a System.Diagnostics.Process is 32 or 64 bit?如何确定 System.Diagnostics.Process 是 32 位还是 64 位?
【发布时间】:2011-04-04 07:08:31
【问题描述】:

我试过了:

process.MainModule.FileName.Contains("x86")

但它为 x64 进程抛出了异常:

Win32Exception: ReadProcessMemory 或 WriteProcessMemory 请求只完成了一部分

【问题讨论】:

  • 你问错问题了。真正的问题应该是:“我是如何搞砸 ReadProcessMemory 调用的?”
  • @Hans 只要回答了问题标题,我就根本不在乎这个电话。我列出的问题只是一种回答标题的方法。
  • @Jesse 你指出的问题询问的是当前进程,而不是另一个进程。
  • 看我的回答。由于 OP 不清楚,它考虑了其他流程。

标签: .net windows process 64-bit system.diagnostics


【解决方案1】:

您需要通过 P/Invoke 致电IsWow64Process

[DllImport( "kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi )]
[return: MarshalAs( UnmanagedType.Bool )]
public static extern bool IsWow64Process( [In] IntPtr processHandle, [Out, MarshalAs( UnmanagedType.Bool )] out bool wow64Process );

这里有一个助手可以让调用更容易一些:

public static bool Is64BitProcess( this Process process )
{
    if ( !Environment.Is64BitOperatingSystem )
        return false;

    bool isWow64Process;
    if ( !IsWow64Process( process.Handle, out isWow64Process ) )
        throw new Win32Exception( Marshal.GetLastWin32Error() );

    return !isWow64Process;
}

【讨论】:

  • 此方法在 32 位 Windows 中会失败
  • 在 32 位 Windows 上,所有进程都是 32 位的,因此无需进行检查。我已编辑 Is64BitProcess 以反映这一点。
  • 在调用 WinAPI 时使用 Process.SafeHandle 属性来防止 GC 清理 process.Handle。
【解决方案2】:

Environment.Is64BitProcess 可能就是您要找的。​​p>

【讨论】:

  • 那只告诉你调用进程是否是 64 位的,我认为 OP 想知道另一个进程是否是 64 位
  • @Phil:是的,我不确定 OP 的意图是什么。我认为他可以投反对票或发表评论。
【解决方案3】:

WMI 的 Win32_ProcessSystem.Diagnostics.Process 都不提供任何显式属性。

如何遍历已加载的模块 (Process.Modules),32 位进程将加载 %WinDir%\syswow64\kernel32.dll,而 64 位进程将从 %WinDir%\system32\kernel32.dll 加载它(这是 每个 em> Windows 进程加载)。

注意。当然,这个测试在 x86 操作系统实例上会失败。

【讨论】:

  • 如果在 32 位进程中运行,同时访问 64 位进程的模块并出现 Win32Exception "A 32 bit processes cannot access modules of a 64 bit process." 也会失败。
猜你喜欢
  • 2011-04-19
  • 2010-10-23
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2010-11-27
  • 2011-07-03
相关资源
最近更新 更多