8. Help по функціях API - www.nan32asm.cjb.net
9. Microsoft Windows Help - Win32 Programmers Reference
10. Технічна документація Microsoft - MSDN
11. www.win32asm.newmail.ru/
12. Книга по програмуванню під Windows - www.win32asm.cjb.net
Лабораторна робота №4
Тема: Керування процесами і потоками у середовищі ОС Windows.
Мета: Навчитись керувати процесами та потоками в середовищі ОС Windows використовуючи пакет MASM32.
Основні теоретичні відомості
Функції WinAPI забезпечують широкі можливості для отримання інформації про запущені процеси та потоки і для керування ними.
Функція CreateToolhelp32Snapshot дозволяє отримати список запущених процесів і потоків та детальну інформацію про вказаний процес. Формат виклику:
invoke CreateToolhelp32Snapshot, dwFlags, th32ProcessID
Коли встановити параметр-індетифікатор процесу th32ProcessID, то можна отримати детальну інформацію про заданий процес. А саме, перелік модулів з яких складається процес і список хіпів виділених ним.
Примітка. Хіп (Heap) – динамічна область пам'яті виділена процесом.
Параметри функції CreateToolhelp32Snapshot:
dwFlags (вхідний) - Частини системи, які включатимуться в список (snapshot). Цей параметр може приймати одне з перелічених значень:
|
|
Значення | Пояснення |
TH32CS_INHERIT | Позначає, що дескриптор списку є наслідуваний (передається породженому процесу). |
TH32CS_SNAPALL | Включає всі процеси та потоки в системі плюс хіпи та модулі для процеса вказаного в th32ProcessID. Еквівалентно вказанню значень TH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE, TH32CS_SNAPPROCESS, TH32CS_SNAPTHREAD. |
TH32CS_SNAPHEAPLIST | Включає всі хіпи для процеса вказаного в th32ProcessID. Для операції перегляду хіпів, див. функцію Heap32ListFirst. |
TH32CS_SNAPMODULE | Включає всі модулі для процеса вказаного в th32ProcessID. Для операції перегляду модулів, див. функцію Module32First. |
TH32CS_SNAPPROCESS | Включає всі запущені процеси в системі. Для операції перегляду процесів див. функцію Process32First. |
TH32CS_SNAPTHREAD | Включає всі діючі потоки в системі. Для операції перегляду потоків див. функцію Thread32First. Щоб ідентифікувати якому процесу відповідає даний потік, зверністься до поля th32OwnerProcessID в структурі THREADENTRY32. |
th32ProcessID (вхідний) - Ідентифікатор процесу, який використовується при побудові списку. Цей параметр може бути нульовим, щоб ідентифікувати поточний процес. Даний параметр використовується лише для значень TH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE або TH32CS_SNAPALL. У випадку перегляду всіх доспупних процесів або потоків в системі (значення TH32CS_SNAPPROCESS або TH32CS_SNAPTHREAD) він ігнорується.
Вихідне значення (регістр ЕАХ)
При успішному виконанні функція повертає дескриптор списку. При помилці функція повертає INVALID_HANDLE_VALUE. Щоб отримати детальнішу інформацію про помилку визвіть функцію GetLastError.
Примітка. Щоб здійснити перегляд хіпів або модулів для всіх процесів в системі, вкажіть TH32CS_SNAPALL для dwFlags і встановість th32ProcessID = 0. Потім для кожного процесу в списку викличте функцію CreateToolhelp32Snapshot ще раз, задавши його ідентифікатор процесу та TH32CS_SNAPHEAPLIST або TH32_SNAPMODULE (хіпи і модулі відповідно).
|
|
Для завершення роботи з списком треба викликати функцію CloseHandle:
invoke CloseHandle, SnapshotHandle
де SnapshotHandle – дескриптор списку
Повернутий функцією список перегдядається з допомогою інших API функцій.
Перегляд процесів
Для перегляду запущених процесів використовуються дві функції Process32First та Process32Next. Перша призначена для отримання даних про найперший процес в списку, а друга для всіх наступних. Ці дві функції мають однакові параметри:
invoke Process32First, SnapshotHandle, addr ProcEntry
invoke Process32Next, SnapshotHandle, addr ProcEntry
де addr ProcEntry – адреса об’єкта структури PROCESSENTRY32. Ця структура описує один запис із списку процесів, які знаходилися в системному адресному просторі після виконання функції CreateToolhelp32Snapshot.
Коли вихідний параметер цих функцій (регістр ЕАХ) рівний TRUE, то успішне виконання, коли FALSE – помилка. Інформацію про помилку можна дізнатися з допомого функції GetLastError.
STRUC PROCESSENTRY32
dwSize DWORD?; Довжина структури в байтах
cntUsage DWORD?; Кількість посилань на процес (зазвичай 1)
th32ProcessID DWORD?; Ідентифікатор процесу
th32DefaultHeapID DWORD?; Ідентифікатор хіпу по замовч. (для вн. використ.)
th32ModuleID DWORD?; Ідентифікатор модуля процесу (зазвичай 0)
cntThreads DWORD?; Кількість запущених процесом потоків
th32ParentProcessID DWORD?; Ідентифікатор батьківського процесу(зазвичай 0)
pcPriClassBase DWORD?; Базовий пріоритет потоків створених процесом
; (зазвичай THREAD_PRIORITY_NORMAL)
dwFlags DWORD?; Зарезервовано системою
szExeFile db MAX_PATH dup (?); Стрічка завершена нулем, яка містить
; шлях і назву виконуваного файлу
th32MemoryBase DWORD?; Адреса, куди завантажено виконуваний файл
th32AccessKey DWORD?; Масив з бітів, кожен з яких визначає права
; доступу до адресного простору процесу
ENDS PROCESSENTRY32
Зауваження:
Перед викликом функції Process32First, потрібно встановити dwSize рівним sizeof(PROCESSENTRY32). Коли цього не зробити функція не буде працювати.
Щоб використовувати ідентифікатори процесів та потоків з GetThreadTimes та іншими функціями, які керують процесами, ідентифікатори можна задавати безпосередньо. Однак доступ різних процесів один до одного (керування) вимагає використання функції SetProcPermissions.
Перегляд потоків
Щоб переглянути діючі потоки зі списку використовуються функції Thread32First і Thread32Next. Вони аналогічні вищеописаним Process32First і Process32Next з тією різницею, що працюють з структурою THREADENTRY32.
invoke Thread32First, SnapshotHandle, addr ThrEntry
invoke Thread32Next, SnapshotHandle, addr ThrEntry
де addr ThrEntry – адреса об’єкта структури THREADENTRY32. Ця структура описує один запис із списку потоків, які знаходилися в адресному просторі після виконання функції CreateToolhelp32Snapshot.