Методическое пособие по выполнению практического занятия №7 "Управление правами доступа к дискам, файлам и каталогам" по дисциплине "Операционные системы и среды" для специальности 230113 Компьютерные системы и комплексы
методическая разработка по теме

Шакирова Гюзель Шамильевна

Методическое пособие создано для реализации основной профессиональной образовательной программы в соответствии с ФГОС по специальности СПО 230113 Компьютерные системы и комплексы (базовой подготовки) и в соответствии с Рабочей программой дисциплины "Операционные системы и среды".

Целью данной работы является   

совершенствование знаний, практических умений и навыков работы с файлами и папками в ос Windows;

        обобщить и систематизировать ранее полученные теоретические знания об управлении доступом к дискам, файлам и каталогам в ОС Windows, овладеть практическими умениями по работе с объектами в среде Windows;  развивать логическое мышление, внимание; развивать познавательный интерес, творческую активность студентов, самооценку своей деятельности;   воспитывать уважение к товарищу, умение работать в команде

Скачать:


Предварительный просмотр:

ДЕПАРТАМЕНТ ОБРАЗОВАНИЯ ГОРОДА МОСКВЫ

Государственное бюджетное профессиональное образовательное учреждение города Москвы «Политехнический колледж им. Н.Н. Годовикова»

Специальность: 230113 Компьютерные системы и комплексы

УТВЕРЖДАЮ

Заместитель директора

по учебно-методической  работе

__________________И.В. Бойцова

«_____»_______________2014 г.

Дисциплина: ОПЕРАЦИОННЫЕ СИСТЕМЫ И СРЕДЫ

Методическое пособие по выполнению

ПРАКТИЧЕСКОГО ЗАНЯТИЯ №7

Управление процессами и приоритетами в операционных системах

Автор: Г.Ш. Шакирова

Рассмотрено на

заседании цикловой комиссии

Компьютерные системы и комплексы

протокол №     от «_____»_________2014 г.

Председатель цикловой комиссии

______________________Л.Ф. Сивцева

Москва 2014 г.

Практическое занятие №7

Управление процессами и приоритетами в операционных системах

Цель занятия: исследовать структуры данных и функции WRK, используемые при создании и управлении процессами и потоками.

Задание: составить конспект основных теоретических положений, выполнить задание методического пособия.

  1. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ

Программа (program) – это последовательность команд, реализующая алгоритм решения задачи. Программа может быть записана на языке программирования (например, на Pascal, С++, BASIC); в этом случае она хранится на диске в виде текстового файла с расширением, соответствующим языку программирования (например, .PAS, .CPP, .VB). Также программа может быть представлена при помощи машинных команд; тогда она хранится на диске в виде двоичного исполняемого файла (executable file), чаще всего с расширением .EXE. Исполняемый файл генерируется из текста программы при компиляции.

Процесс (process) – это программа (пользовательская или системная) в ходе выполнения.

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

Если операционная система умеет запускать в одно и то же время несколько процессов, она называется многозадачной (multitasking) (пример – Windows), иначе – однозадачной (пример – MS DOS).

Процесс может содержать один или несколько потоков (thread) – объектов, которым операционная система предоставляет процессорное время. Сам по себе процесс не выполняется – выполняются его потоки. Таким образом, машинные команды, записанные в исполняемом файле, выполняются на процессоре в составе потока. Если потоков несколько, они могут выполняться одновременно.

Замечание. "Одновременное" (или "параллельное") выполнение потоков подразумевает одну из двух принципиально разных ситуаций, зависящих от количества процессоров (ядер) на компьютере. В том случае, если имеется всего один процессор с одним ядром, в один момент времени может выполняться только один поток. Однако операционная система может быстро переключать процессор с выполнения одного потока на другой и вследствие высокой частоты процессоров у пользователя возникает иллюзия одновременной работы нескольких программ. Такая ситуация называется псевдопараллельное выполнение потоков. Если в компьютере установлен многоядерный процессор или количество процессоров больше одного, то возможно истинно параллельное или просто параллельное выполнение потоков.

