Процесс обычно определяют как экземпляр выполняемой программы, и он состоит из двух компонентов:
- объекта ядра, через который операционная система управляет процессом Там же хранится статистическая информация о процессе,
- адресного пространства, в котором содержится код и данные всех EXE- и DLL модулей Именно в нем находятся области памяти, динамически распределяемой для стеков потоков и других нужд.
Процессу в Win32 отводится 4 Гб адресного пространства.
Процесс в Win32 является инертным, т.е. он ничего не выполняет, а только владеет адресным пространством, куда загружаются код и данные EXE файла и DLL библиотек.
Так как процессы инертны, чтобы выполнить код программы необходимо создать поток. У процесса потоков может быть несколько. Все они будут выполнять код программы "одновременно".
Чтобы все потоки работали, ОС выделяет каждому из них определенные отрезки времени, которые называются квантами. Время выделяется по принципу «карусели».
Функция создания процесса
BOOL CreateProcess(
PCTSTR pszApplicationName,
PTSTR pszCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
Функция создает объект ядра – процесс, создает виртуальное адресное пространство 4 Гб, загружает в него код и данные EXE файла.
Далее ОС создает объект ядра – первичный поток процесса. Первичный поток начинает работу со стартового кода.
При удачном создании процесса функция вернет TRUE, иначе False. Код ошибки можно узнать, вызвав функцию DWORD GetLastError().
Если pszApplicationName - не пустая строка, система считает, что в ней задано имя выполняемой программы, причем находящейся в текущем каталоге;
pszCommandLine – командная строка, содержащая имя выполняемого файла и параметры командной строки.
Функция начинает искать заданный файл в следующем порядке:
1. Каталог, содержащий EXE-файл вызывающего процесса
2. Текущий каталог вызывающего процесса
3. Системный каталог Windows
4. Основной каталог Windows
5. Каталоги, перечисленные в переменной окружения PATH
Все это произойдет, если в pszCommandLine не указан полный путь до EXE-файла и если pszApplicationName = NULL.
psaProcess, psaThread – атрибуты защиты для процесса и
lпервичного потока.
bInheritHandles – флаг наследования.
fdwCreate – определяет флаги, влияющие на то, как именно создается новый процесс:
DEBUG_PROCESS – позволяет родительскому процессу проводить отладку всех дочерних процесса. Родительский процесс уведомляется о наступлении определенных событий.
DEBUG_ONLY_THIS_PROCESS – позволяет родительскому процессу проводить отладку только прямого потомка
CREATE_SUSPENDED – приостанавливает выполнение первичного потока
DETACHED_PROCESS – блокирует доступ процессу, инициированному консольной программой, к созданному родительским процессом консольному окну и сообщает системе, что вывод следует перенаправить в новое окно
CREATE_NEW_CONSOLE – приводит к созданию нового консольного окна
CREATE_NO_WINDOW – не дает создавать консольное окно
CREATE_NEW_PROCESS_GROUP – служит для модификации списка процессов, уведомляемых о нажатии клавиш Ctrl+C и Ctrl+Break. Если в системе одновременно исполняется несколько CUI-процессов, то при нажатии одной из этих комбинаций система уведомляет об этом только процессы, включенные в группу.
CREATE_DEFAULT_ERROR_MODE – запрещает наследования режимов обработки событий.
CREATE_SEPARATE_WOW_VDM – используется для запуска 16-разрядных приложений в Windows NT. Заставляет открывать для процесса отдельную Virtual DOS-machine (VDM). CREATE_SHARED_WOW_VDM
– имеет обратное действие.
CREATE_UNICODE_ENVIRONMENT – определяет, что переменные окружения содержат Unicode-символы. По умолчанию ANSI символы.
Параметр fdwCreate разрешает задать и класс приоритета процесса:
IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
pvEnvironment – параметр указывает на блок памяти, хранящий строки переменных окружения нового процесса. Если NULL – тогда переменные окружения наследуются от родительского процесса.
pszCurDir – позволяет установить текущий диск и каталог для создаваемого процесса. Если NULL, то текущий каталог и диск устанавливается такой же, как и у родительского процесса.
STARTUPINFO si = { sizeof(si) }; CreateProcess(.. , &si, ...};
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
Пример создания потока:
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
TCHAR szCommandLine[] = TEXT("NOTEPAD");
if (CreateProcess(
NULL, // pszApplicationName
szCommandLine, // pszCommandLine
NULL, // psaProcess
NULL, // psaThread
FALSE, // bInheritHandles
NORMAL_PRIORITY_CLASS, // fdwCreate
NULL, // pvEnvironment
NULL, // pszCurDir
&si, // psiStartInfo
&pi);)
{printf(“ID процесса ”+IntToHex(pi.dwProcessId,32));
printf (“ID потока “+IntToHex(pi.dwThreadId,32);}