Файл: Мониторинг потока событий (Hooks) (.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 07.11.2023

Просмотров: 117

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ 

БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ 

Международный институт дистанционного образования 

 

 

Кафедра «Информационные системы и технологии» 

 

 

 

 

 

КУРСОВОЙ ПРОЕКТ 

 

по дисциплине: «Операционные системы и системное

программирование» 
на тему: Мониторинг потока событий (Hooks) (Вариант № 1) 

 

 


 

Студент  

3-й курс, группа 41702320

 
 


 

В.А. Светличный 

Руководитель 

 




А.Ю. Бумай

 

 

  

 

 

 

 
 

Минск 2023

СОДЕРЖАНИЕ


1 Описание используемых инструментов и технологии 4

1.1 Обзор среды проектирования C++Builder 4

1.2 Создание dll средствами C++Builder 5

1.3 Работа с tray в C++Builder 7

1.4 Перехват событий клавиатуры 7

2 Описание программной реализации приложения 11

2.1 Описание структуры программного комплекса 11

2.2 Описание интерфейса Windows-приложения 12

2.3 Описание основных алгоритмов программы 14

2.4 Демонстрация работы журнала 17

Приложение Б. Код основной программы 27



Введение




Цель курсового проекта: разработка приложения-сервиса мониторинга потока событий.

В ходе выполнения курсового проекта необходимо выполнить следующие задачи:

− изучить предметную область перехвата событий клавиатуры;

− изучить способы создания dll-библиотеки;

− изучить методы работы с треем;

− разработать алгоритмы для мониторинга потока событий;

− разработать программу в среде C++Builder.

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

Курсовой проект состоит из 2-ух глав.

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

Во второе главе описывается программная реализация приложения мониторинга потока событий. Приводится графическая схема алгоритма установки хука; структура программного комплекса; интерфейс приложения.

1 Описание используемых инструментов и технологии



1.1 Обзор среды проектирования C++Builder




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

Главное окно осуществляет основные функции управления проектом создаваемой программы. Оно несет в себе элементы, которые всегда должны быть под рукой у программиста. Минимизация главного окна приводит к исчезновению с экрана других окон CBuilder. Эти окна появятся, как только будут восстановлены размеры главного окна. А его закрытие означает окончание работы программиста с системой программирования.

В главном окне располагается главное меню CBuilder, набор пиктографических командных кнопок и палитра компонентов. Главное меню содержит все необходимые средства для управления проектом. Все опции главного меню представляют собой опции-заголовки, открывающие доступ к выпадающим меню второго уровня. Все элементы главного окна располагаются на специальных панельках, в левой части которых имеются кнопки управления, позволяющие с помощью мыши перетаскивать панельки с помещенными на них элементами. Любую панельку (кроме главного меню) можно убрать из окна (сделать ее невидимой) или «пустить плавать» по экрану в отдельном окне. Для этого нужно лишь «стащить» панельку с помощью мыши за кнопку из пределов главного окна.

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

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

, во всяком случае – ее видимые на экране внешние проявления: окна, кнопки, списки выбора.

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

Процесс создания CBuilder – программы разбивается на две фазы: фазу конструирования формы и фазу кодирования. Конструирование формы осуществляется с помощью выбора компонентов из палитры и размещения их на форме.

Программист может перемещать любой размещенный на форме компонент и изменять его размеры с помощью мыши. Чтобы придать компоненту нужные свойства, используется страница Properties Инспектора объектов.

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

1.2 Создание dll средствами C++Builder



DLL (Dynamic Link Library − динамически компонуемая библиотека) − это участок кода хранимый в файле с расширением «.dll». Код может быть использован другими программами, но сама по себе библиотека программой не является. Динамически компонуемые библиотеки представляют собой набор скомпилированных функций. Но у этих библиотек есть свой особенности, так например, если какие-то две или более программы для Windows одновременно исполняются и используют функции, находящиеся в одной DLL, то в памяти будет постоянно находиться только одна библиотека, обеспечивая тем самым экономное расходование памяти. Загрузка библиотеки в память может быть статической и динамической.

При статической загрузке DLL автоматически загружается при запуске использующего ее приложения. Такая DLL содержит экспортируемые функции, описание которых находится в файле библиотеки импорта (import library file – .lib). Для использования статической загрузки необходимо на этапе компоновки к программе подключить .lib файл DLL. В C++ Builder это сводится к включению в проект .lib файла через менеджер проектов.

При динамической загрузке можно загружать DLL при необходимости, выгрузить ее когда она не нужна. Однако работать с такими библиотеками сложнее, чем со статическими.


Рассмотрим создание и использование DLL статической загрузки.

Проект dll создаётся из меню «File / New / DLL Wizard», в результате чего будет создан файл с исходным кодом, содержащий фрагмент программы главной точки входа, который показан на рисунке 1.1.

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)

