logo
ZH ос 20 вопр 36 стр

Структура modref.

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

Структура MODREF создаётся для exe файла и для каждой dll, используемой файлом. Память для каждой MODREF выделяется из кучи kernel32.

Все модуль-зависимые функции просматривают только структуры MODREF для конкретного процесса. Модуль-зависимые функции:

GetProcAddress(…) – получив идентификатор модуля и идентификатор функции (это её имя или порядковый номер экспорта) возвращает адрес точки входа этой функции.

GetModuleFileName(…) – по идентификатору модуля возвращает полный путь к exe или dll файлам.

GetModuleHandle(…) – по имени файла возвращает идентификатор этого модуля.

Процессы Win32

Процесс – есть субъект владения. Процесс владеет памятью, то есть своим ВАП. Владеет дескрипторами файлов, которые прикладная программа может использовать для чтения записи, владеет потоками, списками модулей, dll, которые необходимы процессу для работы. Процесс не представляет исполнение программного кода. За выполнение программного кода отвечают потоки. Каждый процесс связан с файлом на диске. Но файл становится процессом только тогда, когда загружен в память на выполнение.

Для работы с процессом ОС создаёт структуру базы данных процесса. Эта база данных PDB. EPROCESS – управляющая структура (идентификатор).

Однозначно сослаться на него можно с помощью дескриптора процесса и идентификатора процесса. Дескриптор – это индекс в таблице дескрипторов процесса, а указателем на процесс является содержимое таблицы процесса.

Идентификатор процесса является указателем на базу данных процесса. Функции Win32 для работы с процессами:

CreateProcess(…) – создаёт новый процесс.

ExitProcess(…) – завершает процесс с уведомлением всех подключенных dll.

TerminateProcess(…) – завершает процесс без уведомления подключенных dll.

GetProcessTimes(…) – получает временные параметры процесса. Определяет сколько времени в режиме ядра, а сколько в пользовательском режиме. В Windows 95, 98 функция не поддерживается.

GetCurrentProcess(…) – можно получить дескриптор текущего процесса.

GetCurrentProcessId(…) – можно получить идентификатор текущего процесса.

GetExitCodeProcess(…) – возвращает код завершения процесса.

GetCommandLine(…) – возвращает указатель на командную строку, переданную текущему процессу, то есть можно получить входные параметры с помощью неё.

GetEnvironmentString(…) – возвращает адрес блока переменных окружения.

и так далее.

Потоки Потоки отвечают за исполнение программного кода. При создании процесса всегда создаётся первичный поток. По желанию программиста создаются дополнительные потоки.

CreateThread(…). Для чего создаются потоки?

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

Поток может находиться в одном из 3-х состояний:

  1. Поток фактически работает, при этом в регистре процессора переписывается содержимое структуры CONTEXT. Все остальные потоки процесса приостанавливаются в случае одного процессора в системе.

  2. Поток готов к выполнению. Отсутствуют все причины, препятствующие работе потока, за исключением того, что процессор занят выполнением другого потока.

  3. Заблокированное состояние. Поток ожидает некоторого события, например, ожидание завершения работы другого потока или какого-либо процесса. До наступление этого события планировщик не позволит этому процессу выполнится.

Объектами синхронизации являются потоки процессы, критические секции, семафоры, события, мьютексы.

Потоки владеют набором регистров.

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

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

Поток может завладеть или освободить различные синхронизирующие объекты, принад-лежащие процессу. Дескриптор потока – это индекс в таблице дескрипторов процесса. Иденти-фикатор потока – это закодированный указатель на базу данных потока (PDB).