
- •Введение
- •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
5.2.10. Получение информации о приоритете потока
Для получения информации о приоритете потока используется функция GetThreadPriority:
function GetThreadPriority(hThread: THandle): Integer;
где hThread – дескриптор потока.
Функция возвращает один из перечисленных в таблице 5.7. идентификаторов.
Таблица 5.7 Идентификатор уровня приоритета потока
Значение идентификатора |
Описание |
1 |
2 |
THREAD_PRIORITY_TIME_CRITICAL |
Time-critical. Поток выполняется c приоритетом 31 в классе real-time и с приоритетом 15 в других классах. |
THREAD_PRIORITY_HIGHEST |
Highest. Поток выполняется с приоритетом на два уровня выше обычного для данного класса |
THREAD_PRIORITY_ABOVE_NORMAL |
Above Normal. Поток выполняется с приоритетом на один уровень выше обычного для данного класса |
THREAD_PRIORITY_NORMAL |
Normal. Поток выполняется с обычным уровнем приоритета для данного класса |
Продолжение таблицы 5.7
1 |
2 |
THREAD_PRIORITY_BELOW_NORMAL |
Below Normal. Поток выполняется с приоритетом на один уровень ниже обычного для данного класса |
THREAD_PRIORITY_LOWEST |
Lowest. Поток выполняется с приоритетом на два уровня ниже обычного для данного класса |
THREAD_PRIORITY_IDLE |
Idle. Поток выполняется c приоритетом 15 в классе real-time и с приоритетом 1 в других классах. |
5.3. Примеры программ для работы с процессами и потоками
5.3.1. Создание процесса с помощью функции CreateProcess.
В данном примере создается процесс «блокнот».
VAR StartInfo:TStartUpInfo;
ProcInfo:TProcessInformation;
begin
//Очистка полей структуры StartInfo
FillChar(StartInfo,Sizeof(StartInfo),#0);
StartInfo.cb:=Sizeof(StartInfo);
If not CreateProcess(nil,'C:\WINNT\system32\notepad.exe C:\File1.txt',nil,nil,False,
NORMAL_PRIORITY_CLASS,nil,nil,StartInfo,ProcInfo)
then ShowMessage('Ошибка '+IntToStr(GetLastError))
else Closehandle(ProcInfo.hProcess)
end;
5.3.2. Создание процесса с помощью функции WinExec.
VAR ErrCode:Integer;
PName:Array [0..79] of char;
begin
If OpenDialog1.Execute then
begin
ErrCode:=WinExec(StrPCopy(PName,OpenDialog1.FileName),SW_RESTORE);
PName:=PName;
Case ErrCode of
0: ShowMessage('Не хватает памяти или ресурсов');
ERROR_BAD_FORMAT:
ShowMessage('Ошибочный файл '+PName);
ERROR_FILE_NOT_FOUND:
ShowMessage('Не найден файл '+PName);
ERROR_PATH_NOT_FOUND:
ShowMessage('Не найден каталог '+ExtractFilePath(OpenDialog1.FileName));
end;
end;
end;
5.3.3. Создание процесса с помощью функции ShellExecute.
VAR
POperation:Array[0..50] of Char;
PFilename:Array[0..254] of Char;
begin
POperation:='open'+#0;
PFilename:='C:\WINNT\system32\calc.exe'+#0;
ShellExecute(Handle,POperation,PFilename,nil,nil,SW_RESTORE);
end;
5.3.4. Создание многопоточного приложения.
В данном примере создается многопоточное приложение, выполняющее следующие действия:
Первичный поток открывает файл для записи и запускает еще два потока. Второй поток за предоставляемый квант времени увеличивает счетчик на 1. Третий поток за предоставляемый квант времени записывает очередное значение счетчика в файл. Первичный поток работает, пока значение счетчика не станет больше 30, после чего первичный поток завершает работу второго и третьего потоков.
1. Описание глобальных переменных, используемых всеми потоками. (Например, в блоке VAR в начале программы).
var
Form1: TForm1;
sum:Integer;
f:TextFile;
implementation …..
2. В начале программы следует описать второй и третий потоки.
implementation
{$R *.dfm}
procedure Thread1;
begin
While Sum<20 do
begin
Inc(Sum); Sleep(30);
end;
end;
procedure Thread2;
begin
While Sum <20 do
begin
Writeln(f,IntToStr(Sum)); Sleep(30);
end;
end;
3. Первичный поток имеет вид:
VAR hThread1,hThread2:THandle;
pFunc1,pFunc2:pointer;
ThreadID1,ThreadID2:CARDINAL;
begin
Sum:=0;
AssignFile(f,'C:\temp.txt'); Rewrite(f);
pFunc1:=@Thread1; pFunc2:=@Thread2;
hThread1:=CreateThread(nil,0,pFunc1,nil,0,ThreadID1);
hThread2:=CreateThread(nil,0,pFunc2,nil,0,ThreadID2);
While Sum<20 do Sleep(30);
ShowMessage ('Работа завершена');
CloseFile(f);
TerminateThread(hThread1,0); TerminateThread(hThread2,0);
end;