{



return 1;

}


Рисунок 1.1 – Фрагмент функции входа dll
Для экспорта и импорта из DLL необходимо использовать модификаторы __export и __import соответственно. Но в C++ Builder можно использовать новое ключевое слово __delspec() с параметрами dllexport и dllimport соответственно.

Для того чтобы экспортировать функции из библиотеки нужен один заголовочный файл с описаниями _delspec (dllexport) для экспортируемых функций. Для импорта функций в приложение необходимо поставить аналогичный заголовочный файл, но с _delspec (dllimport) описаниями.

Динамическая загрузка гораздо сложнее. Однако для динамической загрузки требуется только сама DLL (не нужен ни .lib ни заголовочный файл, хотя его можно использовать для описания экспортируемых функций для предполагаемого пользователя).

Загрузить библиотеку можно при помощи функции LoadLibrary, указав в качестве единственного параметра имя файла. Функция вернёт дескриптор на загруженную библиотеку.

Далее, после успешной загрузки библиотеки, нужно получить адрес необходимой функции при помощи GetProcAddress, указав в качестве параметров: дескриптор загруженной dll и имени функции, тип которой должен совпадать с типом функции, описанной в самой dll.

Выгрузка dll из памяти компьютера осуществляется при помощи функции FreeLibrary.

1.3 Работа с tray в C++Builder




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

Приложение, использующее компонент TrayIcon, может отображаться в области System Tray статической пиктограммы. В этом случае свойство Animate должно быть заданно равным false. Тогда при значении свойства Visible равном true отображается или пиктограмма, указанная свойством Icon или, если в свойстве Icons задан список пиктограмм, то отображается пиктограмма, номер которой задан свойством IconIndex. Изменяющаяся пиктограмма будет отображаться в том случае если свойство Animate равно true. С пиктограммой можно связать всплывающее окно. Оно вызывается методом ShowBalloonHint. Например, этот метод можно вызвать в обработчике событий OnClick. Текст всплывающего окна задается свойство BalloonHint. В окне может показываться пиктограмма, задаваемая свойством BalloonFlags.


1.4 Перехват событий клавиатуры




Существуют приложения, которым необходимо перехватывать все нажатия клавиш в Windows, даже если в данный момент активно другое приложение. Это может быть, например, программа, переключающая раскладку клавиатуры, резидентный словарь или программа, выполняющая иные действия по нажатию «горячей» комбинации клавиш.

Перехват всех событий в Windows (в том числе и событий от клавиатуры) выполняется с помощью вызова функции SetWindowsHook(). Данная функция регистрирует в системе Windows ловушку (hook) для определенного типа событий/сообщений. Ловушка − это пользовательская процедура, которая будет обрабатывать указанное событие. Основное здесь то, что эта процедура должна всегда присутствовать в памяти Windows. Поэтому ловушку помещают в DLL и загружают эту DLL из программы. Пока хоть одна программа использует DLL, та не может быть выгружена из памяти.

Функция SetWindowsHookEx устанавливает определяемую программой подключаемую процедуру в цепочку hook-точек. Прикладная программа устанавливает фильтр − процедуру, чтобы контролировать некоторые типы событий в системе. Подключаемая процедура может контролировать события связанные или с конкретным потоком или со всеми потоками в системе. Эта функция заменяет функцию SetWindowsHook.

Синтаксис функции показан на рисунке 1.2.

HHOOK SetWindowsHookEx

(

int idHook, // тип hook-точки, которая устанавливается
HOOKPROC lpfn, // адрес подключаемой процедуры
HINSTANCE hMod, // дескриптор прикладной программы
// идентификация потока, который устанавливает hook-точку

DWORD dwThreadId

);


Рисунок 1.2 – Синтаксис функции SetWindowsHookEx
Рассмотрим параметры функции.

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

− WH_CALLWNDPROC устанавливает подключаемую процедуру, которая контролирует сообщения до того, как система отправит их оконной процедуре предназначения;

− WH_CALLWNDPROCRET устанавливает подключаемую процедуру, которая контролирует сообщения после того, как они были обработаны оконной процедурой предназначения;

− WH_CBT устанавливает подключаемую процедуру, которая принимает уведомления, полезные для машинной подготовки (CBT) прикладной программы;