- •1 Дослідження структури виконуваного файлу ре - формату
- •1.1 Мета роботи
- •1.2 Основні відомості
- •1.3 Самостійна підготовка
- •1.4 Порядок виконання роботи
- •2.3 Самостійна підготовка
- •2.4 Порядок виконання роботи
- •4 Синхронізація потоків у режимі ядра
- •4.1 Мета роботи
- •4.2 Основні відомості
- •3.3 Самостійна підготовка
- •3.4 Порядок виконання роботи
- •4.3 Самостійна підготовка
- •4.4 Порядок виконання роботи
- •Перелік посилань
- •Дотаток а Текст програми read_pe.Asm
- •Дотаток б Текст програми thread1.Asm
- •Дотаток в Текст програми synchr1.Asm
- •Дотаток г Текст програми synchr3.Asm
Дотаток б Текст програми thread1.Asm
;-----------------------------------------------------------------------
;thread1.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 Sleep: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
;Структура для передання параметрів у процедуру
THREAD_PARAM struc
fnam db "outputfile.dat",16 dup(0) ;ім’я файла для запису
str db "string for writing",13,11 dup(0) ;рядок для запису
nums dd 19
numrep dd 50000 ;число повторень запису рядку
THREAD_PARAM ends
;структура для установки положення курсору в консолі:
COORD struc
xx dw 0
yy dw 0
COORD ends
.data
t_param THREAD_PARAM <>
con COORD <>
pThreadID dd 0
hThread dd 0
dOut dd 0 ;дескриптор виводу консолі
dIn dd 0 ;дескриптор вводу консолі
NumWri dd 0
string1 db "Thread creation",13,0
len1= $-string1
string2 db "Press <Enter> to terminate parent thread",13,0
len2= $-string2
string3 db "Child thread begins operation",13,0
len3= $-string3
string4 db "Child thread terminates operation",13,0
len4= $-string4
title_text db "Multythread application",0
numrow dw 1
time_sleep dd 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 ;якщо невдача
;------вивести повідомлення------------------------------------------------------
Set_cursor con,1,numrow,dOut,exit
inc numrow
push 0
push offset NumWri ;кількість виведених на екран
;символів
push len1 ;довжина рядку для виводу на екран
push offset string1 ;адреса рядку для виводу на екран
push dOut
call WriteConsoleA
cmp eax,0
jz exit ;якщо невдача
;----------створення дочірнього потоку------------------------------------------
push offset pThreadID
push NULL
push offset t_param
push offset ThreadProc
push NULL
push NULL
call CreateThread
cmp eax,NULL
je exit ;якщо невдача
mov hThread,eax
;----------Закриття описувача дочірнього потоку-----------------------------
push hThread
call CloseHandle
;------------Затримка у виконанні потоку---------------------------------------
push time_sleep
call Sleep
;------------Вивести повідомлення------------------------------------------------
Set_cursor con,1,numrow,dOut,exit
inc numrow
push 0
push offset NumWri ;кількість виведених на екран
;символів
push len2 ;довжина рядку для виводу на екран
push offset string2 ;адреса рядку для виводу на екран
push dOut
call WriteConsoleA
cmp eax,0
jz exit ;якщо невдача
;-------очикування переводу каретки для виходу---------------------------
push 0
push offset NumWri ;кількість виведених символів
push len1 ;розмір буферу вводу
push offset string1
push dIn
call ReadConsoleA
cmp eax, 0
jz exit ;якщо невдача
exit:
;Вихід з програми
;Підготовка виклику VOID ExitProcess(UINT uExitCode)
push 0
call ExitProcess
start endp
;--------------Процедура потоку--------------------------------------------
ThreadProc proc
arg pt_param:DWORD
uses ebx,edi,esi
local @hFile:DWORD
;-------Вивести повідомлення---------------------------------------------
Set_cursor con,1,numrow,dOut,exit_proc
inc numrow
push 0
push offset NumWri ;кількість виведених на екран
;символів
push len3 ;довжина рядку для виводу на екран
push offset string3 ;адреса рядку для виводу на екран
push dOut
call WriteConsoleA
;Відчиняємо файл (CreateFileA)
push 0
push NULL ;атрибути (вони ігноруються)
push OPEN_ALWAYS ;відчинити або створити файл
push 0 ;захист файлу не потрібний
push FILE_SHARE_WRITE ;дозволено сумісне
;використання файлу (за записом)
push GENERIC_WRITE ;дозволено записувати у файл
push pt_param
call CreateFileA
cmp eax,0ffffffffh
je exit_proc ;якщо невдача
mov @hFile,eax ;дескриптор файла
;----------------------------------------------------------------------------------
mov ebx,pt_param
mov edx,ebx
add edx,30
mov ecx,dword ptr[ebx+64]
jecxz exit_proc
cycl:
push ecx
push edx
;-----------Запись строки в файл (WriteFile)------------------------
push NULL ;синхронне введення
push offset NumWri ;покажчик на буфер з кількістю
;записаних байтів
push dword ptr [ebx+60] ;число байтів для виводу
push edx ;покажчик на рядок для запису
push @hFile ;дескриптор відчиненого файлу
call WriteFile
cmp eax,NULL
je exit_proc ;якщо неуспіх
pop edx
pop ecx
loop cycl
exit_proc:
;------------Закриття файла (CloseHandle)-------------------------------
push @hFile
call CloseHandle
;------------Вивести повідомлення----------------------------------------
Set_cursor con,1,numrow,dOut,exit_proc
inc numrow
push 0
push offset NumWri ;кількість виведених на екран
;символів
push len4 ;длина рядку для виводу на екран
push offset string4 ;адреса рядку для виводу на екран
push dOut
call WriteConsoleA
ret
ThreadProc endp
end start
