
- •1 Дослідження структури виконуваного файлу ре - формату
- •1.1 Мета роботи
- •1.2 Основні відомості
- •1.3 Самостійна підготовка
- •1.4 Порядок виконання роботи
- •2.3 Самостійна підготовка
- •2.4 Порядок виконання роботи
- •3.3 Самостійна підготовка
- •3.4 Порядок виконання роботи
- •4 Синхронізація потоків у режимі ядра
- •4.1 Мета роботи
- •4.2 Основні відомості
- •4.3 Самостійна підготовка
- •4.4 Порядок виконання роботи
- •Перелік посилань
- •Дотаток а Текст програми read_pe.Asm
- •Дотаток б Текст програми thread1.Asm
- •Дотаток в Текст програми synchr1.Asm
- •Дотаток г Текст програми synchr3.Asm
4.3 Самостійна підготовка
Підготуйте бланк звіту. Проробіть рекомендовану літературу [1],[2].
При підготовці зверніть увагу на такі питання:
а) основні особливості використання об’єктів ядра для синхронізації;
б) перелік об’єктів ядра та їх створення;
в) використання Wait – функцій;
г) організація доступу до ресурсів, що розділяються, за допомогою подій і м’ютексів.
Уважно проаналізуйте текст програми synchr3.asm (додаток Г), в якої два дочірніх потоки видають запит на введення рядку з консолі та записують свої рядки в один буфер, який потім виводиться батьківським потоком на екран консолі. Введення з консолі і зміна змісту буфера виконуються як клієнтський запит в монопольному режимі. Для розподілу доступу до виконання цієї операції використаний об’єкт “подія”.
4.4 Порядок виконання роботи
В будь якому текстовому редакторі наберіть текст модуля synchr3.asm, який наведено у додатку Г і збережіть його на диску.
Сформуйте модуль, що виконується (файл synchr3.exe).
Перевірте роботу програми synchr3.exe.
Дослідіть як зміниться результат виводу на консоль, якщо закоментувати рядки коду, пов’язані з викликом функції WaitForSingleObject та функції SetEvent, яка переводить об’єкт – “подію” у вільний стан.
Модифікуйте програму таким чином, щоб та же задача була вирішена за допомогою об’єкта ядра – “м’ютекс”.
Підготуйте модифіковану Вами програму до виконання за допомогою засобів пакету TASM.
Протестуйте роботу Вашої програми і занесіть у звіт її текст.
Перелік посилань
1. Рихтер Д. Windows для профессионалов: создание эффективных Win32 – приложений., 2001.- 825с.
2. Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение., 2001.- 736с.
Дотаток а Текст програми read_pe.Asm
;-----------------------------------------------------------------------------
;read_pe.asm - Win32-консольна програма для дослідження
;структури файлів формату PE за допомогою відладчика.
;-----------------------------------------------------------------------------
.486
.model flat,STDCALL ;модель пам’яті flat,
;STDCALL - передача параметрів в стилі С (справа наліво),
; процедура, що викликається, чистить за собою стек
%NOINCL ;заборонити виведення тексту файлів включення.
include WindowConA.inc
;Объявлення зовнішніми функцій Win32 (ASCII), що використовуються:
extrn AllocConsole:PROC
extrn SetConsoleTitleA:PROC
extrn ReadFile:PROC
extrn CloseHandle:PROC
extrn ExitProcess:PROC
extrn CopyFileA:PROC
extrn MoveFileA:PROC
extrn CreateFileA:PROC
extrn GetFileInformationByHandle:PROC
extrn GetLastError:PROC
extrn GetFileTime:PROC
extrn SetFileTime:PROC
extrn BeginPaint:PROC
extrn CreateWindowExA:PROC
extrn DefWindowProcA:PROC
extrn DispatchMessageA:PROC
extrn EndPaint:PROC
extrn ExitProcess:PROC
extrn FindWindowA:PROC
extrn GetMessageA:PROC
.data
lpbuff db 1000 dup(0)
TitleText db ‘Читання файла в форматі PE’,0
lpfnam db "my_file.exe",0
hFile dd 0
numbyte dd 1000
numread dd 0
pheader dd 0
.code
start proc near ;точка входу до програми
;запит консолі
call AllocConsole
;перевірка успіху запиту консолі
test ax,ax
jz exit ;якщо невдача
;----------------------CreateFile--------------------------------------
;відкриття файлу (CreateFileA)
push 0
push NULL ;атрибути (вони ігноруються)
push OPEN_EXISTING ;відкриття існуючого файлу,
;якщо його немає - помилка
push 0 ;захист файла не потребується
push FILE_SHARE_READ ;дозволено сумісне
; використання файла (за читанням)
push GENERIC_READ ;дозволено читання з файла
push offset lpfnam
call CreateFileA
cmp eax,0ffffffffh
je exit ;якщо невдача
mov hFile,eax ;дескриптор файла
;-----Читання перших numbyte байтів з відкритого файла (ReadFile)-----
push NULL ;синхронне введення
push offset numread ;покажчик на буфер з кількістю
; прочитаних байтів
push numbyte ;кількість байтів для читання
push offset lpbuff ;покажчик на буфер для читання
push hFile ;дескриптор відкритого файла
call ReadFile
cmp eax,NULL
je exit ;якщо неуспіх
;------------Закриття файла (CloseHandle)-------------------------
mov eax,dword ptr (lpbuff+003ch)
mov ebx,dword ptr (lpbuff+eax)
mov pheader,ebx
;результат дивимось у відладчику TD32.exe
;… … …
push hFile
call CloseHandle
exit:
;вихід з програми
;готуємо виклик VOID ExitProcess(UINT uExitCode)
push 0
call ExitProcess
start endp
end start