- \Driver\AES\boxes-fst.inc – таблицы перестановок;
- \Driver\AES\consts.inc – объявление констант и структур;
- \Driver\AES\EncodeDecode.inc – функции шифрования и дешифрации блоков по 16 байт, а также вспомогательные по отношению к ним функции;
- \Driver\AES\usefull_functions.inc – вспомогательные функции и макросы;
- \Loader\*.* – файлы исходных кодов загрузчика и оболочки;
- \Loader\Loader.asm – основной модуль загрузчика;
- \Loader\DelImageDlg.inc – диалог удаления файла образа;
- \Loader\DriverService.inc – функции взаимодействия с драйвером;
- \Loader\MainWndProc.inc – главная оконная функция;
- \Loader\NewImageDlg.inc – диалог создания нового образа диска;
- \Loader\PasswordDlg.inc – диалоговое окно ввода пароля при монтировании файла образа новым виртуальным логическим диском в систему;
- \Loader\TrayIcon.inc – модуль реализации иконки в трее;
- \Loader\Loader.rc – список подключаемых ресурсов;
- \Loader\Loader.rap – файл проекта RadASM;
- \Loader\Loader.exe – сам загрузчик;
- \Loader\Icons\*.ico – иконки, используемые в загрузчике;
- \Loader\Res\*.* – файлы ресурсов используемых в загрузчике;
- \Loader\Res\XPMan.manifest – манифест для программы;
- \Loader\Res\DialogForms.rc – ресурсы диалоговых окон;
- \Loader\Res\LoaderRes.rc – иконки, добавляемые в ресурсы;
- \Loader\Res\XPMan.rc – подключение к проекту манифеста.
Для реализации программного продукта кроме стандартных заголовочных файлов необходимы файлы из KmdKit (Kernel Mode Driver Development Kit for MASM32 programmers) от Four-F, являющийся переработкой заголовочный файлов из DDK. Без них совершенно невозможна компиляция драйвера, а также компиляция нескольких модулей загрузчика.
3.2.3. Средства обмена данными
Пользователь непосредственно работает только с загрузчиком, предоставляющим пользователю все поддерживаемые продуктом функции. Все взаимодействие происходит через контекстное меню иконки, добавляемой загрузчиком в трей, и через три диалоговых окна: создание нового файла образа, ввод пароля, удаление файла образа.
Система взаимодействует с драйвером через диспетчер ввода-вывода (Input/Output Manager), а загрузчик – через функции диспетчера управления службами (Service Control Manager, SCM).
3.2.4. Алгоритм работы программы
Общий принцип работы программного приложения следующий:
После запуска приложения-загрузчика Loader.exe сначала проверяется, а не запущена ли уже эта программа на данной машине. Для этого с помощью функции CreateFileMapping в виртуальной памяти создается блок, имеющий уникальное имя. В случае ошибки, т.е. наличия другой запущенной копии, выводится сообщение об ошибке и работа приложения завершается. Первая копия в конце своей работы освобождает выделенный блок памяти вызовом CloseHandle.
В ином случае создается невидимое главное окно, предназначенное для обработки сообщений, приходящих от иконки в трее. В оконной функции WndProc этого окна обрабатываются несколько различных сообщений от системы.
При создании окна функцией AC_TrayIconCreate создается иконка в трее, затем с помощью функции AC_FindDriverInMem осуществляется поиск драйвера в памяти. Если драйвер загружен, то вызов AC_GetUsedDriveLetter возвращает букву диска, с которой связан драйвер. Затем в зависимости от состояния драйвера функция AC_TrayIconMenuItemsCheckState меняет иконку в трее и доступность пунктов контекстного меню, информируя пользователя о состоянии драйвера.
При закрытии окна функцией AC_TrayIconDelete иконка в трее удаляется.
Сообщения, приходящие от иконки в трее, обрабатываются вызовами функций AC_TrayIconWndProc_WM_COMMAND и AC_TrayIconWndProc_WM_TRAY, где первая обрабатывает выбор пунктов меню пользователем, а вторая вызывает, при необходимости, контекстное меню.
При выборе пункта «Загрузить образ диска» вызывается функция AC_Cmd_LoadDriver, производящая загрузку драйвера и монтирование образа на создаваемый файл. После того, как функция отработает, вызывается AC_TrayIconMenuItemsCheckState.
При выборе пункта «Выгрузить диск» сначала вызывается AC_Cmd_UnloadDriver, выгружающая образ, драйвер и удаляющая диск, затем вызывается AC_TrayIconMenuItemsCheckState.
При выборе пункта «Создать образ диска» вызывается единственная функция NewImageDlgShow, описанная в модуле NewImageDlg.inc и реализующая весь процесс создания нового файла образа диска.
При выборе пункта «Удалить образ диска» также вызывается единственная функция DelImageDlgShow, внутри которой происходит весь процесс удаления существующего файла образа диска.
Алгоритм загрузки образа реализован внутри функции AC_Cmd_LoadDriver, и состоит из следующего: первоначально с помощью функции AC_FindDriverInMem осуществляется поиск драйвера в памяти и, если он работает, выводится сообщение о невозможности загрузки нового образа без предварительной выгрузки старого, после чего происходит прерывание функции загрузки образа. Иначе вызов AC_RegisterService загружает драйвер в память, а функция AC_StartService монтирует диск из файла, путь к которому передан ей в качестве параметра.
Выгрузка образа реализована в функции AC_Cmd_UnloadDriver следующим образом: сначала драйвер ищется вызовом AC_FindDriverInMem. Если он не найден, то выводится соответствующее сообщение и выгрузка на этом завершается. Иначе в функции AC_StopService производится выгрузка образа и удаление диска, затем вызов AC_DeleteService удаляет из памяти сам драйвер.
Процесс создания нового файла образа происходит внутри вызова функции NewImageDlgShow. Данная функция создает модальное диалоговое окно из окна, прописанного в ресурсах исполняемого файла загрузчика. Все действия выполняются внутри диалоговой оконной функции NewImageDlgWndProc. Основное действие выполняется в вызове функции AC_Cmd_LoadDriver, уже описанной выше. Остальные действия заключаются в проверке корректности введенных данных, доступности файла на запись и реализации интерфейса пользователя.
Процесс удаления существующего файла образа происходит внутри вызова функции DelImageDlgShow, по своему устройству весьма похожей на NewImageDlgShow тем, что так же создает диалог из ресурсов. Само удалении происходит в обработчике нажатия кнопки «Удалить».
3.2.5. Описание основных функций программы
Описание функций дано в порядке вхождения модулей, в которых те описаны, в список файлов проектов.
Программа загрузчик (Loader.exe):
ProcessMessages proc hWnd:DWORD
Обработка всех сообщений из очереди для данного окна;
DelImageDlgWndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
Диалоговая оконная функция диалога удаления файла;
DelImageDlgShow proc
Вызов диалогового окна удаления файла;
AC_ErrorMessage proc error:DWORD
Вывод системной информации о произошедшей ошибке;
AC_FindDriverInMem proc
Поиск драйвера в памяти и получение его состояния;
AC_RegisterService proc
Загрузка драйвера в память;
AC_StartService proc lpFileName:DWORD
Загрузка образа из указанного файла и создание диска;
AC_StopService proc
Выгрузка образа и удаление диска;
AC_DeleteService proc
Выгрузка драйвера из памяти;
AC_CreateNewImage proc imgsize:DWORD, imgpath:DWORD
Процесс создания нового файла образа диска;
AC_Cmd_LoadDriver proc lpFileName:DWORD
Интерфейс загрузки существующего файла образа диска;
AC_Cmd_UnloadDriver proc
Интерфейс выгрузки драйвера из памяти;
AC_GetUsedDriveLetter proc
Поиск логического диска, с которым связан загруженный драйвер;
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
Создание и поддержка главного окна приложения;
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
Оконная функция главного окна приложения;
_SaveFileDialog_ proc lpTitle:DWORD, lpFilter:DWORD, lpDefExt:DWORD
Вызов системного диалога выбора файла;
SwapButtonsEnabling proc hOwnerDlgWnd:DWORD
Переключение доступности кнопок диалогового окна. Вызывается на время выполнения выделения места под файл образа на винчестере, а также при удалении существующего файла образа для того, чтобы пользователь не мог ничего нажимать во время фоновой работы приложения;
NewImageDlgWndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
Оконная функция диалогового окна, в котором создается новый файл образа диска;
NewImageDlgShow proc
Создание диалогового окна, в котором создается новый файл образа диска;
FillDriveLetters proc hWndComboBox:DWORD
Заполнение всплывающего списка выбора (ComboBox) буквами дисков, не зарегистрированных в системе;
PasswordDlgWndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
Оконная функция ввода пароля;
PasswordDlgShow proc
Создание диалогового окна ввода пароля;
AC_TrayIconCreate proc
Создание иконки в трее и контекстного меню для нее;
AC_TrayIconDelete proc
Удаление иконки приложения из трея;
AC_TrayIconChange proc hNewIcon:DWORD
Изменение изображения у иконки приложения в трее;
AC_TrayIconWndProc_WM_TRAY proc wParam:DWORD, lParam:DWORD
Функция обработки сообщений от иконки в трее, которые система посылает главной оконной функции приложения;
AC_TrayIconWndProc_WM_COMMAND proc wParam:DWORD, lParam:DWORD
Функция обработки сообщений от пунктов контекстного меню;
AC_TrayIconMenuItemsCheckState proc
Функция меняет доступность пунктов меню и изображения иконки в трее в зависимости от текущего состояния драйвера.
Драйвер устройства (ACVHDD.SYS):
AC_OpenFileDrive proc pDeviceObject : PDEVICE_OBJECT, pIrp : PIRP
Открытие файла образа, а также инициализация и вычисление физических параметров создаваемого диска (число цилиндров, число секторов на трек, число байт на сектор и т.д.);
AC_CloseFileDrive proc pDeviceObject : PDEVICE_OBJECT, pIrp : PIRP
Освобождение выделенных ресурсов, закрытие файла образа, завершение работы системы шифрования;
AC_DriverUnload proc pDriverObject : PDRIVER_OBJECT
Функция вызывается при выгрузке драйвера и освобождает все выделенные ресурсы;
AC_DriverEntry proc pDriverObject : PDRIVER_OBJECT, pusRegistryPath : PUNICODE_STRING
Точка входа при первоначальной загрузке драйвера. Создает само устройство, инициализирует мютекс, а также устанавливает обработчики в DRIVER_OBJECT на системные запросы IRP_MJ_ xxx;
InitAES proc passwrd:DWORD
Инициализация системы шифрования по заданному паролю;
DoneAES proc
Завершение работы системы шифрования;
EncodeBuffer proc src:DWORD, dst:DWORD, block_count:DWORD
Шифрование буфера src длиной block_count 16 байтных блоков с записью результатат в dst;
DecodeBuffer proc src:DWORD, dst:DWORD, block_count:DWORD
Дешифровка буфера src длиной block_count 16 байтных блоков с записью результате в dst;
b_SetUp_Encode proc
Внутренняя функция, используемая при шифровании;