IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Свойства процессов и модулей, VC++ 2008 EE
18192123
сообщение 25.10.2008 21:11
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Задание вот такое: получить список процессов, модулей и их свойств.
Из msdn нашла, как получить список того и того.
Подскажите пожалуйста, как теперь получить их свойства?


void PrintProcessNameAndID( DWORD processID, unsigned int i)
{
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
    // Get a handle to the process.
    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );
    // Get the process name.
    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;
        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
             &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName, 
                               sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }
    // Print the process name and identifier.
    wsprintf(pszStrPID,_T("%d %s  (PID: %u)"), i,szProcessName, processID);
    SendMessage(hListBoxAllInfo,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)pszStrPID);
    //_tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );
    CloseHandle( hProcess );
}


void PrintModules( DWORD processID )
{
    HMODULE hMods[1024];
    HANDLE hProcess;
    DWORD cbNeeded;
    unsigned int i;

    // Print the process identifier.
    wsprintf(pszStrPID,_T("     Process ID: %u"), processID);
    SendMessage(hListBoxAllInfo,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)pszStrPID);
    //printf( "     Process ID: %u", processID );//<----
    // Get a list of all the modules in this process.
    hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                            PROCESS_VM_READ,
                            FALSE, processID );
    if (NULL == hProcess)
        return;
    if( EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
    {
        for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
        {
            TCHAR szModName[MAX_PATH];
            // Get the full path to the module's file.
            if ( GetModuleFileNameEx(hProcess, hMods[i], szModName,
                                     sizeof(szModName)/sizeof(TCHAR)))
            {
                // Print the module name and handle value.
                 wsprintf(pszStrPID,_T("%s (0x%08X)"),szModName, hMods[i]);
                 SendMessage(hListBoxAllInfo,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)pszStrPID);
               // _tprintf(TEXT("\t%s (0x%08X)\n"),
                 //        szModName, hMods[i]);
            }
        }
    }

    CloseHandle( hProcess );
}

void OnClickButAllData(HWND hwnd)
{
  RECT Rect;
  GetClientRect(hwnd,&Rect);
  unsigned int i;
  // Get the list of process identifiers.
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    wsprintf(pszStrPID,_T("_Name_of_Process__(PID)_"));
    SendMessage(hListBoxAllInfo,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)pszStrPID);
    if (!EnumProcesses(aProcesses, sizeof(aProcesses),&cbNeeded))
		MessageBox(hWndMain,TEXT("Error!"),TEXT("WARNING"),MB_ICONERROR);
    // Calculate how many process identifiers were returned.
    cProcesses = cbNeeded / sizeof(DWORD);
    wsprintf(pszStrPID,_T("There are %d processes:"),cProcesses-1);
    SendMessage(hListBoxAllInfo,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)pszStrPID);
    // Print the name and process identifier for each process.
	for ( i = 0; i < cProcesses; i++ )
        if( aProcesses[i] != 0 )
		{
            PrintProcessNameAndID( aProcesses[i],i);
			PrintModules( aProcesses[i]);
		}

   }


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 26.10.2008 17:21
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Для получения информации о модулях нашла функцию GetModuleInformation(), реализовала её.
А для получения информации о процессах хочу использовать QueryWorkingSet().

BOOL QueryWorkingSet(
  HANDLE hProcess,
  PVOID pv,
  DWORD cb
);


С первым параметром понятно, но объясните пожалуйста - как интерпретировать 2-й? И как задать 3-й?

Сообщение отредактировано: 18192123 - 26.10.2008 17:21
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.10.2008 18:39
Сообщение #3


Гость






Цитата
как интерпретировать 2-й? И как задать 3-й?
Вот так:
// dwProcessId - это PID, для которого должна быть QueryWorkingSet
	HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwProcessId );
	PVOID pv[MAX_COUNT] = {0};	// MAX_COUNT - обычный #define... Скажем, 500 или 1000

	if ( !QueryWorkingSet ( hProcess, pv, sizeof(pv) ) )
	{
		// Можно работать с pv
	}

Кстати, а ты знаешь, что именно возвращает функция QueryWorkingSet? Что в массиве pv содержится?
 К началу страницы 
+ Ответить 
18192123
сообщение 26.10.2008 19:59
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 26.10.2008 18:39) *

Кстати, а ты знаешь, что именно возвращает функция QueryWorkingSet? Что в массиве pv содержится?

не знаю..и соответсвенно, как работать с ним тоже не знаю..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.10.2008 20:43
Сообщение #5


Гость






Цитата(Microsoft.com)
The working set of a process is the set of memory pages currently visible to the process in physical RAM memory.
Набор страниц памяти, видимых процессу, в физической памяти...

		PVOID pv[MAX_COUNT] = { 0 } ;
		char s[128];

		if (!QueryWorkingSet ( hProcess, pv, sizeof(pv) )) {
			// Выдать сообщение о сбое QueryWorkingSet
		}
		else {
			for(unsigned int i = 0;i < MAX_COUNT; i++) {
				if(pv[i] != NULL ) {
					if(i == 0) {
					    sprintf(s, "Всего записей: 0x%x\n", pv[i]);
					    // s выводится на экран/memo/listbox
					}
					else {
					    sprintf(s, "\t0x%-4x  pv : 0x%X\n", i, (DWORD)pv[i]);
					    // s выводится на экран/memo/listbox
					}
				}
				else
				{
					break ;
				}
			}
		}
 К началу страницы 
+ Ответить 
18192123
сообщение 26.10.2008 22:16
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


хм...а у меня строки из каких-то совершенно посторонних символов вывелись...
я к коду из предыдущего поста просто добавила вывод в listbox...

SendMessage(hListBoxAllInfo,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.10.2008 22:58
Сообщение #7


Гость






Цитата
а у меня строки из каких-то совершенно посторонних символов вывелись...
Вот такие, примерно?
Прикрепленное изображение

Так это оно и есть, список страниц памяти, видимых твоему процессу... А ты что ожидала увидеть?
 К началу страницы 
+ Ответить 
18192123
сообщение 27.10.2008 0:28
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 26.10.2008 22:58) *

Вот такие, примерно?
..
Так это оно и есть, список страниц памяти, видимых твоему процессу... А ты что ожидала увидеть?

если бы такие...вот такие вот..


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.10.2008 10:05
Сообщение #9


Гость






Цитата
вот такие вот..
А, ну так это из-за юникода:

		wchar_t s[128];
		// ...
		wsprintf(s, L"\t0x%-4x  pv : 0x%X\n", i, (DWORD)pv[i]);
и все будет отображаться...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 19.07.2025 6:54
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"