- •Введение
- •1. Лабораторная работа № 1
- •1.1. Цель работы
- •1.2. Теоретическое введение
- •1.2.1. Получение информации об операционной системе
- •1.2.2. Получение информации из реестра
- •1.2.3. Получение информации о системных каталогах Windows
- •1.2.4. Получение информации о диске
- •1.3. Создание приложения для получения характеристик компьютера и операционной системы
- •Контрольные вопросы
- •2. Лабораторная работа №2
- •2.1.Цель работы
- •2.2. Теоретическое введение
- •2.2.1. Процедуры и функции для работы с виртуальной памятью
- •2.3. Создание приложения, работающего с виртуальной памятью
- •2.4. Задание для самостоятельной работы
- •Контрольные вопросы
- •3. Лабораторная работа № 3
- •3.1. Цель работы
- •3.2. Пример использования механизма выделения виртуальной памяти для решения конкретных задач
- •3.3. Задания для самостоятельной работы
- •Контрольные вопросы
- •4. Лабораторная работа № 4
- •4.1. Цель работы
- •4. 2. Теоретическое введение
- •4.2.1 Создание или открытие объекта ядра «файла»
- •4.2.2 Создание объекта ядра «файл, проецируемый в память»
- •4.2.3 Проецирование файловых данных на адресное пространство процесса
- •4.2.4 Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память»
- •4.2.5 Закрытие объектов ядра «файл, проецируемый в память» и «файл»
- •4.3 Примеры программ, выполняющих проецирование в память
- •4.3.1 Пример 1
- •4.3.2 Пример 2
- •4.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •5. Лабораторная работа № 5
- •5.1.Цель работы
- •5.2. Теоретическое введение
- •5.2.1. Создание процесса
- •5.2.2. Запуск внешней программы функцией WinExec
- •5.2.3. Запуск внешней программы и открытие документа функцией ShellExecute
- •При успешном выполнении функция ShellExecute возвращает целое значение, большее 32. Значение меньшее или равное 32 указывает на ошибку. Значения эти те же, что и для функции WinExec.
- •5.2.4. Создание потока
- •5.2.5. Завершение процесса
- •5.2.6. Завершение потока
- •5.2.7. Изменение класса приоритета процесса
- •5.2.8. Получение информации о классе приоритета процесса
- •5.2.9. Изменение уровня приоритета потока
- •5.2.10. Получение информации о приоритете потока
- •5.3. Примеры программ для работы с процессами и потоками
- •5.3.1. Создание процесса с помощью функции CreateProcess.
- •5.3.2. Создание процесса с помощью функции WinExec.
- •5.3.3. Создание процесса с помощью функции ShellExecute.
- •5.3.4. Создание многопоточного приложения.
- •5.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •6. Лабораторная работа № 6
- •6.1. Цель работы
- •6.2. Теоретическое введение
- •6.2.1. Получение «мгновенного снимка» системы
- •6.2.2. Получение информации о процессах
- •6.2.3. Получение информации о потоках
- •6.2.4. Получение информации о модулях
- •6.2.5. Информация о кучах (heap)
- •6.2.6. Информация о виртуальной памяти.
- •6.2.7. Алгоритм работы функций ToolHelp
- •6.2.8. Как получить карту памяти любого процесса
- •6.3. Пример использования функций ToolHelp
- •6.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •7. Лабораторная работа № 7
- •7.1. Цель работы
- •7.2. Теоретическое введение
- •7.2.1. Критические секции
- •7.2.2. Синхронизация с использованием объектов ядра
- •7.2.3. Wait-функции
- •7.2.4. Синхронизация с использованием процессов и потоков
- •7.2.5. Объекты Mutex
- •7.2.6. Семафоры
- •7.2.7. События
- •7.3 Примеры работы с объектами синхронизации
- •7.3.1 Пример 1
- •7.3.1 Пример 2
- •7.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •8. Лабораторная работа № 8
- •8.1. Цель работы
- •8.2 Теоретическое введение
- •8.2.1 Создание dll
- •8.2.2 Неявная загрузка dll
- •8.2.3 Явная загрузка dll
- •8.2.4 Внедрение dll в адресное пространство другого процесса
- •8.3 Пример работы с dll
- •8.3.1 Создание dll, которая выполняет перехват нажатых клавиш
- •8.3.2 Разработка приложения, которое выполняет анализ и обработку нажатых клавиш.
- •8.4 Индивидуальные задания
- •Контрольные вопросы
- •9.2.2. Функции для работы с объектом «уведомление об изменении файловой системы»
- •9.3. Пример работы системы уведомления об изменениях в файловой системе
- •9.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •Литература
- •214013 Г. Смоленск, Энергетический проезд, 1
6.2.4. Получение информации о модулях
Для просмотра списка загруженных модулей определены следующие функции:
Module32First - получение информации о первом модуле выбранного процесса. Процесс определяется по идентификатору;
Module 32Next - получение информации об очередном модуле выбранного. Процесс определяется по идентификатору.
Функция Module 32First имеет следующий вид:
function Module32First(hSnapshot: THandle; var lpme: TModuleEntry32): Boolean;
где
hSnapshot – дескриптор «мгновенного снимка», полученный с помощью функции CreateToolhelp32SnapShot;
lpme – указатель на структуру TModuleEntry32.
Структура TModuleEntry32 состоит из следующих полей:
TMODULEENTRY32 = record
dwSize: DWORD; th32ModuleID: DWORD; th32ProcessID: DWORD;
GlblcntUsage: DWORD; ProccntUsage: DWORD;
modBaseAddr: PBYTE; modBaseSize: DWORD; hModule: HMODULE;
szModule: array[0..MAX_MODULE_NAME32] of Char;
szExePath: array[0..MAX_PATH - 1] of Char;
end;
Описание полей структуры TModuleEntry32 приведено в таблице 6.4.
Таблица 6.4 Описание полей структуры TModuleEntry32
Поле |
Описание |
|
dwSize |
Размер структуры TModuleEntry32 в байтах. Перед вызовом функции Module32First установите это значение с помощью функции sizeof(TMODULEENTRY32) |
|
th32ModuleID |
Идентификатор модуля. Это значение имеет смысл только для функций ToolHelp и не может использоваться функциями Win32 |
|
th32ProcessID |
Идентификатор процесса |
|
GlblcntUsage |
Счетчик ссылок на данный модуль в системе в целом |
|
ProccntUsage |
Счетчик ссылок на данный модуль в контексте процесса (Идентификатор процесса указывается в поле th32ProcessID) |
|
modBaseAddr |
Базовый адрес модуля в контексте данного процесса |
|
modBaseSize |
Размер модуля в байтах |
|
hModule |
Дескриптор модуля в контексте выбранного процесса |
|
szModule |
Строка, содержащая имя модуля |
|
szExePath: |
Строка, содержащая путь к модулю |
Функция Module32First возвращает значение TRUE, если информация о первом модуле получена и FALSE – в противном случае.
Функция Module32Next имеет те же параметры, что и функция Module32First.
6.2.5. Информация о кучах (heap)
Для просмотра куч определены следующие функции:
Heap32ListFirst - информация о куче, предоставляемой выбранному процессу по умолчанию;
Heap32ListNext - информация об очередной куче процесса;
Heap32First - информация о первом блоке в выбранной куче;
Heap32Next - информация об очередной блоке в выбранной куче.
Функция Heap32ListFirst имеет следующий вид:
function Heap32ListFirst(hSnapshot: THandle; var lphl: THeapList32): Boolean;
где
hSnapshot – дескриптор «мгновенного снимка», полученный с помощью функции CreateToolhelp32SnapShot;
lphl – указатель на структуру THeapList32.
Структура THeapList32 состоит из следующих полей:
THEAPLIST32 = record
dwSize: DWORD; th32ProcessID: DWORD;
th32HeapID: DWORD; dwFlags: DWORD;
end;
Описание полей структуры THeapList32 приведено в таблице 6.5.
Таблица 6.5 Описание полей структуры THeapList32
Поле |
Описание |
dwSize |
Размер структуры THeapList32 в байтах. Перед вызовом функции Heap32ListFirst установите это значение с помощью функции sizeof(THEAPLIST32) |
th32ProcessID |
Идентификатор процесса-владельца данной кучи |
th32HeapID |
Идентификатор кучи в контексте процесса. Это значение имеет смысл только для функций ToolHelp и не может использоваться функциями Win32 |
dwFlags |
В этом поле может быть записана константа HF32_DEFAULT, что означает – куча, предоставляемая процессу по умолчанию |
Функция Heap32ListFirst возвращает значение TRUE, если информация о первой куче получена и FALSE – в противном случае.
Функция Heap32ListNext имеет те же параметры, что и функция Heap32ListFirst.
Функция Heap32First имеет следующий вид:
function Heap32First(var lphe: THeapEntry32; th32ProcessID, th32HeapID: DWORD): Boolean;
где
lphe – адрес буфера, содержащего структуру THeapEntry32;
th32ProcessID – идентификатор процесса, в контексте которого создана куча;
th32HeapID – идентификатор кучи – владелицы блока. Данный идентификатор может быть получен с помощью функций Heap32ListFirst или Heap32ListNext.
Структура THeapEntry32 состоит из следующих полей:
THEAPENTRY32 = record
dwSize: DWORD; hHandle: THandle; dwAddress: DWORD;
dwBlockSize: DWORD; dwFlags: DWORD; dwLockCount: DWORD;
dwResvd: DWORD; th32ProcessID: DWORD; th32HeapID: DWORD;
end;
Описание полей структуры THeapEntry32 приведено в таблице 6.6.
Таблица 6.6 Описание полей структуры THeapEntry32
Поле |
Описание |
dwSize |
Размер структуры THeapEntry32 в байтах. Перед вызовом функции Heap32First установите это значение с помощью функции sizeof(THEAPENTRY32) |
hHandle |
Дескриптор блока кучи |
dwAddress |
Линейный виртуальный адрес начального блока кучи |
dwBlockSize |
Размер блока кучи в байтах |
dwFlags |
Флаги. Возможны следующие значения: LF32_FIXED – зарезервирован, но ему не выделена физическая память LF32_FREE – блок памяти не используется (свободен) LF32_MOVEABLE – блоку памяти выделена физическая память |
dwLockCount |
Счетчик обращений к данному блоку |
dwResvd |
Зарезервировано. Не используется |
th32ProcessID |
Идентификатор процесса – владельца кучи, в которую входит данный блок |
th32HeapID |
Идентификатор кучи, в состав которой входит данный блок |
Функция Heap32First возвращает значение TRUE, если информация о первом блоке в куче получена и FALSE – в противном случае.
Функция Heap32tNext имеет те же параметры, что и функция Heap32ListFirst.