如何从使用OpenProcess获取的进程句柄中获取信息,无论进程是32位还是64位?如何从句柄中确定进程是32位还是64位?
回答
是,IsWow64Process是烦人没用。这实际上意味着“启用了32位仿真”,并且如果您在32位操作系统上运行,则它不会返回false,它不需要任何仿真。
如果您知道您正在64位操作系统上运行,那么您只会从中获得良好的价值。这是棘手的发现。您运行64位的IntPtr.Size == 8测试证明,但它并不能证明它绝对是而不是的64位操作系统。该框架的64位版本可能尚未安装。或者,您的代码可能是从将Platform Target强制为x86的.exe文件运行的。这是而不是对于比特位感兴趣的代码并不常见。
您将需要P/Invoke GetNativeSystemInfo()。如果抛出(或GetProcAddress返回IntPtr.Zero),你就知道它是一个32位操作系统。如果没有,请检查SYSTEM_INFO.wProcessorArchitecture的值。对于x64,它将是9,对于Titanium是6,对于x86是0。所以,如果你得到9,然后使用IsWow64Process。访问pinvoke.net进行声明。
请注意,新的.NET 4.0 Environment.Is64BitOperatingSystem有同样的缺陷。
您可以使用下面的代码进行测试:
bool is64BitProcess = (IntPtr.Size == 8);
bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64();
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsWow64Process(
[In] IntPtr hProcess,
[Out] out bool wow64Process
);
[MethodImpl(MethodImplOptions.NoInlining)]
private static bool InternalCheckIsWow64()
{
if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
Environment.OSVersion.Version.Major >= 6)
{
using (Process p = Process.GetCurrentProcess())
{
bool retVal;
if (!IsWow64Process(p.Handle, out retVal))
{
return false;
}
return retVal;
}
}
else
{
return false;
}
}
+1,链接到文档:http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx – 2010-07-24 11:05:39
这也是我的想法起初,但是这个函数只是确定该进程是否在WoW64下运行,意味着在64Bit操作系统下的一个32Bit进程,我用WinXP SP3测试了它,并且它给了我一个假,因为它是一个不在W0W64下运行的32Bit进程。 – metafex 2010-07-24 11:45:37
这是C code涉及一些Python,但它给你一个想法。 这里有一个抛光版本:
int is64bit(long pid) {
SYSTEM_INFO sysinfo;
HANDLE hProcess;
BOOL isWow64;
// if OS is not 64 bit, no process will be either
GetNativeSystemInfo(&sysinfo);
if (sysinfo.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_AMD64)
return 0;
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);;
if (hProcess == NULL)
return -1;
if (! IsWow64Process(hProcess, &isWow64)) {
CloseHandle(hProcess);
return -1;
}
CloseHandle(hProcess);
if (isWow64)
return 0;
else
return 1;
}
- 1. 如何以编程方式确定特定进程是32位还是64位
- 2. 如何确定进程ID(PID)是32位还是64位应用程序?
- 3. 使用WMI,我如何确定远程进程是32位还是64位?
- 4. 如何确定System.Diagnostics.Process是32位还是64位?
- 5. WMI和Win32_Process - 确定是32位还是64位?
- 6. 确定当前的PowerShell Process是32位还是64位?
- 7. 确定可执行文件(或库)是32位还是64位
- 8. 有没有办法检查进程是64位还是32位?
- 9. 如何判断我写的程序是32位还是64位?
- 10. 如何检测Cocoa应用程序是32位还是64位?
- 11. 无论系统是32位还是64位,uint均为32位?
- 12. 如何确定我的操作系统是32位还是64位?
- 13. 如何检测,如果CPU是32位还是64位
- 14. 如何检查WebSphere是32位还是64位?
- 15. 如何检查我的Perl安装是32位还是64位?
- 16. 如何检查安装的wxPython是32位还是64位?
- 17. 如何找到它是32位还是64位? Tomcat
- 18. 如何检查安装的Anaconda是32位还是64位?
- 19. 知道程序集是64位还是32位
- 20. 64位OS/32位进程
- 21. 我如何检查编译的二进制文件是32位还是64位?
- 22. 如何从32位或64位进程启动64位PowerShell进程?
- 23. 确定可执行文件(或库)是32位还是64位(在Windows上)
- 24. 确定Java安装是32位还是64位的Windows bat文件?
- 25. 如何从32位进程启动64位进程
- 26. java-service-wrapper如何决定是使用32位还是64位VM?
- 27. 如何判断应用程序是以32位还是64位模式运行?
- 28. 确定是否编译ELF对象是32位或64位
- 29. 如何以编程方式确定安装的SQL Server是32位还是64位
- 30. 如何确定我正在安装的应用程序是32位还是64位?
它唯一的问题是,无论架构如何,都支持从WinXP向上支持MSDN的GetNativeSystemInfo。另外,我手边没有没有AMD64/EMT64的机器,但是wProcessorArchitecture不对应于Processor Architecure而不是安装的系统之一? 编辑:我不知道为什么你们努力给.net解决方案,当我用C和WinAPI标记它,只是说 – metafex 2010-07-24 14:00:25
那么,你不需要P/Invoke。鉴于你有合适的处理器来测试这个,你可以在大约10分钟内回答你自己的问题吗? – 2010-07-24 14:45:43
好的,检查了SYSTEM_INFO.wProcessorArchitecture,它对应于系统的信息,而不是CPU的信息,所以这个解决方案的工作原理,谢谢。 – metafex 2010-07-24 15:02:49