Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
Konctantin
938 / 742 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
#1

Получить список модулей указанного процесса - C++

24.08.2012, 11:00. Просмотров 3235. Ответов 3

Доброго времени суток.
Возникла проблема с получением списка модулей процесса.
Пытаюсь получить так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
BOOL ListProcessModules(DWORD dwPID)
{
  HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
  MODULEENTRY32 me32;
 
  hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
  if(hModuleSnap == INVALID_HANDLE_VALUE)
    return FALSE;
 
  me32.dwSize = sizeof(MODULEENTRY32);
  if(!Module32First(hModuleSnap, &me32))
  {
    CloseHandle(hModuleSnap);
    return FALSE;
  }
 
  do
  {
    printf("MODULE NAME:     %s\n",   me32.szModule);
 
  }while(Module32Next(hModuleSnap, &me32));
 
  CloseHandle(hModuleSnap);
  return TRUE;
}
в итоге при вызове
C++
1
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
получаю результат INVALID_HANDLE_VALUE(0хFFFFFFFF) и ошибку 299.

Когда выполняю операцию для текущего процесса, все работает хорошо.

ОС Windows 7 x64, но не работает и в 32 разрядной.
В качестве параметра передавал
C++
1
CreateToolhelp32Snapshot(TH32CS_SNAPMODULE ...
и
C++
1
CreateToolhelp32Snapshot(TH32CS_SNAPMODULE32 ...
У кого есть какие соображения?

ЗЫЫ. на текущий процесс устанавливал привилегии отладки, не помогло.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 11:00
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Получить список модулей указанного процесса (C++):

Добавление элемента в список после указанного
Добавление нового элемента в список после указанного элемента по значению...

Найти последнее вхождение указанного значения в список
помогите с заданием нужен хоть приблизительный код - LastIndexOf ( поиск...

Вывести список автомобилей, указанного пользователем цвета и граничной цены
Необходимо написать программу, в которой пользователь вводит данные с...

MinGW - как вывести список установленных модулей с версией?
Имеем всем известный MinGW + MSYS. Задача: через Terminal MSYS (который...

Получить имя процесса.
Помогите разобраться с GetProcessName(). в MSDN нашел, но ничего не понял...

Как получить код завершения процесса
Привет форумчане. Подскажите если кто знает. Запускаю через CreateProcess...

3
edward_jonson
160 / 160 / 68
Регистрация: 23.02.2011
Сообщений: 392
24.08.2012, 15:42 #2
Скорее всего вы передаёте невалидный PID, ибо алгоритм правильный, к тому же с текущим процессом всё работает.

Добавлено через 11 минут
В качестве альтернативы можете попробовать EnumProcessModules()
0
-=ЮрА=-
24.08.2012, 15:54
  #3

Не по теме:

Konctantin, а код случайно не в DLL зашит?
PS: Кому интересно Мои MFC поделки
приложение MFC диспетчер процессов и окон

0
Konctantin
938 / 742 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
25.08.2012, 17:54  [ТС] #4
Скорее всего вы передаёте невалидный PID,
это исключено...

В общем как пишут забугорные форумы: нельзя вызывать/получить информацию о процессе х64 из процесса х32.
в итоге, функция по получению адреса базового модуля выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Gets the memory address where the base module was loaded.
DWORD GetBaseAddress(DWORD dwProcessID)
{
    DWORD dwAddress = NULL;
    HANDLE hthSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwProcessID);
    if (hthSnapshot) 
    {
        MODULEENTRY32 me = { sizeof(me) };
        if (Module32First(hthSnapshot, &me))
        {
            CloseHandle(hthSnapshot);
            dwAddress = (DWORD)me.modBaseAddr;
        }
    }
 
    return dwAddress;
}
ЗЫ. не пойму только почему все это не работало на х32 разрядной винде (
ЗЫЫ. Проверял на другом компе (с установленой VISTA 32)


Konctantin, а код случайно не в DLL зашит?
нет, это пока что все в исполняемом файле...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 17:54
Привет! Вот еще темы с решениями:

Получить имя или pid родительского процесса
Имеется имя файла И pid процесса. Нужно узнать имя файла ИЛИ pid его родителя ...

Подключение дополнительных модулей и работа с функциями из этих модулей
Опять с вопросами после частично прочитанной книги "C++ Для Чайников". )...

Добавление своей dll в список dll подгружаемых процессом чужого процесса
Вообще вопрос такой,как можно внедрить свою dll в список Import чужого не...

Получить список процессов
Как в c++ получить список процессов?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru