Создание процесса (Win32 API)

Когда поток в приложении вызывает CreateProcess, система создает объект ядра "процесс" с начальным значением счетчика числа его пользователей, равным 1. Этот объект — не сам процесс, а компактная структура данных, через которую операционная система управляет процессом. (Объект ядра "процесс" следует рассматривать как структуру данных со статистической информацией о процессе.) Затем система создает для нового процесса виртуальное адресное пространство и загружает в него код и данные как для исполняемого файла, так и для любых DLL (если таковые требуются).

Далее система формирует объект ядра "поток" (со счетчиком, равным 1) для первичного потока нового процесса. Как и в первом случае, объект ядра "поток" — это компактная структура данных, через которую система управляет потоком. Первичный поток начинает с исполнения стартового кода из библиотеки С/С++, который в конечном счете вызывает функцию WinMain, wWinMain, main или wmain в Вашей программе. Если системе удастся создать новый процесс и его первичный поток, CreateProcess вернет TRUE.

NOTE:

CreateProcess возвращает TRUE до окончательной инициализации процесса. Это означает, что на данном этапе загрузчик операционной системы еще не искал все необходимые DLL. Если он не сможет найти хотя бы одну из DLL или корректно провести инициализацию, процесс завершится. Но, поскольку CreateProcess уже вернула TRUE, родительский процесс ничего не узнает об этих проблемах.

BOOL CreateProcess(PCTSTR pszApplicationName, // имя исполняемого файла PTSTR pszCommandLine, // командную строка, передаваемая этому процессу PSECURITY_ATTRIBUTES psaProcess, // атрибуты защиты для объекта процесс PSECURITY_ATTRIBUTES psaThread, //// атрибуты защиты для объекта поток BOOL bInheritHandles, //разрешать ли наследование параметров DWORD fdwCreate, // флаги, влияющие на то, как именно создается новый процесс PVOID pvEnvironment, // указатель на блок памяти, хранящий строки переменных окружения PCTSTR pszCurDir, // текущие диск и каталог для дочернего процесса PSTARTUPINFO psiStartInfo, // указатель на структуру STARTUPINFO: PPROCESS_INFORMATION ppiProcInfo); // указатель на структуру PROCESS_INFORMATION

Элементы структуры STARTUPINFO используются Windows-функциями при создании нового процесса. Содержание данной структуры приведено ниже:

typedef struct _STARTUPINFO { DWORD cb; // количество байтов, занимаемых структурой STARTUPINFO. PSTR lpReserved; // Зарезервирован. Инициализируйте как NULL. PSTR lpDesktop; // Идентифицирует имя рабочего стола, на котором запускается приложение PSTR lpTitle; // Определяет заголовок консольного окна. DWORD dwX; // Указывают x- и y-координаты (в пикселах) окна приложения. DWORD dwY; DWORD dwXSize; // Определяют ширину и высоту (в пикселах) окна приложения. DWORD dwYSize; DWORD dwXCountChars; // Определяют ширину и высоту (в символах) консольных окон дочернего процесса. DWORD dwYCountChars; DWORD dwFillAttribute; // Задает цвет текста и фона в консольных окнах дочернего процесса. DWORD dwFlags; // набор флагов, позволяющих управлять созданием дочернего процесса WORD wShowWindow; // Определяет, как именно должно выглядеть первое перекрываемое окно дочернего процесса WORD cbReserved2; // Зарезервирован. PBYTE lpReserved2; // Зарезервирован. HANDLE hStdInput; // Определяют описатели буферов для консольного ввода-вывода HANDLE hStdOutput; HANDLE hStdError;} STARTUPINFO, *LPSTARTUPINFO;

Структура PROCESS_INFORMATION представляет собой следующее:

typedef struct _PROCESS_INFORMATION { HANDLE hProcess; //описатель процесса HANDLE hThread; // описатель потока DWORD dwProcessId; // идентификатор процесса DWORD dwThreadId; // идентификатор потока} PROCESS_INFORMATION;

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: