Как перечислить 32-битные модули процесса из 64-битного приложения - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть код:

        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 Ответ

1 голос
/ 20 сентября 2011

У меня та же проблема в моем приложении, хотя я думаю, что вы получили его задом наперед (см. Комментарий к вашему вопросу).

На самом деле, невозможно перечислить модули 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.

Это похоже, что другие также обнаружили эту проблему.

...