【问题标题】:Using WMI, how can I determine whether a remote process is 32-bit or 64-bit?使用 WMI,如何确定远程进程是 32 位还是 64 位?
【发布时间】:2011-03-03 11:11:41
【问题描述】:

我有一个使用 WMI 从远程计算机查询的 win32_process 对象集合。如何判断每个进程是32位还是64位?

【问题讨论】:

标签: c# 64-bit wmi win32-process


【解决方案1】:

WMI 没有此功能。解决方案是通过 P/Invoke 使用IsWow64Process 测试每个进程的HandleThis code 应该可以帮助您了解这个想法。

【讨论】:

  • 谢谢。我会试一试。很奇怪,他们没有办法在流程类中识别它,甚至在 .NET API 中也没有。
【解决方案2】:

试试这个:

/// <summary>
/// Retrieves the platform information from the process architecture.
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static string GetPlatform(string path)
{
    string result = "";
    try
    {
        const int pePointerOffset = 60;
        const int machineOffset = 4;
        var data = new byte[4096];
        using (Stream s = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            s.Read(data, 0, 4096);
        }
        // Dos header is 64 bytes, last element, long (4 bytes) is the address of 
        // the PE header
        int peHeaderAddr = BitConverter.ToInt32(data, pePointerOffset);
        int machineUint = BitConverter.ToUInt16(data, peHeaderAddr +
                                                      machineOffset);
        result = ((MachineType) machineUint).ToString();
    }
    catch { }

    return result;
}



public enum MachineType
{
    Native = 0,
    X86 = 0x014c,
    Amd64 = 0x0200,
    X64 = 0x8664
}

【讨论】:

  • 请记住,此过程是准确的,但如果队列中有足够多的进程,它往往会有点繁重。我在另一个线程中调用每个进程来缓解 UI。
  • 您正在用 C# 编写此代码。 EXE 可以在 32 位或 64 位模式下运行的语言。您无法从 EXE 标头中分辨出来。
  • 可以编译到特定平台。否则,为什么同一个可执行文件有 2 个不同的版本?
  • 既然可以有两个平台都可以使用的一个,为什么还要有两个呢? AnyCPU 很酷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2010-12-29
  • 2011-04-16
  • 2011-04-04
相关资源
最近更新 更多