Professional Documents
Culture Documents
Лабораторна робота №5
Лабораторна робота №5
1
2. Приклад програми створення DLL
;--------------------------------------------------
; My_DLL.asm
;---------------------------------------------------
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
AppName db "My_DLL",0
HelloMsg db "Привіт! Це функція з бібліотеки My_DLL",0
LoadMsg db "Завантаження бібліотеки DLL у пам'ять ",0
UnloadMsg db "Вивантаження бібліотеки DLL з пам'яті",0
ThreadCreated db "Створення вітки у цьому процесі",0
ThreadDestroyed db "Знищення вітка цього процесу",0
.code
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
.if reason==DLL_PROCESS_ATTACH
invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
.elseif reason==DLL_PROCESS_DETACH
invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK
.elseif reason==DLL_THREAD_ATTACH
invoke MessageBox,NULL,addr ThreadCreated,\
addr AppName,MB_OK
.else ;.if reason== DLL_THREAD_DETACH
invoke MessageBox,NULL,addr ThreadDestroyed,\
addr AppName,MB_OK
.endif
mov eax,TRUE
ret
DllEntry Endp
TestHello proc
invoke MessageBox,NULL,addr HelloMsg,addr AppName,MB_OK
ret
TestHello endp
End DllEntry
2
Кожна DLL повинна мати стартову функцію.
Windows викликає цю функцію у випадку коли:
- DLL завантажується перший раз у пам’ять;
- DLL вивантажується з пам’яті;
- створюється нова вітка в цьому ж процесі;
- знищується нова вітка цього процесу; Ця
функція одержує три параметри:
hinstDLL – це дескриптор модуля DLL.
reason - може мати одне з чотирьох значень:
• DLL_PROCESS_ATTACH – DLL одержує це значення коли вперше
загружається в адресний простір процесу.
• DLL_PROCES_DETACH – DLL одержує це значення коли
вивантажується з адресного простору процесу.
• DLL_THREAD_ATTACH – DLL одержує це значення коли процес
створює нову вітку.
• DLL_THREAD_DETACH –DLL одержує це значення коли процес
reserved – визначає наступні аспекти встановлення або очищення
DLL. (рідко викоритовується)
Для того, щоб можна було використовувати функції з бібліотеки іншою
програмою, їх потрібно оголосити в файлі імпорту : My_DLL.def
LIBRARY My_DLL
EXPORTS TestHello LIBRARY - Вказує ім’я
бібліотеки.
EXPORTS - Повідомляє компонувальник (лінкер) які функції в DLL
експортуються, тобто викликаються із інших програм. В даному випадку нам
потрібно щоб інші програми могли викликати функцію TestHello.
Опис параметрів:
/c – говорить MASM’у створити .obj файл формату COFF (Common
Object File), який використовується в ОС UNIX як його власний
об'єктний і виконуваний формат файлів.
/Cp – говорить MASM’у зберігати регістр назв, заданих програмістом.
Можна також вставити в код програми (після директиви .model) стрічку
:option casemap:none, щоб одержати такий самий ефект, тобто, щоб MASM
розрізняв великі і малі символи.
3
/DLL – говорить link’еру створити DLL
/SUBSYSTEM:WINDOWS – говорить ink’еру якого виду буде
виконуваний модуль.
/DEF - підключає файл імпорту в якому оголошені функції.
/LIBPATH – говорить link’еру де знаходяться бібліотеки імпорту.
5. Приклад використання функції з бібліотеки
includelib My_DLL.lib
includelib \masm32\lib\kernel32.lib
TestHello PROTO
.c
od
e
st
ar
t:
invoke TestHello
invoke ExitProcess,NULL end
start
4
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
.data
LibName db "My_Dll.dll",0
FunctionName db "TestHello",0
DllNotFound db "Неможливо загрузити бібліотеку",0
AppName db "Load Library",0
FunctionNotFound db "Неможливо знайти TestHello функцію",0
.data? hLib dd
?
TestHelloAddr
dd ?
.c
od
e
st
ar
t:
invoke LoadLibrary,addr LibName
.if eax==NULL
invoke MessageBox,NULL,addr DllNotFound,\
addr AppName,MB_OK
.else
mov hLib,eax
invoke GetProcAddress,hLib,addr FunctionName
.if eax==NULL
invoke
MessageBox,NULL,\
addr
FunctionNotFound,\
addr AppName,MB_OK
.else
mov TestHelloAddr,eax
call [TestHelloAddr]; Виклик ф-ї з
; бібліотеки
.endif
invoke FreeLibrary,hLib ; Зменшує лічильник
зсилок ; на бібліотеку ,якщо цей лічильник рівний нулю, то це
означає, що
;бібліотеки вже ніхто не використовує і вона
вивантажується з ;пам’яті .endif
invoke ExitProcess,NULL
end start
1 0 00001371 ActivateKeyboardLayout
2 1 00005940 AdjustWindowRect
3 2 0000161B AdjustWindowRectEx
4 3 00001158 AlignRects
.data
AppName db "My_DLL",0
.code
6
invoke ExitProcess, NULL
End DllEntry
.data
Message db "Hello, World",0
.c
od
e
st
ar
t:
invoke TestHello, addr
Message invoke
ExitProcess,NULL end start
9. Хід роботи
7
- завдання, робочий варіант тексту програми, результат виконання
програми;
- короткі висновки по проведеній роботі.
11. Завдання
8
На 95 балів потрібно розробити дві програми згідно варіанту.
1. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточний день тижня
(Понеділок, …). Розробити другу програму, котра використовує цю
функцію.
2. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточну директорію
розміщення системних файлів ОС Windows. Розробити другу
програму, котра використовує цю функцію.
3. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточні координати
курсору . Розробити другу програму, котра використовує цю функцію.
4. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточний час (00:00:00).
Розробити другу програму, котра використовує цю функцію.
5. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, котра передає поточний день тижня
(Понеділок, …) параметром у функцію бібліотеки.
6. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточне ім’я користувача .
Розробити другу програму, котра використовує цю функцію.
7. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточне ім’я комп’ютера.
Розробити другу програму, котра використовує цю функцію.
8. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, котра передає поточний час (00:00:00)
параметром у функцію бібліотеки.
9. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточний місяць
(Січень,…). Розробити другу програму, котра використовує цю
функцію.
10. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, котра передає поточні координати курсору
параметром у функцію бібліотеки.
11. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, котра передає поточний місяць (Січень,…)
параметром у функцію бібліотеки.
9
12. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточний місяць (Січень,..)
параметром у функцію бібліотеки.
13. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, що передає поточне ім’я комп’ютера
параметром у функцію бібліотеки.
14. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточну директорію
розміщення ОС Windows.
15. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточне ім’я комп’ютера
параметром у функцію бібліотеки.
16. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, що передає поточні координати курсору
параметром у функцію бібліотеки
17. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточний час (00:00:00)
параметром у функцію бібліотеки.
18. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, котра передає поточну директорію
розміщення системних файлів ОС Windows параметром у функцію
бібліотеки.
19. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає Поточний місяць (Січень,..)
параметром у функцію бібліотеки.
20. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення
Розробити другу програму, що передає поточну дату (00.00.00)
параметром у функцію бібліотеки.
21. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточну дату (00.00.00)
параметром у функцію бібліотеки.
22. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
10
другу консольну програму, що передає поточну директорію
розміщення ОС Windows параметром у функцію бібліотеки.
23. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, що передає поточний день тижня
(Понеділок,…) параметром у функцію бібліотеки.
24. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, що передає поточну директорію
розміщення системних файлів ОС Windows.
25. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточне ім’я користувача
параметром у функцію бібліотеки.
26. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточну дату (00.00.00)
параметром у функцію бібліотеки.
27. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточну директорію
розміщення ОС Windows параметром у функцію бібліотеки.
28. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточне ім’я користувача
параметром у функцію бібліотеки.
12. Контрольні запитання