Функция CreateProcess
Основной функцией для создания процесса является CreateProcess. Данная функция создает новый процесс с единственным первичным потоком. Десять параметров функции позволяют указать основные параметры создаваемого процесса.
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
При вызове CreateProcess, система создает объект ядра «процесс» (структуру данных, через которую операционная система управляет процессом). Затем система создает для нового процесса виртуальное адресное пространство и загружает в него код и данные исполняемого файла и необходимых библиотек (DLL). Далее система формирует объект ядра «поток» для первичного потока (primary) нового процесса. Первичный поток отвечает за инициализацию процесса, обработку системных сигналов и событий. Этот поток “живет” до того момента, когда управление не будет возвращено операционной системе для завершения процесса. Первичный поток начинает с исполнения стартового кода программы (для C/C++ это функции WinMain, wWinMain, main или wmain).
Рассмотрим параметры и возвращаемое значение функции CreateProcess.
Параметры lpApplicationName и lpCommandLine используются вместе для указания исполняемой программы и аргументов командной строки. Если файл с указанным именем не найден, Windows приступает к поиску заданного файла и делает это в следующем порядке:
1. Каталог, содержащий ЕХЕ-файл вызывающего процесса.
2. Текущий каталог вызывающего процесса.
3. Системный каталог Windows.
4. Основной каталог Windows.
5. Каталоги, перечисленные в переменной окружения PATH.
lpProcessAttributes и lpThreadAttributes указатели на структуры атрибутов защиты процесса и потока. Значениям NULL соответствует использование атрибутов защиты, заданных по умолчанию.
Флаг bInheritHandles показывает, наследует ли новый процесс открытый дескрипторы (файлов, файлов отображенных на память и т.д.) из вызывающего (родительского) процесса производящего запуск. Унаследованные дескрипторы имеют те же значения и права доступа, что и оригиналы.
Параметр dwCreationFlags задает параметры создания процесса и его приоритет. Некоторые возможные значения данного флага перечислены ниже.
CREATE_NEW_CONSOLE | Новый процесс получает новую консоль вместо того, чтобы унаследовать родительскую. |
CREATE_NEW_PROCESS_GROUP | Создаваемый процесс - корневой процесс новой группы. |
CREATE_SUSPENDED | Первичная нить процесса создается в спящем (suspended) состоянии и не выполняется до вызова функции ResumeThread |
REALTIME_PRIORITY_CLASS | Процесс получает наивысший приоритет – Real-time (реального времени). Потоки в этом процессе обязаны немедленно реагировать на события, обеспечивая выполнение критических по времени задач. Такие потоки вытесняют даже компоненты операционной системы. |
HIGH_PRIORITY_CLASS | Потоки в процессе с приоритетом High (высокий) должны немедленно реагировать на события, обеспечивая выполнение критических по времени задач. Этот класс присвоен, например системной утилите Task Manager. |
ABOVE_NORMAL_PRIORITY_CLASS | Класс приоритета Above Normal (выше среднего), промежуточный между Normal и High. Данный класс впервые введен в Windows 2000. |
NORMAL_PRIORITY_CLASS | Потоки в процессе c приоритетом Normal (нормальный) не предъявляют особых требований к выделению им процессорного времени. |
BELOW_NORMAL_PRIORITY_CLASS | Процесс получит класс приоритета Below Normal (ниже среднего), промежуточный между Normal и High. Данный класс впервые введен в Windows 2000. |
IDLE_PRIORITY_CLASS | Потоки в процессе с приоритетом Idle выполняются, когда система не заняты другой работой. Этот класс приоритета обычно используется для утилит, работающих в фоновом режиме, экранных заставок и приложений, собирающих статистическую информацию. |
lpEnvironment казывает на блок переменных окружения нового процесса. Если передаваемое значение будет NULL, то будет использован блок родительского процесса. Блок среды это список строк с нулевым окончанием типа «имя=значение». Использование переменных окружения наиболее простой способ передачи информации в порождаемый процесс.
lpCurrentDirectory – указатель но строку, содержащую путь к текущему каталогу нового процесса. Если значение не задано, то в качестве текущего каталога будет использоваться каталог родительского (порождающего) процесса.
lpStartupInfo указатель на структуру STARTUPINFO, которая описывает внешний вид основного окна создаваемого процесса и содержит дескрипторы основных устройств нового процесса. Большинство приложений порождает процессы с атрибутами по умолчанию, в этом случае должны быть инициализировать все элементы структуры STARTUPINFO нулевыми значениями.
lpProcessInformation – указатель на структуру PROCESS_INFORMATION, в которую Windows будут помещены, возвращаемые функцией значения дескрипторов и уникальные идентификаторы созданного процесса и его главного потока.
Как видно из описания функции CreateProcess, возвращаемое ей значение не является дескриптором созданного объекта типа HANDLE, как это происходит в большинстве функций. Если системе удастся создать новый процесс и его первичный поток, тогда CreateProcess вернет ненулевое значение, иначе будет возвращено нулевое значение.
#include "stdafx.h"
#include "windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
if (CreateProcess("c:\\windows\\notepad.exe",NULL,
NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi))
{
cout << "Process ID: " << pi.dwProcessId << endl;
cout << "Process handle: " << pi.hProcess << endl;
Sleep(5000); // задержка на 5 секунд
TerminateProcess(pi.hProcess,NO_ERROR);// завершение } //процесса
}