如何从 64 位应用程序枚举 32 位进程的模块
我有代码:
foreach (var process in Process.GetProcesses()) {
if (process.ProcessName.ToLowerInvariant().StartsWith("iexplore")) {
foreach (ProcessModule module in process.Modules) {
string descr = module.FileVersionInfo.FileDescription;
MessageBox.Show(module.FileName);
}
}
}
我的应用程序设置为“任何 CPU”配置,因此它应该在我的 Win7 x64 上作为 64 位进程运行。我尝试枚举 iexplore.exe 的模块(32 位版本)。我的问题是如何从 64 位应用程序枚举 32 位应用程序的模块?它仅返回 WoW dll。
I have the code:
foreach (var process in Process.GetProcesses()) {
if (process.ProcessName.ToLowerInvariant().StartsWith("iexplore")) {
foreach (ProcessModule module in process.Modules) {
string descr = module.FileVersionInfo.FileDescription;
MessageBox.Show(module.FileName);
}
}
}
My app is set on "Any CPU" configuration, so it should run as 64bit process on my Win7 x64. I tried to enumerate iexplore.exe's modules (the 32bit version). My question is how to enum the modules of 32bit apps from 64bit app? It returns only the WoW dlls.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我在我的应用程序中遇到了同样的问题,尽管我认为您搞错了(请参阅可能对您的问题的评论)。
实际上,如果您自己的进程是64位进程,则不可能在64位Windows上枚举32位进程的模块。
您只会看到以下模块(这是 32 位进程中唯一的 64 位模块):
这很可能是由于以下事实
Process.Modules
使用EnumProcessModules
< /a> 内部 Win32 API,在使用 32/64 位时有限制。 MSDN 建议(对于本机应用程序)使用EnumProcessModulesEx
,您也可以 P/Invoke。看起来其他人已经发现了这一点问题也是如此。
I have the same problem in my application, although I think you got it backwards (see may comment to your question).
Actually, it is not possible to enumerate the modules of 32bit process on 64bit Windows, if your own process is a 64bit process.
You'll only see the following modules (which are the only 64bit modules in the 32 bit process):
Which is most likely due to the fact that
Process.Modules
uses theEnumProcessModules
Win32 API internally, which has limitations when working with 32/64 bit. MSDN suggests (for native applications) to useEnumProcessModulesEx
, which you could P/Invoke as well.It looks like others have discovered this issue as well.