Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Получение и использование процессом ссылок на себя






В Win32 имеется несколько функций, которым необходим описатель процесса. Поток процесса может получить описатель своего процесса, используя вызов функции GetCurrentProcess: Thandle;

Для изменения приоритета выполнения процесса используется функция

SetPriorityClass(GetCurrentProcess, Значение_класса_приоритета);

 

Мониторинг процессов и потоков. Получение списка процессов, выполняющихся в системе

Задача получения списка выполняющихся в системе процессов является одной из основных при выполнении мониторинга ресурсов, как отдельного ПК, так и ЛВС в целом, поэтому для ее решения разработано значительное количество утилит, имеется встроенное системное средство – диспетчер задач.

Все перечисленные программные средства используют как функции Win32 API (Application Program Interface – прикладной программный интерфейс), так и функции еще одного базового интерфейса, называемого Native API (естественный API). Внешняя часть Native API пользовательского режима содержится в модуле ntdll.dll, «настоящий» интерфейс реализован в ntoskernel.exe – ядре операционной системы NT (NT operation system kernel). Функции Win32 API, как правило, обращаются к функциям Native API, отбрасывая часть полученной от них информации. Поэтому использование функций Native API позволяет получить, вообще говоря, более эффективное ПО.

К функциям Win32 API для получения информации о выполняющихся в системе процессах относятся функции CreateToolhelp32Snapshot(), Process32First(), Process32Next(), Thread32First (), Thread32Next(), Module32First(), Module32Next(), Heap32ListFirst(), Heap32ListNext() и некоторые другие. Самая известная из функций Native API для доступа к содержимому многих важных внутренних структур операционной системы, таких как списки процессов, потоков, дескрипторов, драйверов и т. п. – функция NtQuerySystemInformation ().

Использование функций CreateToolHelp32Snapshot () и Process32xxxx() для получения списка имен процессов

Первый этап получения информации о выполняющихся в системе процессах - получение снимка (snapshot) системы, который содержит информацию о состоянии системы в момент выполнения снимка.

Снимок создается с помощью функции CreateToolhelp32Snapshot (dwFlags, th32ProcessID), первый аргумент определяет, какая информация будет записана в снимок - возможные значения dwFlags приведены в таблице.

Таблица 1

Флаг - dwFlags Описание
TH32CS_SNAPHEAPLIST В снимок включается информация о динамически распределяемой памяти указанного процесса
TH32CS_SNAPPROCESS В снимок включается список процессов, присутствующих в системе
TH32CS_SNAPTHREAD В снимок включается список потоков
TH32CS_SNAPMODULE В снимок включается список модулей, принадлежащих указанному процессу
TH32CS_SNAPALL В снимок включается список куч, процессов, потоков и модулей

 

Второй аргумент определяет процесс (указанием его идентификатора), информация о котором необходима (если требуется список куч или модулей). В остальных случаях он игнорируется.

Второй этап - извлечение из снимка списка процессов. Для выполнения этой операции служат функции:

BOOL Process32First (HANDLE hSnapshot, LPPROCESSENTRY32 lppe);

BOOL Process32Next (HANDLE hSnapshot, LPPROCESSENTRY32 lppe);

Первый аргумент - хэндл созданного снимка (возвращает функция CreateToolhelp32Snapshot).

Второй аргумент- структура, содержащая 10 полей:

Первое поле этой структуры - dwSize - должно перед вызовом функции содержать размер структуры в байтах - sizeof (PROCESSENTRY32).

Второе поле - cntUsage - содержит число ссылок на процесс, то есть число потоков, которые в настоящий момент используют какие-либо данные процесса.

Третье поле - th32ProcessID - является идентификатором процесса.

Шестое поле - cntThreads - определяет число потоков, принадлежащих процессу.

Седьмое поле - th32ParentProcessID - является идентификатором родительского по отношению к текущему процесса.

Поле pcPriClassBase cодержит базовый приоритет процесса.

Поле szExeFile[MAX_PATH] cодержит имя файла, создавшего процесс.

Для того, чтобы получить информацию о первом процессе в снимке, необходимо вызвать функцию Process32First. В случае успешного завершения функция возвращает TRUE. Для того, чтобы просмотреть все оставшиеся процессы, нужно вызывать функцию Process32Next до тех пор, пока она не возвратит FALSE.

 

Пример 1. Получить список имен выполняющихся в системе процессов, используя рассмотренные выше функции.

На форме разместить компоненты ListBox, Label и Button. В список директив проекта добавить директиву

#include < tlhelp32.h>

Обработчик события OnClick кнопки должен иметь вид:

// получение снимка процессов

HANDLE HS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

PROCESSENTRY32 P;

ListBox1-> Clear();

// задать размер структуры

P.dwSize = sizeof(PROCESSENTRY32);

// получение имен процессов и их запись в ListBox1

if (Process32First(HS, & P))

{

do

{

ListBox1-> Items-> Add (P.szExeFile);

}

while (Process32Next (HS, & P));

}

// освобождение ресурса – снимка состояния системы

CloseHandle (HS);

 

1.3.2. Создание и завершение процессов и потоков.

Для создания процесса используются три функции:

1. WinExec (‘путь и имя.exe файла’, вид окна приложения);

2. ExecuteFile (‘путь и имя файла’, ’’, ’’, вид окна приложения);

3. CreateProcess ().

Первая функция - устаревшая, поддерживается для совместимости с Windows 3.1. Вторая функция позволяет запустить приложение, указав имя и тип файла, который должен быть обработан.

Для завершения процесса используются две функции:

1. ExitProcess (код завершения);

2. TerminateProcess (Handle, код завершения).

Первая функция обеспечивает нормальное завершение процесса, вторая должна использоваться для аварийного завершения.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.