Операционные системы, поддерживающие несколько процессоров, называются многопроцессорными.

Если система допускает наличие нескольких потоков в одном процессе, она называется многопоточной (multithreading). 

Многопоточность – это средство распараллеливания действий внутри процесса.

Примеры.

  1. В современных браузерах каждой вкладке соответствует свой поток.
  2. В текстовом редакторе один поток может управлять вводом текста, второй – проверять орфографию, третий – выводить документ на принтер.
  3. В компьютерной игре-стратегии за обработку действий каждого игрока отвечает отдельный поток.

Каждый процесс имеет свое собственное виртуальное адресное пространство, в котором независимо друг от друга работают все потоки процесса. Например, поток 1 может записывать данные в ячейку с адресом 100, а поток 2 читать данные из ячейки с адресом 101.

Замечание. Конечно, если два (или более) потоков захотят записать что-то свое в одну и ту же ячейку, возникнет неопределенность – кто раньше? Это одна из подзадач обширной проблемы синхронизации.

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

Структуры данных для процессов и потоков

В WRK за управление процессами отвечает диспетчер процессов (base\ntos\ps), а многие важные структуры данных описаны в заголовочных файлах base\ntos\inc\ps.h и base\ntos\inc\ke.h.

Процесс в Windows описывается структурой данных EPROCESS. Эта структура в WRK содержится в файле base\ntos\inc\ps.h (строка 238). Рассмотрим некоторые её поля:

  • Pcb (Process Control Block – блок управления процессом) – представляет собой структуру KPROCESS, хранящую данные, необходимые для планирования потоков, в том числе указатель на список потоков процесса (файл base\ntos\inc\ke.h, строка 944);
  • CreateTime и ExitTime – время создания и завершения процесса;
  • UniqueProcessId – уникальный идентификатор процесса;
  • ActiveProcessLinks – элемент двунаправленного списка (тип LIST_ENTRY), содержащего активные процессы;
  • QuotaUsage, QuotaPeak, CommitCharge – квоты (ограничения) на используемую память;
  • ObjectTable – таблица дескрипторов процесса;
  • Token – маркер доступа;
  • ImageFileName – имя исполняемого файла;
  • ThreadListHead – двунаправленный список потоков процесса;
  • Peb (Process Environment Block – блок переменных окружения процесса) – информация об образе исполняемого файла (файл public\sdk\inc\pebteb.h, строка 75);
  • PriorityClass – класс приоритета процесса.

Структура для потока в Windows называется ETHREAD и описывается в файле base\ntos\inc\ps.h (строка 545). Её основные поля следующие:

  • Tcb (Thread Control Block – блок управления потоком) – поле, которое является структурой типа KTHREAD (файл base\ntos\inc\ke.h, строка 1069) и необходимо для планирования потоков;
  • CreateTime и ExitTime – время создания и завершения потока;
  • Cid – структура типа CLIENT_ID, включающая два поля – идентификатор процесса-владельца данного потока и идентификатор самого потока;
  • ThreadsProcess – указатель на структуру EPROCESS процесса-владельца;
  • StartAddress – адрес системной стартовой функции потока. При создании потока сначала вызывается системная стартовая функция, которая запускает пользовательскую стартовую функцию;
  • Win32StartAddress – адрес пользовательской стартовой функции.

Создание процесса

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

Процесс, создавший другой процесс, называется родителем, а созданный процесс – потомком. Таким образом, формируется иерархия процессов.

Любой процесс начинает свою работу с основного (main), или первичного, потока, который может запускать (порождать) другие потоки – так образуется иерархия потоков.

В Windows для создания процессов применяется одна из следующих WinAPI-функций: CreateProcess, CreateProcessAsUser, CreateProcessWithTokenW, CreateProcessWithLogonW [10]. Далее при описании будем использовать функцию CreateProcess.

Создание процессов в Windows включает 7 этапов:

1. Проверка и преобразование параметров

Параметры функции CreateProcess проверяются на корректность и преобразуются к внутреннему формату системы.

2. Открытие исполняемого файла

Происходит поиск файла, который содержит запускаемую программу. Обычно это файл с расширением .EXE, но могут быть также расширения .COM, .PIF, .BAT, .CMD. Определяется тип исполняемого файла:

  • Windows приложение (.EXE) – продолжается нормальное создание процесса;
  • приложение MS-DOS или Win16 (.EXE, .COM, .PIF) – запускается образ поддержки Ntvdm.exe;
  • командный файл (.BAT, .CMD) – запускается образ поддержки Cmd.exe;
  • приложение POSIX – запускается образ поддержки Posix.exe.

3. Создание объекта "Процесс"

Формируются структуры данных EPROCESS, KPROCESS, PEB, инициализируется адресное пространство процесса. Для этого вызывается системная функция NtCreateProcess (файл base\ntos\ps\create.c, строка 826), которая затем вызывает функцию NtCreateProcessEx (тот же файл, строка 884), а та, в свою очередь, функцию PspCreateProcess (тот же файл, строка 1016).

Замечание. Начиная с Windows Vista при создании процесса вызов нескольких функций (NtCreateProcess, NtWriteVirtualMemory, NtCreateThread) заменен вызовом одной функции NtCreateUserProcess.

Рассмотрим некоторые важные действия, выполняемые функцией PspCreateProcess.

  • Если в параметрах функции PspCreateProcess указан процесс-родитель:

- по его дескриптору определяется указатель на объект EPROCESS (функция ObReferenceObjectByHandle, строка 1076);

