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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Свойства процессов и модулей, VC++ 2008 EE
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

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

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


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

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


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

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 содержится?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

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

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


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

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

не знаю..и соответсвенно, как работать с ним тоже не знаю..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 ;
}
}
}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

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

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


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

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

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


Гость






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

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


Профи
****

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

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


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

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

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


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


Гость






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

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

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

 





- Текстовая версия 23.10.2021 8:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name