Меню
Категории
Работа с процессами. Функции CreateProcess и TerminateProcess
12 марта, 2008 Программинг

Работа с процессами. Функции 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”

void main()
{
STARTUPINFO cif;

ZeroMemory(&cif,sizeof(STARTUPINFO) );

PROCESS_INFORMATION pi;

if (CreateProcess(“c:\\windows\\notepad.exe”,NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi)==TRUE)
{
cout << “process” << endl;
cout << “handle ” << pi.hProcess << endl;
Sleep(10000); // подождать
TerminateProcess(pi.hProcess,NO_ERROR); // убрать процесс
}
}

Функция TerminateProcess завершает работу заданного процесса и всех его потоков.

BOOL TerminateProcess(
HANDLE hProcess, // дескриптор процесса
UINT uExitCode // код выхода из процесса
);

Добавить комментарий




*