Статьи
Полезное
Личное
Связь
Как Windows запускает приложение |
Автор: Coldy |
02.02.2010 23:05 |
Страница 2 из 3 Данная подсистема и особенность архитектуры Windows делают эту операционную систему совместимой со многими ранее существующими стандартами. Итак, прежде чем мы вернемся в исходную функцию ShellExecute, посмотрим, что же происходит внутри функции CreateProcess. Подсистема Win32 Как и остальные системные функции Windows CreateProcess, как и ShellExecute проводит проверку входных параметров и в случае нахождения оных возвращает ошибку. При этом, соответственно, если произошла ошибка, проводник Windows тут же уведомит об этом пользователя, выдав необходимое сообщение. После проверки происходит открытие указанного файла приложения с помощью функции CreateFile и далее, в случае если файл открылся – происходит его проекция в память – вызываются функции CreateFileMapping и MapViewOfFile. Цель вызова данных функций отобразить содержимое файла в виртуальную память и работать с ним уже напрямую. За реализацию этих функций берется подсистема Nt, которая в свою очередь обращается к менеджеру памяти ядра операционной системы. Если попытка отобразить файл в память не удается и если после соответствующих проверок выясняется, что открываемый файл является унаследованным форматом, то происходит рекурсивный запуск подсистемы VDM, с параметрами, необходимыми для корректной работы приложения. Также, проверяется, не является ли указанный файл командным файлом с расширениями .bat или .cmd - в этом случае снова происходит рекурсивный вызов функции, но уже в качестве файла указывается специальная программа – командный интерпретатор, которая анализирует содержимое командного файла. Когда проекция в память проходит без ошибок происходят дальнейшие приготовления, для запуска приложения. С помощью функции NtCreateProcess, создается и инициализируется индивидуальный процесс со своим адресным пространством, далее, вызывается функция NtCreateThread – для создания приостановленного первичного потока в только что созданном процессе. При создании первичного потока для нового процесса его начало лежит не в самом приложении, а в ядре операционной системы и далее, при переходе кода в пользовательский режим – в системной библиотеке подсистемы Win32. Операционная система, несмотря на передачу управления выполняемому коду, оставляет за собой право, с помощью специальных механизмов, в случае необратимой ошибки в запущенной программе немедленно прекратить ее выполнение. Таким образом, приложения пользовательского уровня, с точки зрения операционной системы в целом рассматриваются как потенциально опасные с плохо написанным кодом, которые нужно держать под контролем. Первичный поток создается именно приостановленным, так как прежде, чем передать управления загруженному приложению, операционной системе необходимо произвести как настройки внутри этого файла, так и в своих внутренних структурах, для последующего обращения к этому файлу. Для последних целей о только что созданном процессе уведомляется подсистема CSRSS. После того как подсистема CSRSS приняла уведомления, вызывается функция NtResumeTrhead, разрешая операционной системе производить планирование данного потока. Далее, управление возвращается в функцию ShellExecute, а только что созданный процесс вот-вот начнет свое исполнение, соревнуясь с остальными, уже существующими в системе за процессорное время. Подсистема ядра Windows Как уже было написано выше, при создании нового процесса от системы Win32 к ядру Windows происходят обращения через системные сервисы, которые и инициализируют необходимые объекты для того чтобы запустить новый процесс. Таким образом, ядро Windows проделывает всю основную работу, которая скрывается за подсистемой Win32. |