-    наследуется от процесса родителя маска привязки к процессорам (Affinity, строка 1092).

  • Устанавливается минимальный и максимальный размеры рабочего набора (WorkingSetMinimum = 20 МБ и WorkingSetMaximum = 45 МБ, строки 1093 и 1094, см. лекцию 11 "Управление памятью").
  • Создается объект "Процесс" (структура EPROCESS) при помощи функции ObCreateObject (строка 1108).
  • Инициализируется двунаправленный список потоков при помощи функции InitializeListHead (строка 1134).
  • Копируется таблица дескрипторов родительского процесса (строка 1270).
  • Создается структура KPROCESS при помощи функции KeInitializeProcess (строка 1289).
  • Маркер доступа и другие данные, связанные с безопасностью (см. лекцию 13 "Безопасность", копируются из родительского процесса (функция PspInitializeProcessSecurity, строка 1302).
  • Устанавливается приоритет процесса, равный Normal; однако, если приоритет родительского процесса был Idle или Below Normal, то данный приоритет наследуется (строки 1307–1312).
  • Инициализируется адресное пространство процесса (строки 1337–1476).
  • Генерируется уникальный идентификатор процесса (функция ExCreateHandle) и сохраняется в поле UniqueProcessId структуры EPROCESS (строки 1482–1488).
  • Создается блок PEB и записывается в соответствующее поле структуры EPROCESS (строки 1550–1607).
  • Созданный объект вставляется в хвост двунаправленного списка всех процессов (строки 1613–1615) и в таблицу дескрипторов (строки 1639–1644). Первая вставка обеспечивает доступ к процессу по имени, вторая – по ID.
  • Определяется время создания процесса (функция KeQuerySystemTime) и записывается в поле CreateTime структуры EPROCESS (строка 1733).

4. Создание основного потока 

Формируется структура данных ETHREAD, стек и контекст потока, генерируется идентификатор потока. Поток создается при помощи функции NtCreateThread, определенной в файле base\ntos\ps\create.c, (строка 117), которая вызывает функцию PspCreateThread (тот же файл, строка 295). При этом выполняются следующие действия:

  • создается объект ETHREAD (строка 370).
  • Заполняются поля структуры ETHREAD, связанные с процессом-владельцем, – указатель на структуру EPROCESS (ThreadsProcess) и идентификатор процесса (Cid.UniqueProcess) (строки 396 и 398).
  • Генерируется уникальный идентификатор потока (функция ExCreateHandle) и сохраняется в поле Cid.UniqueThread структуры EPROCESS (строки 400–402).
  • Заполняются стартовые адреса потока, системный (StartAddress) и пользовательский (Win32StartAddress) (строки 468-476).
  • Инициализируются поля структуры KTHREAD при помощи вызова функции KeInitThread (строки 490–498 для потока пользовательского режима и 514–522 для потока режима ядра).
  • Функция KeStartThread заполняет остальные поля структуры ETHREAD и вставляет поток в список потоков процесса (строка 564).
  • Если при вызове функции PspCreateThread установлен флаг CreateSuspended ("Приостановлен") поток переводится в состояние ожидания (функция KeSuspendThread, строка 660); иначе вызывается функция KeReadyThread (строка 809), которая ставит поток в очередь готовых к выполнению потоков.

5. Уведомление подсистемы Windows 

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

6. Запуск основного потока 

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

7. Инициализация процесса

  • Проверяется, не запущен ли процесс в отладочном режиме;
  • проверяется, следует ли производить предвыборку блоков памяти (тех участков памяти, которые при прошлом запуске использовались в течение первых 10 секунд работы процесса);
  • инициализируются необходимые компоненты и структуры данных процесса, например, диспетчер кучи;
  • загружаются динамически подключаемые библиотеки (DLL – Dynamic Link Library);
  • начинается выполнение стартовой функции потока.

  1. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

Задание 1. Исследовать структуру данных EPROCESS.

Указания к выполнению

1. Откройте файл WRK, содержащий описание структуры EPROCESS: base\ntos\inc\ps.h, строка 238.

Замечание. Открыть описание структуры EPROCESS можно в проекте Visual Studio или в HTML документации по WRK:

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/1.jpg

Замечание. Обратите внимание, в WRK часто названия типов (раздел Types в HTML документации) начинаются с подчеркивания (_EPROCESS), при этом для типа имеется синоним (раздел Typedefs) без подчеркивания (EPROCESS). Использовать можно одинаково как типы, так и их синонимы.

2. Откройте отладчик WinDbg. Запустите процесс отладки ядра.

3. Запустите виртуальную машину Windows Server 2003 SP1 в режиме отладки.

4. Остановите выполнение виртуальной машины в отладчике, нажав Ctrl+Break или выбрав пункт меню Debug – Break или щелкнув кнопку Breakна панели инструментов.

Внизу окна Command отладчика (View – Command) должно появиться приглашение для ввода команд kd>:

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/2.jpg

5. Введите команду: dt eprocess.

dt (display type) – команда отображения информации о типах данных и переменных.

При этом в окне команд должна отобразиться информация обо всех полях типа EPROCESS:

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/3.jpg

Слева в окне вывода указывается шестнадцатеричное смещение в байтах для поля относительно начала расположения структуры в памяти. Например, поле Pcb – первое поле (смещение 0x000 байт), представляющее собой структуру _KRPOCESS и занимающее в памяти 0x078 = 120 байт.

Замечание. Обратите внимание, что в качестве параметра команды dt мы указываем EPROCESS – синоним типа _EPROCESS. Ввод команды dt _eprocess приведет к аналогичному результату.

6. Чтобы отобразить значения полей структуры EPROCESS для какого-либо конкретного процесса, мы должны узнать адрес этой структуры в памяти. Для этого в отладчике в поле команд введите: !process 0 0.

Команда !process отображает информацию обо всех или нескольких процессах. Первый ноль в параметрах команды означает, что нужно выводить информацию о всех процессах. Если на месте первого параметра указать ID процесса или адрес в памяти его структуры EPROCESS, будет выводиться информация только о данном процессе.

Второй ноль в параметрах команды !process определяет количество информации о процессе: 0 – минимум информации, 7 – максимум информации.

На экране отобразится краткая информация о всех процессах в системе, в том числе их идентификаторы (на рисунке обведено красным) и адреса структур EPROCESS (обведено синим):

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/4.jpg

Из рисунка видно, что в данном случае ID процесса explorer.exe равен 7EC (в шестнадцатеричном виде) или 2028 (в десятичном виде), а адрес структуры EPROCESS = 81F24BD0. Имейте в виду, что при следующем запуске системы эти значения скорее всего изменятся.

Сейчас можно отображать значения полей структуры EPROCESS для процесса explorer.exe, воспользовавшись адресом структуры:

dt eprocess 81F24BD0.

Обратите внимание на идентификатор процесса – поле UniqueProcessId (его значение должно совпадать с полученным ранее идентификатором), и на файл образа процесса – поле ImageFileName (explorer.exe).

При выводе информации с помощью команды dt не отображаются значения полей внутри вложенных структур, например, поле Pcb (структура KPROCESS). Чтобы отобразить их следует использовать ключ рекурсии –rN, где N – число уровней рекурсии.

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/5.jpg

Например, команда dt eprocess 81F24BD0 -r1 позволяет получить следующий вывод (приведен не полностью):

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/6.jpg

Задание 2. Получить информацию о процессе и его потоках.

Указания к выполнению:

1. Как уже отмечалось, для получения информации о процессах используется команда !process. У неё есть следующие варианты:

!process 0 0 – отображение краткой информации о всех процессах в системе;

!process id 7 – отображение полной информации о процессе с идентификатором id;

!process id 0 – отображение краткой информации о процессе с идентификатором id;

!process address 7 – отображение полной информации о процессе с адресом address структуры EPROCESS;

!process address 0 – отображение краткой информации о процессе с адресом address структуры EPROCESS.

2. Чтобы узнать идентификатор процесса, можно воспользоваться либо командой отладчика !process (этот способ уже демонстрировался), либо специальными утилитами, например Process Explorer или Task Manager (Диспетчер задач).

Продемонстрируем второй способ на примере процесса explorer.exe.

Возобновите выполнение виртуальной машины: нажмите F5 или выберите пункт меню Debug – Go или щелкните кнопку Goна панели инструментов.

На виртуальной машине запустите утилиту Process Explorer от Sysinternals.

Замечание. Утилиту Process Explorer можно скачать на сайте Sysinternals: http://technet.microsoft.com/ru-ru/sysinternals. Информацию о ней можно получить на том же сайте.

Идентификатор процесса указывается в поле PID (Process Identifier):

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/7.jpg

В примере на рисунке PID = 2028 (в десятичном виде) или 7EC (в шестнадцатеричном виде).

3. Остановите выполнение виртуальной машины (нажмите Ctrl+Break в отладчике).

В окне команд введите

!process 7EC 0

или

!process 81F24BD0 0

Результаты вывода почти одинаковые, за тем исключением, что в первом случае дополнительно выводится адрес таблицы дескрипторов процесса:

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/8.jpg

4. Чтобы вывести информацию о потоках процесса, наберите команду:

!process 7EC 4

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/9.jpg

Для каждого потока указывается адрес его структуры ETHREAD (на рисунке выделено красным цветом), идентификатор потока (синий цвет) и текущее состояние потока (зеленый цвет).

Для отображения полной информации о потоках процесса введите команду:

!process 7EC 7.

Задание 3. Создать программу, в которой запускается другое приложение.

Указания к выполнению:

1. Создайте пустой проект С/С++ в Visual Studio (Файл – Создать – Проект…) с названием CreateProcess. Выберите расположение проекта (кнопка Обзор…), например, C:\Programs:

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/10.jpg

2. Добавьте в проект файл исходного кода с расширением CPP.

Для этого щелкните правой кнопкой мыши на папке Файлы исходного кода в Обозревателе решений, выберите Добавить, затем Создать элемент

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/11.jpg

В открывшемся окне выберите пункт Файл C++ (.cpp) и введите его название, например, main:

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/12.jpg

3. Откройте добавленный файл и вставьте в него следующий код (взят с сайта MSDN):

#include

#include

#include

void _tmain( int argc, TCHAR *argv[] )

{

    STARTUPINFO si;

    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );

    si.cb = sizeof(si);

    ZeroMemory( &pi, sizeof(pi) );

    // Запуск дочернего процесса

    if( !CreateProcess( NULL,

        "notepad.exe",  // Имя образа запускаемого процесса

        NULL,          // Дескриптор процесса не наследуется

        NULL,          // Дескриптор потока не наследуется

        FALSE,         // Дескрипторы не наследуются

        0,             // Флагов создания нет

        NULL,          // Родительский environment block

        NULL,          // Родительский текущий каталог

        &si,           // Указатель на структуру STARTUPINFO

        &pi )          // Указатель на PROCESS_INFORMATION

    )

    {

        printf( "CreateProcess failed (%d).\n", GetLastError() );

        return;

    }

    // Ожидаем, пока созданный процесс не завершится

    WaitForSingleObject( pi.hProcess, INFINITE );

    // Закрываем дескрипторы процесса и потока

    CloseHandle( pi.hProcess );

    CloseHandle( pi.hThread );

}

