Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR_02.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
200 Кб
Скачать
☆
  1. Получение информации о текущих процессах в ос семейства 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 для получения имени исполняемого файла.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]