Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра АСУ
Звіт до
лабораторної роботи №2
з курсу « Системного програмування»
на тему «Структури даних для використання системних функцій»
Львів 2014
Тема – структури даних для використання системних функцій.
Мета – навчитися будувати структури даних для використання функцій Win32 API при програмуванні в операційній системі Windows.
ТЕОРЕТИЧНІ ПОЛОЖЕННЯ
Для використання більш складних функцій API необхідно використовувати спеціальні структури даних. Вся концепція програмування в WINDOWS основана на чіткому впорядкуванні структур даних, пов'язаних із ними програм-функцій та констант-параметрів. Дані, що пов'язані з виконанням одної функції об'єднуються в блок певної довжини (він називається структурою). Елементами таких структур можуть бути інші структури і т.д. Існують структури загального користування, які не пов'язані з конкретною функцією API, а містять довідкову інформацію про систему, файли, користувача, тощо. Дані, що зберігаються в цих структурах постійно змінюються і деколи їх неможливо передбачити. Тому для отримання цих даних не можна користуватися звичайними командами читання з пам’яті типу “mov”. Перед користуванням такою динамічною інформацією необхідно перевірити, чи готова інформація для споживання. Щоб уникнути некоректності при умові паралельного виконання процесів кожне звернення до системної інформації необхідно регіструвати. Тому фактично існує два типа функцій API:
а) функції, які виконують будь-яку дію;
б) функції, які отримують будь-яку інформацію.
У даній лабораторній роботі треба отримати та розшифрувати одну з таких довідкових структур, яка містить інформацію про системний час. Для виклику довільної довідкової функції необхідно вказати адресу місця в пам'яті, куди буде записана довідкова структура. Цю адресу, як параметр функції, завжди перед викликом функції треба опустити в стек.
В лабораторній роботі необхідно також звернути увагу на те, що в програмі можна використовувати не лише функції API, але і функції різних мов програмування. Для цього необхідно, щоб в системі були присутні відповідні DLL-файли. Наприклад, можна викликати функцію виводу wsprintf, яка використовується в мові C. Ця функція передає управління до функції _wsprintfA, що міститься у файлі USER32.DLL. Функції такого типу можуть не звільняти після свого виконання стек. В такому випадку програміст сам повинен про це подбати. Отже, оскільки кожний параметр у стеку займає 4 байти, то після виклику такої функції необхідно записати add esp,4*N, де N – кількість параметрів для виконання функції (див. текст програми).
Завдання
Вивести інформацію про локальні диски або локальний час
Код: (INC файл)
include kernel32.inc
include user32.inc
includelib IMPORT32.LIB
MB_OK equ 0h ; кнопка ОК
MB_OKCANCEL equ 1h ; -\\- OK та Cancel
MB_ABORTRETRYIGNORE equ 2h ; итп.
MB_YESNOCANCEL equ 3h
MB_YESNO equ 4h
MB_RETRYCANCEL equ 5h
MB_ICONHAND equ 10h ; іконка у вигляді стоп сигнала
MB_ICONQUESTION equ 20h ; іконка "?"
MB_ICONEXCLAMATION equ 30h ; Іконка "!"
MB_ICONASTERISK equ 40h ; іконка з знаком "і"
MB_ICONERROR equ MB_ICONHAND ; то саме, що MB_ICONHAND
MB_ICONINFORMATION equ MB_ICONASTERISK ; то саме, що MB_ICONASTERISK
MB_ICONSTOP equ MB_ICONHAND ; то саме, що MB_ICONHAND
MB_ICONWARNING equ MB_ICONEXCLAMATION; то саме, що MB_ICONEXCLAMATION
IDOK equ 1 ; якщо ОК
IDCANCEL equ 2 ; якщо відміна (Cancel)
IDABORT equ 3 ; ітп
IDRETRY equ 4
IDIGNORE equ 5
IDYES equ 6
IDNO equ 7
IDCLOSE equ 8
IDHELP equ 9
.data
format db 'Сьогодні (%s)',13,10
db '%02d %s %04d '
db '[%02d:%02d:%02d]',13,10,13,10
db '=<^_^>=',0
szV db 'Перерахувати існуючі диски (кнопка так)',13,10,'Визначити час (кнопка ні)',0
result db 260 dup(0)
Lab_text db 'Лабораторна робота №2',0
Day_of_week db 'Неділя',4 dup(0),\
'Понеділок',0,\
'Вівторок',2 dup(0),\
'Середа',4 dup(0),\
'Четверг',3 dup(0),\
"П'ятниця",2 dup(0),\
'Субота',0
szMonth db 'Січня',5 dup(0),\
'Лютого',4 dup(0),\
'Березня',3 dup(0),\
'Квітня',4 dup(0),\
'Травня',4 dup(0),\
"Червня",4 dup(0),\
"Липня",5 dup(0),\
"Серпня",4 dup(0),\
"Вересня",3 dup(0),\
"Жовтня",4 dup(0),\
"Листопада",0,\
"Грудня",0
szlitera db 'A:\',13,10,0
time:
wYear dw 0
wMonth dw 0
wDayOfWeek dw 0
wDay dw 0
wHour dw 0
wMinute dw 0
wSecond dw 0
wMilliseconds dw 0
Код: (ASM файл)
.386
.model flat,stdcall
include l2.inc
.code
begin:
push MB_YESNO+ MB_ICONQUESTION
push offset Lab_text
push offset szV
push 0
call MessageBox
cmp eax,IDYES
jz @local_disk
push offset time
call GetLocalTime
xor eax,eax
mov ax,wSecond
push eax
mov ax,wMinute
push eax
mov ax,wHour
push eax
mov ax,wYear
push eax
mov ax,wMonth
dec ax
mov bx,10
mul bx
add eax,offset szMonth
push eax
xor eax,eax
mov ax,wDay
push eax
mov ax,wDayOfWeek
mov bx,10
mul bx
add eax,offset Day_of_week
push eax
push offset format
push offset result
call wsprintf
add esp,9*4
push MB_OK + MB_ICONINFORMATION
push offset Lab_text
push offset result
push 0
call MessageBox
jmp @ex
@local_disk:
call GetLogicalDrives
mov ecx,26
@a0:
rcr eax,1
jnc @1
push ecx
push eax
push offset szlitera
push offset result
call lstrcat
pop eax
pop ecx
@1:
inc szlitera
loop @a0
push MB_OK + MB_ICONINFORMATION
push offset Lab_text
push offset result
push 0
call MessageBox
@ex:
call ExitProcess,0
end begin
///
Висновок: виконавши лабораторну роботу я навчився працювати з структурами.