Приведенная программа будет запускать другой процесс (в данном случае стандартное приложение Windows "Блокнот") и ждать, пока он не завершится.

4. Установите требуемые свойства проекта.

Для этого выберите конфигурацию Release на панели инструментов:

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/13.jpg

В конфигурации Release проект будет компилироваться без отладочной информации и с оптимизацией кода.

Затем щелкните правой кнопкой мыши на заголовке проекта в окне Обозреватель решений и выберите пункт Свойства (или щелкните левой кнопкой мыши на заголовке проекта и нажмите Alt+Enter):

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/14.jpg

В свойствах проекта найдите опцию Свойства конфигурации – C/C++ – Создание кода – Библиотека времени выполнения. Выберите параметр Многопоточная (/MT). Если этого не сделать, то приложение при запуске в Windows Server 2003, возможно, будет требовать библиотеку msvcr100.dll (для Visual Studio 2010).

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/15.jpg

5. Проверьте работоспособность созданного приложения.

Нажмите кнопку Playна панели инструментов или нажмите F5. При появлении окна с вопросом о выполнении построения проекта выберите Да.

Если все сделано правильно, должно запуститься созданное приложение (консольное окно), а затем приложение "Блокнот".

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/16.jpg

Закройте "Блокнот" – при этом должно завершиться ваше приложение.

