Робота з процесами. Функції CreateProcess і TerminateProcess
Робота з процесами. Функції CreateProcess і TerminateProcess.
Для того щоб зі звичайного будь-якої програми створити процес нам необхідна функція CreateProcess.
BOOL CreateProcess (
LPCTSTR lpApplicationName, // покажчик на ім'я виконуваного файлу
LPTSTR lpCommandLine, // покажчик на командний рядок
LPSECURITY_ATTRIBUTES lpProcessAttributes, // покажчик на атрибути безпеки процесу
LPSECURITY_ATTRIBUTES lpThreadAttributes, // покажчик на атрибути безпеки потоку
BOOL bInheritHandles, // покажчик на прапор успадкування
DWORD dwCreationFlags, // прапори створення
LPVOID lpEnvironment, // покажчик на новий блок середовища
LPCTSTR lpCurrentDirectory, // покажчик на ім'я поточного каталогу
LPSTARTUPINFO lpStartupInfo, // покажчик на структуру STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // покажчик на структуру PROCESS_INFORMATION
);
Функція CreateProcess створює новий процес і його головний потік. Новий процес виконує зазначений виконуваний файл. Функція CreateProcess призначена для запуску нової програми. Функції WinExec і LoadModule також працюють, але не пропонують таких можливостей, як CreateProcess.
На додаток до створення процесу, CreateProcess також створює потоковий об'єкт. Потік створюється з ініціалізації стеком, чий розмір описаний в заголовку образу виконуваного файлу. Потік починає виконання в точці входу цього образу.
Дескриптори нового процесу і нового потоку створюються з повними правами доступу. Для обох дескрипторів, якщо дескриптор безпеки не забезпечується, то дескриптор може бути використаний будь-якою функцією, яка запитує дескриптор об'єкта цього типу. При забезпеченні дескриптора безпеки, перевірка доступу проводиться при будь-який запит на використання дескриптора. Якщо перевірка не гарантує доступ, то запитувач процес не може використовувати дескриптор даного потоку.
Процесу призначається 32-бітний ідентифікатор процесу. Ідентифікатор діє до тих пір, поки процес не завершиться. Він може використовуватися для розпізнавання процесу, або для вказівки функції OpenProcess для відкриття дескриптора процесу. Ініціалізується потоку в процесі також призначається 32-бітний ідентифікатор потоку. Цей ідентифікатор доступний до тих пір, поки потік не завершиться і може використовуватися для унікального розпізнавання потоку всередині системи. Ці ідентифікатори повертаються в структурі PROCESS_INFORMATION.
При вказування імені додатки в рядках lpApplicationName або lpCommandLine, не має значення, чи містить назву програми розширення файлу, з одним винятком: додатки для платформ MS-DOS або Windows, чиї файли з розширенням .COM повинні містити розширення .COM.
Зухвалий потік може використовувати функцію WaitForInputIdle для очікування закінчення ініціалізації нового процесу і призупинити користувачем введення даних без його правильної обробки. Це може використовуватися при синхронізації батьківського і дочірнього процесів, так як CreateProcess повертається без очікування завершення ініціалізації нового процесу. Наприклад, викликає процес повинен викликати WaitForInputIdle до спроб відшукати вікно асоційоване з новим процесом.
Бажаний шлях для завершення процесу це використання функції ExitProcess, тому як ця функція попереджає все динамічно пов'язані бібліотеки (DLL), що використовуються процесом про майбутній його завершенні. Інші інструменти завершення процесу не повідомляють приєднані до нього бібліотеки. Зауважте, що при виклику потоком ExitProcess, інші потоки процесу завершуються без можливості виконувати будь-який додатковий код (включаючи завершальний код потоку приєднаних бібліотек).
У прикладі нижче ми запустимо і відразу ж уб'ємо процес notepad.exe
#include "stdafx.h"
#include "windows.h"
#include "iostream.h"
if (CreateProcess ( "c: \\ windows \\ notepad.exe", NULL, NULL, NULL, FALSE, NULL, NULL, NULL, cif, pi) == TRUE)
cout <<"process" <
TerminateProcess (pi.hProcess, NO_ERROR); // прибрати процес
>
>
Функція TerminateProcess завершує роботу заданого процесу і всіх його потоків.
BOOL TerminateProcess (
HANDLE hProcess, // дескриптор процесу
UINT uExitCode // код виходу з процесу
);