
- •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
Дотаток г Текст програми synchr3.Asm
;------------------------------------------------------------------------------
;synch3.asm - Win32 консольна программа
;для вивчення засобів синхронізації потоків в режимі ядра.
;------------------------------------------------------------------------------
.486
.model flat,STDCALL ;модель пам'яти flat,
;STDCALL - передача параметрів в стилі С (справа наліво),
;процедура, що викликається чистить за собою стек
%NOINCL ;заборонити виведення тексту файлів включення
include WindowConA.inc
;Об’явлення зовнішніми функцій Win32 (ASCII), що використовуються у програмі:
extrn AllocConsole:PROC
extrn SetConsoleTitleA:PROC
extrn SetConsoleCursorPosition:PROC
extrn ReadFile:PROC
extrn CloseHandle:PROC
extrn ExitProcess:PROC
extrn MoveFileA:PROC
extrn CreateFileA:PROC
extrn GetStdHandle:PROC
extrn WriteConsoleA:PROC
extrn ReadConsoleA:PROC
extrn WriteFile:PROC
extrn GetLastError:PROC
extrn CreateThread:PROC
extrn ExitProcess:PROC
extrn SwitchToThread:PROC
extrn Sleep:PROC
extrn InitializeCriticalSection:PROC
extrn WaitForSingleObject:PROC
extrnCreateEventA:PROC
extrn SetEvent:PROC
;Макрокос установки курсора у задану позицію
Set_cursor macro cursor,posx,posy,descr,lbl
mov cursor.xx,posx
push eax
mov ax,posy
mov cursor.yy,ax
pop eax
push cursor
push descr
call SetConsoleCursorPosition
cmp eax, 0
jz lbl ;якщо невдача
endm
;структура для установки положення курсору в консолі:
COORD struc
xx dw 0
yy dw 0
COORD ends
.data
con COORD <>
dummy dd 0 ;фіктивний аргумент функції потоку
pThreadID dd 0
hThread dd 0 ;дескриптор потоку 0
pThreadID1 dd 0
hThread1 dd 0 ;дескриптор потоку 1
hEvent dd 0 ;дескриптор події
dOut dd 0 ;дескриптор виводу консолі
dIn dd 0 ;дескриптор вводу консолі
str_out0 db "Client 0: ",0
len_out0=$-str_out0
str_out1 db "Client 1:",0
len_out1=$-str_out1
NumWri dd 0
buffer db 20 dup(0)
nbuff dd 20
title_text db "Synchronisation test",0
.code
start proc
;точка входу до програми:
;запит консоли
call AllocConsole
;перевіріти успіх запиту консолі
test ax,ax
jz exit ;якщо невдача
;Виведення заголовку консолі
push offset title_text
call SetConsoleTitleA
;-------отримати стандартний дескриптор виводу-----------------
push STD_OUTPUT_HANDLE
call GetStdHandle
mov dOut,eax ;у dOut-дескриптор виводу ;консолі
cmp eax, 0
jz exit ;якщо невдача
;-------отримати стандартний дескриптор введення--------------
push STD_INPUT_HANDLE
call GetStdHandle
mov dIn,eax ;у dIn-дескриптор введення консолі
cmp eax, 0
jz exit ;якщо невдача
;-----------Створення події-----------------------------------------------
push NULL
push TRUE
push FALSE
push NULL
call CreateEventA
cmp eax,NULL
je exit ;якщо невдача
mov hEvent,eax
;-----------Створення дочірніх потоків-------------------------------
push offset pThreadID
push NULL
push offset dummy
push offset ThreadProc
push NULL
push NULL
call CreateThread
cmp eax,NULL
je exit ;якщо невдача
mov hThread,eax
push offset pThreadID1
push NULL
push offset dummy
push offset ThreadProc1
push NULL
push NULL
call CreateThread
cmp eax,NULL
je exit ;якщо невдача
mov hThread1,eax
;--------очикування закінчення роботи потоків----------------------
push 0ffffffffh
push hThread
call WaitForSingleObject
push 0ffffffffh
push hThread1
call WaitForSingleObject
;-------вивести зміст буферу--------------------------------------------
Set_cursor con,1,5,dOut,exit
push 0
push offset NumWri ;кількість виведених на екран
; символів
push nbuff ;длина рядку для виводу на екран
push offset buffer ;адреса рядку для виводу на екран
push dOut
call WriteConsoleA
cmp eax,0
jz exit ;якщо невдача
;-------Перевести подію у вільний стан-------------------------------
push hEvent
call SetEvent
;-------очикування переводу каретки для виходу-------------------
push 0
push offset NumWri ;кількість виведених символів
push len_out0 ;розмір буферу введення
push offset str_out0
push dIn
call ReadConsoleA
cmp eax, 0
jz exit ;якщо невдача
exit:
;-----------Закриття описувача дочірнього потоку-----------------
push hThread
call CloseHandle
push hThread1
call CloseHandle
;------------Вихід з програми-------------------------------------------
;підготовка виклику VOID ExitProcess(UINT uExitCode)
push 0
call ExitProcess
start endp
;--------------Процедура потоку 0 -------------------------------------
ThreadProc proc
arg param:DWORD
uses ebx,edi,esi
;-------Чекання події----------------------------------------------------
push 0ffffffffh
push hEvent
call WaitForSingleObject
;-------вивести повідомлення----------------------------------------
Set_cursor con,1,1,dOut,exit_proc
push 0
push offset NumWri ;кількість виведених
; на екран символів
push len_out0 ;довжина рядку для виводу на екран
push offset str_out0 ;адреса рядку для виводу на екран
push dOut
call WriteConsoleA
;-------ввести рядок-------------------------------------------------
push 0
push offset NumWri ;кількість введених символів
push nbuff ;довжина рядку для виводу на екран
push offset buffer ;адреса буферу для введеного рядку
push dIn
call ReadConsoleA
cmp eax,0
jz exit ;якщо невдача
exit_proc:
push hEvent
call SetEvent
ret
ThreadProc endp
;--------------Процедура потоку 1-------------------------------------------
ThreadProc1 proc
arg param:DWORD
uses ebx,edi,esi
;-------Чекання події---------------------------------------------------------------
push 0ffffffffh
push hEvent
call WaitForSingleObject
;-------вивести повідомлення----------------------------------------------------
Set_cursor con,1,3,dOut,exit_proc1
push 0
push offset NumWri ;кількість виведених
; на екран символів
push len_out1 ;довжина рядку для виводу на екран
push offset str_out1 ;адреса рядку для виводу на екран
push dOut
call WriteConsoleA
;------ввести рядок-----------------------------------------------------------------
push 0
push offset NumWri ;кількість введених символів
push nbuff ;довжина рядку для виводу на екран
push offset buffer ;адреса буферу для введеного рядку
push dIn
call ReadConsoleA
cmp eax,0
jz exit ;якщо невдача
exit_proc1:
push hEvent
call SetEvent
ret
ThreadProc1 endp
end start