Задание 4. Исследовать в отладчике ход создания процесса.

Указания к выполнению:

1. Исполняемый файл созданного в предыдущем пункте приложения CreateProcess.exe после компиляции проекта должен находиться в следующей папке:

c:\Programs\CreateProcess\Release.

Скопируйте исполняемый файл на виртуальную машину.

2. Проверьте работоспособность исполняемого файла на виртуальной машине. При его запуске должен запускаться "Блокнот".

3. Установите в отладчике точку останова на функции NtCreateProcessEx.

Для этого прервите выполнение виртуальной машины (Ctrl+Break в отладчике). В меню Edit выберите пункт Breakpoints…

В открывшемся окне введите команду:

bp nt!NtCreateProcessEx

и нажмите Enter.

http://www.intuit.ru/EDI/11_09_13_2/1378902874-22974/tutorial/1143/objects/8/files/17.jpg

Данная команда устанавливает точку останова на функции NtCreateProcessEx. Указание nt! означает модуль, в котором отладчику следует искать функцию. Если в данном случае не указать модуль nt (ядро), то отладчик автоматически поставит точку останова на функции NtCreateProcessEx, экспортируемой ntdll.dll.

4. Возобновите выполнение виртуальной машины (нажмите F5 в отладчике). Запустите в виртуальной машине приложение CreateProcess.

Сработает точка останова для функции NtCreateProcessEx, которая запускает приложение CreateProcess. Нас интересует запуск "Блокнота", поэтому продолжите выполнение, нажав F5 в отладчике.

Точка останова сработает второй раз – произошел вызов функции NtCreateProcessEx для запуска "Блокнота". Перейдите в отладчик. В нем должно открыться окно с исходным кодом функции NtCreateProcessEx (файл base\ntos\ps\create.c).

Проследите ход создания объекта процесс (см. лекцию 6 "Процессы и потоки", раздел "Создание процесса", шаг 3). Для этого используйте клавиши F11 – выполнение следующей команды с заходом в процедуры (Step Into) и F10 – то же самое, но процедуры выполняются за один шаг (без захода, Step Over).

Значения переменных можно отслеживать в окне Locals (Alt+3), окне Watch (Alt+2, нужно вводить интересующие переменные) или просто наводя курсор мыши на переменную в окне исходного кода.

Задание для самостоятельного выполнения

 Исследуйте структуру данных ETHREAD

Указания к выполнению:

1. Используйте HTML документацию по WRK или проект Visual Studio.

2. Для просмотра полей структуры ETHREAD используйте команду:

dt ethread.

3. Для получения информации об адресах структур ETHREAD потоков процесса используйте команду:

!process id 4.

4. Для получения информации о потоке используйте команду:

!thread address,

где address – адрес структуры ETHREAD потока.

5. Для просмотра значений полей структуры ETHREAD для конкретного потока используйте команду:

dt ethread address.

  1. КОНТРОЛЬНЫЕ ВОПРОСЫ

  1.  Приведите определение понятий "программа", "процесс", "поток", "стек".
  2.  Опишите основные поля структуры EPROCESS.
  3.  Какой структурой является поле Pcb структуры EPROCESS? Опишите поля этой структуры.
  4.  Опишите основные поля структуры ETHREAD.
  5.  Перечислите этапы создания процесса.
  6.  Опишите этапы создания объекта "процесс".
  7.  Опишите этапы создания основного потока.


По теме: методические разработки, презентации и конспекты

Методическое пособие по выполнению практического занятия №1 "Изучение структуры операционной системы" по дисциплине "Операционные системы и среды" для специальности 230113 Компьютерные системы и комплексы

Методическое пособие создано для реализации основной профессиональной образовательной программы в соответствии с ФГОС по специальности СПО 230113 Компьютерные системы и комплексы (базовой подгото...

Методическое пособие по выполнению практического занятия №2 "Работа с основными командами операционной системы" по дисциплине "Операционные системы и среды" для специальности 230113 Компьютерные системы и комплексы

Методическое пособие создано для реализации основной профессиональной образовательной программы в соответствии с ФГОС по специальности СПО 230113 Компьютерные системы и комплексы (базовой подгото...

Методическое пособие по выполнению практического занятия №3 "Командные файлы Windows" по дисциплине "Операционные системы и среды" для специальности 230113 Компьютерные системы и комплексы

Методическое пособие создано для реализации основной профессиональной образовательной программы в соответствии с ФГОС по специальности СПО 230113 Компьютерные системы и комплексы (базовой подгото...

Методическое пособие по выполнению практического занятия №4-5 Работа с каталогами в операционных системах. Работа с файлами в операционных системах" по дисциплине "Операционные системы и среды" для специальности 230113 Компьютерные системы и комплексы

Методическое пособие создано для реализации основной профессиональной образовательной программы в соответствии с ФГОС по специальности СПО 230113 Компьютерные системы и комплексы (базовой подгото...

Методическое пособие по выполнению практического занятия №8 "Управление процессами и приоритетами в операционных системах" по дисциплине "Операционные системы и среды" для специальности 230113 Компьютерные системы и комплексы

Методическое пособие создано для реализации основной профессиональной образовательной программы в соответствии с ФГОС по специальности СПО 230113 Компьютерные системы и комплексы (базовой подгото...

Методическое пособие по выполнению практического занятия №1 "Исследование порядка запускакомпьютера. Работа программы POST" по дисциплине "Операционные системы" для специальности 230115 Программирование в компьютерных системах

Методическое пособие создано для реализации основной профессиональной образовательной программы в соответствии с ФГОС по специальности СПО 230115 Программирование в компьютерных системах (базовой...

Методическое пособие по выполнению практического занятия №3 "Программный интерфейс и файловая система ОС WINDOWS" по дисциплине "Операционные системы" для специальности 230115 Программирование в компьютерных системах

Методическое пособие создано для реализации основной профессиональной образовательной программы в соответствии с ФГОС по специальности СПО 230115 Программирование в компьютерных системах (базовой...