Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
7
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

13.1 Win32 api и поддерживающие его платформы. Объекты ядра. Защита. Совместное использование объектов ядра несколькими процессами. Процессы. Описатель экземпляра процесса.

API содержит совокупность фукций, к которым может обращаться приложение.

Объекты ядра - это каналы, мьютексы, потоки, процессы, почтовые ящики, проекции файлов, семафоры, события, файловые объекты и др. Эти объекты создаются Win32 функциями. Каждый объект ядра на самом деле является блоком памяти, выделенный ядром и доступный только ему. Этот блок представляет собой структуру данных, в элементах которой содержится информация об объекте. Некоторые элементы (имя объекта, дескриптор защиты, счетчик числа пользователей) присутствуют во всех объектах. Почти все функции, создающие объекты ядра, принимают указатель на структуру SECURITY_ATTRIBUTES как аргумент. Большинство приложений вместо этого аргумента выдают NULL и создают объект с защитой по умолчанию. Такая защита предполагает, что администратор и создатель объекта получают к нему полный доступ, а все прочие к объекты не допускаются.

Процессы.Процесс - экземпляр выполняемой программы. В Win32 процессу отводится 4Г. В Win32 процессы, в отличие от MS DOS , инертны, они ничего не выполняют сами, но просто содержат 4Г памяти. Процесс в Windows составляют следующие компоненты:

  • Структура данных, содержащая всю инфо о процессе, в том числе список открытых дескрипторов разл-ых системных ресурсов, уникальный идентификатор процесса, различную статистическую инфо и т.д.;

  • Адресное пространство - диапазон адресов виртуальной памяти, которым может пользоваться процесс;

  • Исполняемая программа и данные, проецируемые на виртуальное адресное пространство процесса.

Также процессу принадлежат файлы, динамически выделяемая область памяти, потоки. Чтобы процесс что-нибудь выполнял , в нем необходимо создать потоки, именно они отвечают за исполнение кода, содержащегося в адресном пространстве процесса. При создании процесса создается первичный поток.

Переменные окружения.  С любым процессом связан блок переменных окружения - области памяти, выделенной в адресном пространстве процесса. Обычно дочерний процесс наследует набор переменных окружения от родительского процесса, однако родительский процесс способен управлять тем, какие переменные наследуются, какие нет.С помощью функции DWORD GetEnvironmentVariable ( LPCTSTR lpName, // указатель на имя переменной                                LPTSTR lpBuffer, // указатель на буфер, в который будет помещено значение переменной                                DWORD nSize // размер буфера в символах);

 можно выявить присутствие той или иной переменной окружения и определить ее значение.Функция SetEnvironmentVariable позволяет удалять, добавлять и модифицировать значение переменной окружения.

Создание процессов Создание Win32 процесса осуществляется вызовом одной из ф-й, как CreateProcess, CreateProcessAsUser (для Windows NT/2000) и CreateProcessWithLogonW(начиная с Windows 2000):

  • Открывается файл образа (EXE), который будет выполняться в процессе. Если исполняемый файл не является Win32 приложением, то ищется образ поддержки (support image) для запуска этой программы. Например, если исполняется файл с расширением .bat, запускается cmd.exe и т.п.

  • Создается объект ядра Win32 "процесс".

  • Создается первичный поток (стек, контекст и объект "поток").

  • Подсистема Win32 уведомляется о создании нового процесса и потока.

  • Начинается выполнение первичного потока.

  • В контексте нового процесса и потока инициализируется адресное пространство (например, загружаются требуемые DLL) и начинается выполнение программы.

Функция CreateProcess.

BOOL CreateProcess( LPCTSTR lpApplicationName, // имя исполняемого файла;

     LPTSTR lpCommandLine, // командная строка      LPSECURITY_ATTRIBUTES lpProcessAttributes,// - атрибуты защиты для объекта ядра "процесс"      LPSECURITY_ATTRIBUTES lpThreadAttributes, // атрибуты защиты для объекта ядра "поток"      BOOL bInheritHandles, // определяет, передаются ли порожденным процессам все наследуемые описатели      DWORD dwCreationFlags, // определяет флаги, влияющие на то, как именно создается новый процесс      LPVOID lpEnvironment, //обычно NULL -наследуется окружение родительского процесса      LPCTSTR lpCurrentDirectory, // текущий диск и каталог для создаваемого процесса      LPSTARTUPINFO lpStartupInfo, // указатель на структуру STARTINFO  LPPROCESS_INFORMATION lpProcessInformation );// указатель на структуру PROCESS_INFORMATION.

Завершение процесса: 1) один из потоков процесса вызывает функцию ExitProcess. 2) поток другого процесса вызывает функцию TerminateProcess. 3)все потоки процесса "умирают по своей воле", вызвав ExitTread. ОС не поддерживает процесс без первичного потока.

Когда процесс завершается, все User- и GDI-объекты, созданные процессом, уничтожаются, объекты ядра закрываются (если их не использует другой процесс), адресное пространство процесса уничтожается.