Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
Konctantin
 Аватар для Konctantin
917 / 721 / 63
Регистрация: 12.04.2009
Сообщений: 1,700
24.08.2012, 11:00     Получить список модулей указанного процесса #1
Доброго времени суток.
Возникла проблема с получением списка модулей процесса.
Пытаюсь получить так:
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 ...
У кого есть какие соображения?

ЗЫЫ. на текущий процесс устанавливал привилегии отладки, не помогло.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
edward_jonson
 Аватар для edward_jonson
157 / 157 / 25
Регистрация: 23.02.2011
Сообщений: 388
24.08.2012, 15:42     Получить список модулей указанного процесса #2
Скорее всего вы передаёте невалидный PID, ибо алгоритм правильный, к тому же с текущим процессом всё работает.

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

Не по теме:

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

Konctantin
 Аватар для Konctantin
917 / 721 / 63
Регистрация: 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 зашит?
нет, это пока что все в исполняемом файле...
Yandex
Объявления
25.08.2012, 17:54     Получить список модулей указанного процесса
Ответ Создать тему

Метки
baseaddress, createtoolhelp32snapshot, mainmodule, processmodules, th32cs_snapmodule
Опции темы

Текущее время: 11:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru