
- •Модель программного интерфейса ос windows. Понятие объекта ядра и описателя объекта ядра операционной системы Windows. Нотация программного интерфейса.
- •Понятие пользовательского режима и режима ядра операционной системы Windows. Модель виртуальной памяти процесса в пользовательском режиме и в режиме ядра операционной системы Windows.
- •Обзор архитектуры и основных модулей операционной системы Windows.
- •Системный реестр операционной системы Windows.
- •5. Основные элементы программ с оконным пользовательским интерфейсом. Минимальная программа для ос Windows с окном на экране. Создание и отображение окна.
- •Понятие оконного сообщения. Источники сообщений. Очередь сообщений. Цикл приема и обработки сообщений. Процедура обработки сообщений.
- •8. Вывод информации в окно. Механизм перерисовки окна.
- •9. Принципы построения графической подсистемы ос Windows. Понятие контекста устройства. Вывод графической информации на физическое устройство.
- •10. Рисование геометрических фигур. Графические инструменты. Управление цветом. Палитры цветов.
- •11. Растровые изображения. Вывод растровых изображений. Значки и курсоры. Вывод растровых изображений с эффектом прозрачного фона.
- •12. Вывод текста. Логические и физические шрифты.
- •13. Системы координат. Трансформации. Режимы масштабирования.
- •14. Понятие ресурсов программ. Виды ресурсов. Работа с ресурсами. Меню. Окна диалога.
- •15. Понятие динамически подключаемой библиотеки. Структура dll-библиотеки. Создание dll-библиотеки. Использование dll-библиотеки в программе. Статический и динамический импорт.
- •16. Отображение файлов в память.
- •17. Организация многозадачности в операционной системе Windows. Понятие процесса и потока. Контекст потока. Создание и завершение процессов и потоков.
- •18. Механизм приоритетов в операционной системе Windows. Класс приоритета процесса. Относительный приоритет потока. Базовый и динамический приоритеты потока.
- •19. Синхронизация потоков в пределах одного процесса. Критические секции. Спин-блокировки. Interlocked-функции.
- •20. Синхронизация потоков разных процессов. Объекты синхронизации: флаги, семафоры, события, ожидаемые таймеры, именованные и неименованные «трубы» (каналы).
- •21. Синхронизация потоков при создании общих данных с помощью двойных проверок (double-checked locking).
- •22. Синхронизация потоков с помощью мониторов Хоара.
- •24. Структуры данных общего назначения в режиме ядра. Представление строк стандарта Unicode. Представление двусвязных списков.
- •25. Понятие прерывания, исключения и системного вызова.
- •26. Аппаратные и программные прерывания. Таблица обработчиков прерываний. Понятие процедуры обработки прерываний (isr).
- •27. Программируемый контролер прерываний. Уровни прерываний. Механизм вызова прерываний. Функция KeBugCheckEx.
- •28. Исключения. Механизм обработки исключения.
- •29. Системные вызовы. Выполнение системного вызова.
- •30. Понятие отложенной процедуры (dpc). Назначение отложенных процедур.
- •31. Понятие асинхронной процедуры (apc). Назначение асинхронных процедур. Асинхронные процедуры режима ядра и пользовательского режима.
- •32. Понятие рабочего элемента ядра (Work Item). Назначение рабочих элементов.
- •33. Пулы памяти. Пул подкачиваемой памяти, пул неподкачиваемой памяти, пул сессии, особый пул. Тегирование пулов. Структура данных пула.
- •34. Оптимизация использования оперативной памяти с помощью списков предыстории (look-aside lists).
- •35. Блокирование страниц в памяти. Списки описателей памяти (mdl) и их использование
- •36. Представление объекта ядра в памяти. Менеджер объектов.
- •37. Структура драйвера операционной системы Windows. Точки входа в драйвер.
- •38. Объект, описывающий драйвер. Объект, описывающий устройство. Объект, описывающий файл. Взаимосвязь объектов.
- •39. Запрос ввода-вывода (irp). Схема выполнения ввода-вывода в стеке драйверов.
- •40. Структура api ядра ос Windows: Kernel api, Windowing api, Messaging api. Функции ZwXxx/NtXxx в пользовательском режиме и в режиме ядра.
- •42. Перехват функций ос Windows api в пользовательском режиме. Интерфейсный модуль ntdll.Dll.
- •43. Перехват вызова функций ос Windows в режиме ядра. Встроенная защита от перехвата в новейших версиях ос Windows.
29. Системные вызовы. Выполнение системного вызова.
Системные вызовы (system calls) - механизм, позволяющий пользовательским программам обращаться к услугам ядра ОС, то есть это интерфейс между операционной системой и пользовательской программой. Концептуально системный вызов похож на обычный вызов подпрограммы. Основное отличие состоит в том, что при системном вызове выполнение программы осуществляется в привилегированном режиме или режиме ядра. Поэтому системные вызовы иногда еще называют программными прерываниями, в отличие от аппаратных прерываний, которые чаще называют просто прерываниями. В большинстве операционных систем системный вызов является результатом выполнения команды программного прерывания (INT). Таким образом, системный вызов - это синхронное событие.
По соглашению, код пользовательского режима должен поместить в региср EBX указатель на блок параметров в стеке пользовательского режима. Тогда функция KeSystemService может просто скопировать требуемое число байтов из стека пользовательского режима в стек режима ядра перед вызовом системной функции. Рисунок 4 иллюстрирует это.
Как системный вызов вызывается?
Поскольку все системные вызовы Windows NT используют одно и тоже программное прерывание 'int 2e' для переключения в режим ядра, как код пользовательского режима информирует код ядра какую именно системную функцию нужно выполнить? Ответ заключается в том, что индекс помещается в регистр EAX перед вызовом инструкции int 2e. В режиме ядра ISR считывает значение регистра EAX и вызывает указанную системную функцию, если все переданные параметры проходят предварительную проверку. Параметры системного вызова (к примеру, те что были переданы в функцию OpenFile) передаются функции ядра в теле ISR.
Возврат из системного вызова: Когда работа системного вызова завершается, исполняется инструкция iret. Исполняя эту инструкцию, процессор восстанавливает из стека значения сохраненные значения регистров пользовательского режима и продолжает исполнение с инструкции следующей за инструкцией 'int 2e'.
30. Понятие отложенной процедуры (dpc). Назначение отложенных процедур.
DPC (англ. Deferred procedure call — отложенный вызов процедуры) — специфический механизм вызова процедур в архитектуре Windows.
Суть DPC: При возникновении прерывания, управление передаётся обработчику прерывания. Существует ряд факторов, ограничивающих возможности кода обработчика прерывания:
Общей практикой является требование минимизации времени работы обработчика прерывания. Поэтому необходимо воздержаться от выполнения ресурсоёмких и долгих действий непосредственно внутри обработчика прерывания.
В Windows код обработчика прерывания выполняется на высоком IRQL, что сильно ограничивает набор доступных обработчику ядерных функций: многие функции требуют гораздо более низкого IRQL для своего вызова.
Решением этой проблемы является подход, при котором непосредственно в обработчике выполняются лишь самые критические операции, а остальные действия откладываются до тех пор, пока не появится относительно свободное процессорное время, а IRQL не опустится до допустимого значения (DISPATCH_LEVEL). Тогда эти действия будут выполнены в рамках вызова отложенной (её выполнение было отложено до этого момента) процедуры.
В отличие от обычного вызова процедуры, при котором, фактически, управление сразу же передаётся коду вызываемой процедуры, при DPC-вызове передача управления вызываемой процедуре не происходит — вместо этого адрес вызываемой процедуры и параметры помещаются в специальную очередь, называемую DPC Queue. Когда наступает «благоприятное» время, отложенная процедура вызывается «по-настоящему».
Таким образом, обработчик прерывания выполняет только самые необходимые действия и осуществляет отложенный вызов процедуры, которая выполнит все остальные действия, нужные в рамках обработки прерывания, но не требующие повышенной срочности.
Управление DPC: Для того, чтобы осуществлять отложенные вызовы, необходимо сперва создать объект DPC при помощи ядерной функции KeInitializeDpc.
Созданному объекту DPC можно изменить приоритет при помощи функци KeSetImportanceDpc, а также переназначить процессор, в очередь которого будет помещён отложенный вызов, с помощью KeSetTargetProcessorDpc.
Постановка DPC в очередь осуществляется вызовом ядерной функции KeInsertQueueDpc.
Помещённый в очередь DPC можно убрать из очереди вызовом функции KeRemoveQueueDpc.
Поскольку механизм DPC используется главным образом в рамках обработки запросов ввода/вывода, существуют специальные функции-обёртки с префиксом Io для управления отложенными вызовами. В частности, обработчики прерываний, согласно документации, должны использовать именно эти функции.