- •Лабораторная работа № 2 Мониторинг состояния системы
- •Краткие теоретические сведения
- •Получение информации о текущих процессах в ос семейства unix
- •Получение информации о текущих процессах в ос семейства windows
- •Системные требования
- •Функции определения состояния виртуальной памяти в win32 api
- •Функции определения параметров подсистемы управления памятью в unix
- •Задание
Получение информации о текущих процессах в ос семейства windows
WIN32 API содержит функцию EnumProcesses, возвращающую идентификатор для каждого процесса, работающего в системе.
BOOL EnumProcesses(
DWORD* lpidProcess,
DWORD cb,
DWORD* cbNeeded
);
Параметры
lpidProcess
[out] Указатель на массив, содержащий список получаемых идентификаторов.
cb
[in] Размер массива lpidProcess в байтах.
cbNeeded
[out] Число байт, возвращенных в массиве lpidProcess.
Возвращаемое значение
Ненулевое при нормальном завершении функции, нулевое – при возникновении ошибки. Для получения дополнительной информации об ошибке следует воспользоваться функцией GetLastError.
Примечание
В приведенном ниже примере кода показано, каким образом следует выделить память для массива lpidProcess . Для получения дескрипторов процессов по полученным идентификаторам, следует воспользоваться функцией OpenProcess.
Пример кода
#include <windows.h>
#include <stdio.h>
#include "psapi.h"
void PrintProcessNameAndID( DWORD processID )
{
char szProcessName[MAX_PATH] = "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) );
}
else return;
}
else return;
// Print the process name and identifier.
printf( "%s (Process ID: %u)\n", szProcessName, processID );
CloseHandle( hProcess );
}
void main( )
{
// Get the list of process identifiers.
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return;
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded / sizeof(DWORD);
// Print the name and process identifier for each process.
for ( i = 0; i < cProcesses; i++ )
PrintProcessNameAndID( aProcesses[i] );
}
Функция main получает список процессов с помощью EnumProcesses. Для каждого процесса выполняется вызов функции PrintProcessNameAndID с передачей идентификатора процесса. PrintProcessNameAndID вызывает OpenProcess для получения дескриптора процесса. Если вызов OpenProcess вернул ошибку, в выводе указывается только идентификатор процесса. Например, OpenProcess не возвращает идентификатор для процессов, находящихся в состоянии ожидания или для CSRSS (client/server run-time subsystem) процессов, поскольку для них предусмотрено ограничение доступа, не позволяющее открывать данные процессы на пользовательском уровне (access restrictions for user-level code). Затем PrintProcessNameAndID вызывает функцию EnumProcessModules для получения дескрипторов модулей и GetModuleBaseName для получения имени исполняемого файла.
