Как перечислить 32-битные модули процесса из 64-битного приложения
У меня есть код:
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);
}
}
}
Мое приложение настроено на конфигурацию "Любой процессор", поэтому оно должно работать как 64-битный процесс на моей Win7 x64. Я попытался перечислить модули iexplore.exe (32-битная версия). Мой вопрос: как перечислить модули 32-битных приложений из 64-битных приложений? Он возвращает только библиотеки WoW.
1 ответ
У меня та же проблема в моем приложении, хотя я думаю, что вы получили его задом наперед (см. Комментарий к вашему вопросу).
На самом деле, невозможно перечислить модули 32-битного процесса в 64-битной Windows, если ваш собственный процесс является 64-битным.
Вы увидите только следующие модули (которые являются единственными 64-битными модулями в 32-битном процессе):
- Основной модуль (т.е. исполняемый файл)
- ntdll.dll
- Wow64.dll
- Wow64cpu.dll
- Wow64win.dll
Что, скорее всего, связано с тем, что Process.Modules
использует EnumProcessModules
Внутренний Win32 API, который имеет ограничения при работе с 32/64 бит. MSDN предлагает (для нативных приложений) использовать EnumProcessModulesEx
, который вы могли бы P/Invoke, а также.
Похоже, что другие тоже обнаружили эту проблему.