Студопедия

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

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

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






Создание процесса






Для управления процессами в ядре Windows используется объект Process (процесс). Создание процесса осуществляется вызовом функции CreateProcess:

BOOL CreateProcess(

LPCTSTR lpApplicationName, // name of executable module

LPTSTR lpCommandLine, // command line string

LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD

LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD

BOOL bInheritHandles, // handle inheritance option

DWORD dwCreationFlags, // creation flags

LPVOID lpEnvironment, // new environment block

LPCTSTR lpCurrentDirectory, // current directory name

LPSTARTUPINFO lpStartupInf, // startup information

LPPROCESS_INFORMATION lpProcessInformation // process information

);

Как можно видеть, эта функция выглядит не совсем традиционно для функций создания объектов ядра. Вызвано это тем, что она, на самом деле, создает не один, а два объекта – процесс и поток (существование в системе процесса без потоков невозможно). Поэтому этой функции передается два различных дескриптора защиты, и возвращаемым значением является не идентификатор созданного процесса, а логическое значение, сообщающее об успехе или не успехе операции. Получить же дескрипторы созданных объектов мы можем из структуры PROCESS_INFORMATION, указатель на которую следует передать последним аргументом нашей функции:

typedef struct _PROCESS_INFORMATION {

HANDLE hProcess;

HANDLE hThread;

DWORD dwProcessId;

DWORD dwThreadId;

} PROCESS_INFORMATION;

Наряду с дескрипторами процесса и потока мы видим в этой структуре и значения идентификаторов dwProcessId и dwThreadId, которые являются общесистемными идентификаторами процесса и потока соответственно. Если бы мы не имели таких идентификаторов, а пользовались бы только процессно-зависимыми дескрипторами, то наладить взаимодействие между процессами в системе было бы очень тяжело.

Еще одной особенностью этой функции является то, что созданные объекты получают при инициализации значение счетчика использования равное 2. Это происходит потому, что объект процесс используется как для работы самого процесса, так и в родительском процессе, получившим значение hProcess после вызова функции CreateProcess. Уничтожение объекта процесс (и поток) в системе может таким образом произойти только после того, как завершится сам процесс (счетчик будет уменьшен на 1) и будет закрыт дескриптор в родительском процессе (счетчик уменьшен еще на 1). Поэтому обязательно нужно закрыть полученные дескрипторы с помощью функции CloseHandle после того, как они станут вам не нужны (их можно использовать для того, чтобы узнавать состояние процесса или код его завершения).






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