Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Інститут комп’ютерних наук та інформаційних технологій
Кафедра автоматизованих систем управління
Mетодичні вказівки до курсового проектування
по системному програмуванню
для студентів базової вищої освіти
за напрямком 07.08.04 “Комп’ютерні науки”
та 07.09.27 “Видавничо-поліграфічна справа”
Львів - 2004
Методичні вказівки для курсового проектування по системному програмуванню.
Методичні вказівки для студентів базової вищої освіти за напрямком 07.08.04 “Комп’ютерні науки”
та 07.09.27 “Видавничо-поліграфічна справа”, Львів, НУ “Львівська політехніка”, 2004 р.
Рецензент: Вальковський В.О., д.ф-м.н., проф.
Укладачі: Зербіно Д.Д., канд. техн. наук, доц.,
Цимбал Ю.В., асистент.
Відповідальний за випуск: Шпак З.Я. к.т.н., доц.
Метою даних методичних вказівок є допомога студентам у підготовці курсового проекту. Курсовий проект – це кваліфікаційна творча робота, яка виконується під час семестру і призначена для систематизації теоретичних знань та закріплення практичних навичок, а також для оцінювання інтелектуального потенціалу студента з даного предмету.
Тема для курсового проекту може бути обрана студентом і повинна відповідати напрямку системного програмування. Тема вибирається на початку семестру та узгоджується з викладачем, який буде приймати курсовий проект. Якщо студент не може самостійно вибрати тему, то викладач допомагає йому. Вона повинна мати певний логічний зміст і викликати зацікавлення у студента, який її виконує. Якщо студент не з’являється до викладача для узгодження теми, то курсова робота (або проект) не зараховується. Тема не повинна порушувати існуюче законодавство або повторювати тему, яку виконує інший студент, інакше курсовий проект також не може бути зарахований. Тема обумовлює вирішення певних задач при своєму розкритті.
Курсовий проект складається з наступних розділів. Вступ – короткий розділ, в якому аналізується логічний зміст теми проекту та перелічуються задачі, які виникають при її розкритті. Огляд літературних джерел – розділ, в якому досліджуються інформаційні джерела для вирішення поставлених задач. Цей розділ може містити необхідну довідкову інформацію для цих задач. Основна частина складається з декількох підрозділів, яким можна давати окремі назви. Як правило, першим підрозділом є “постановка задачі” – підрозділ, в якому на основі оглянутих літературних джерел обмежуються та уточнюються задачі, вказуються методи їх вирішення, а також вибирається їх послідовність. У наступному підрозділі, як правило, вводиться система понять, яка описує дану тему, а також найбільш загальні концепції та ідеї вирішення. Цей підрозділ може називатись “структура інформаційних зв’язків” або “інформаційно-логічна модель”. Взаємозв’язки між поняттями можуть бути виражені схематично в графічній формі. Кожний зв’язок може представлятись у вигляді змінної або структури даних, які відповідним чином повинні бути описані. Наступний підрозділ містить розв’язок основних задач. В ньому описують алгоритм, текст програми, а також основні змінні та структури даних. Цей підрозділ може називатись “алгоритм розв’язку задачі”. В кінці розділу аналізують контрольні приклади, які демонструють якість та рівень вирішення задач. Висновок – розділ, в якому зроблені підсумки і проаналізована робота в цілому. Цей розділ характеризує загальний інтелектуальний рівень студента. Завершує текст список літературних джерел та додаток з друком основного фрагменту програми.
Проект оцінюється по 100 бальній системі. В оцінку входять: Рівень розкриття теми та її складність; Коректність та ефективність виконаної програми; Універсальність рішення; Ретельність оформлення програмної документації і рівень незалежності програмного продукту від програміста, який його створив; Об’єм опрацьованої літератури та використаної довідкової документації; Загальний інтелектуальний рівень студента по даному напрямку. Якщо програма не працює, або не дороблена, то загальна оцінка не може привищувати 60 балів. Якщо тема не була попередньо узгоджена, або викладач вважає, що тема не стосується напрямку системного програмування, то курсовий проект не може бути зарахований. Об’єм проекту – не менше 15 сторінок і не більше 50 сторінок формату A4. В залежності від теми може бути виконана графічна частина на форматі A1.
Основні напрямки курсових проектів по системному програмуванню
Системне програмування – це програмування, яке не залежить від особливостей мови програмування. Як правило, системне програмування в операційній системі Windows в захищеному режимі пов’язано з використанням функцій API WIN32 (скорочено від “Application Programs Interface” – “інтерфейс прикладних програм”, тобто, засоби взаємодії програми з операційною системою Windows в режимі 32х бітної адресації). Ці функції завжди є доступними з моменту встановлення операційної системи на комп’ютер. Тому курсовий проект повинен використовувати саме ці функції. Теоретично, функції API можна викликати на будь-якій мові програмування, але бажано, щоб програма була написана на асемблері, тому що він дає максимальний рівень розуміння роботи операційної системи і комп’ютера. Нижче наведені напрямки, в яких можна вибирати теми. В одному напрямку можуть працювати декілька студентів, але їх теми не можуть повторюватись.
Використання функцій MultiMedia.
Говорючий годинник.
Синтезатор мелодій.
Пошук зображення у відео файлі.
З’єднання та роз’єднання відео-файлів.
Ввід звуку та розпізнавач простих команд.
Програма для керування компакт-диском.
Синтезатор відео файлів з окремих зображень.
Програвач відео та аудіо файлів.
Використання мережевих функцій.
Створення проксі-серверу.
Програма для викачування сайтів Інтернету.
Програма для спілкування в мережі.
Програма для зчитування листів.
Програма керування модемом.
Використання функцій GDI та OpenGL.
Синтезатор трьохвимірних об’єктів в бібліотеці OpenGL.
Синтезатор заставок для робочого столу.
Програма для вибору однакових зображень графічних файлів.
Програма для створення фонових малюнків для Інтернет-сторінок.
Програма створення текстових анімацій для Інтернет-сторінок.
Використання функцій отримання інформації.
Зчитування характеристик відео-карти.
Програма для збереження файлів, які останнім часом коректувалися.
Екстрактор ресурсів програм.
Програма-перелічувач відео - та аудіо-кодеків.
Інспектор драйверів.
Використання функцій паралельного програмування.
Захист програм від копіювання.
Система для відео-спостереження та відеозапису.
Ігрова програма з декількома об’єктами.
Обробка зображення паралельними потоками.
Програма для анімації музичних творів.
Використання функцій адміністрування.
Конфіденційний доступ до інформації.
Програма для виявлення змін в реєстрі Windows.
Захист програм від вірусів.
Інспектор мережі.
Електронний секретар.
Демонстрація можливостей стандартних класів вікон.
Демонстрація всіх повідомлень для керування вікнами класу SysTreeView32.
Демонстрація всіх повідомлень для керування вікнами класу RichEdit.
Демонстрація всіх повідомлень для керування вікнами класу SysTabControl32.
Приклади програм
В даних методичних розробках пропонуються приклади фрагментів програм, які можна модифікувати та використовувати в своїх курсових проектах. Уважно прогляньте коментарі до функцій API в програмах та задайте запитання лектору. В програмах не вистачає стандартних заголовків: “.386”, “.model flat, STDCALL”, а також назв функцій з ключовими словами “extrn ... : Proc”. В програмі необхідно також вказати використані константи, наприклад: “WS_POPUP EQU 80000000h”. Значення констант легко знайти в довідкових файлах, тому ми їх пропускаємо. Після переліку констант іде опис стану сегменту даних при старті програми, який починається з директиви “.data”. Для скорочення текстів цю директиву ми також пропускаємо. Структури та змінні, які повторюються в різних програмах, наведені лише в першій програмі. Далі продемонстровані наступні фрагменти:
Постановка іконки на кнопку
Програмне натиснення кнопки START та її приховування
Створення кнопки, яка втiкає вiд мишi
Створення вікна ComboBox та додавання в нього 2х рядків
Встановлення шрифту "Times New Roman" темно-синього кольору на жовтому фоні у вiкнi редагування
Знаходження всiх комп'ютерів даної локальної мережі
Отримання IP-адреси локального комп'ютеру
Отримання назви хосту по його IP-адресi
Отримання IP-адреси хосту по його Iнтернет-назвi
Програмно вiдрегiструвати комп'ютер через 1 годину
Надiслати повiдомлення 'HELLO!' на комп'ютер WS23K05R804
Отримати ім’я та прiзвище зареєстрованого користувача
Вивід у вiкно класу Static малюнок формату BMP
Створення iндикатору копiювання, який рухається при натисненнi <ESC>
Утворення рядку стану та вивід в нього кiлькості хвилин вiд початку завантаження ОС
Встановлення процедури для перехоплення натиснень пробiлiв з DLL-процедурою
Отримання мiтки та серiйного номеру диску
Збереження копiї екрану у файлi типу BMP
Перелік всiх вiкон верхнього рiвня з назвами програм якi їх утворили
Вивід всiх iконок файлу “Shell32.dll”
-------------------------------------------------------------------------------------------------------------------------------
Постановка іконки на кнопку.
msg: ; структура повiдомлення
msHWND dd 0 ; хендл вікна
msMESSAGE dd 0 ; повідомлення
msWPARAM dd 0 ; 1-й параметр
msLPARAM dd 0 ; 2-й параметр
msTIME dd 0 ; час отримання
ptX dd 0 ; координати миші
ptY dd 0
AppHWnd dd 0 ; Хендл завантаженої програми.
NewHWnd dd 0 ; Хендл кнопки.
CLASSNAME db 'Button',0 ; Стандартний клас.
HIcon dd 0 ; хендл iконки
ICON_ID db "Ic1",0 ; iдентифiкатор iконки
.code
Start: call GetModuleHandleA,0 ; отримати хендл модуля для того, щоб
mov AppHWnd,eax ; зв’язати його з вікном
call LoadIconA,AppHWnd,offset ICON_ID ; завантаження іконки з ресурсів
mov HIcon,eax ; та отримання її хендлу (віртуальної адреси).
or eax,eax ; Якщо помилка,
jz STOP ; то припинити програму.
push 0 ; Інакше задати параметри для створення вікна:
push AppHWnd ; хендл програми
push 0 ; меню,
push 0 ; батьківське вікно,
push 60 ; розмiр по вертикалi,
push 80 ; розмiр по горизонталi,
push 250 ; координата y,
push 300 ; координата x,
; прапорці стилів: видиме спливаюче вікно з рамкою, в якому завантажена іконка;
push WS_POPUP or WS_VISIBLE or WS_DLGFRAME or BS_ICON
push 0 ; назва вiкна,
push offset CLASSNAME ; ім’я класу
push WS_EX_TOPMOST ; розширений стиль: поверх всiх вiкон.
call CreateWindowExA ; Створити вікно з заданими параметрами
mov NewHWnd,eax ; та зберегти його хендл.
; надіслати вікну керуюче повідомлення про заміну іконки:
call SendMessageA,NewHWnd,BM_SETIMAGE,IMAGE_ICON,HIcon
MSG_LOOP: ; Класичний цикл прийому та обробки повідомлень.
; Прийняти системне повiдомлення для заданого вiкна:
call GetMessageA,offset msg,NewHWnd,0,0
cmp msMESSAGE,WM_KEYDOWN ; якщо це повiдомлення про натиснення клавiшу,
jnz CONTINUE_LOOP
cmp msWPARAM,VK_ESCAPE ; і якщо її код = <ESC>,
jz STOP ; то “STOP”,
CONTINUE_LOOP: ; Якщо нічого не відбулося, то продовжуємо:
call DispatchMessageA,offset msg ; обробити повiдомлення;
jmp MSG_LOOP ; перейти на початок циклу.
STOP: call ExitProcess,0 ; Закінчення процесу.
End Start
-------------------------------------------------------------------------------------------------------------------------------
Програмне натиснення кнопки START та її приховування.
CLASSNAME1 db 'Shell_TrayWnd',0 ; Клас вікна, на якому розташована панель задач.
CLASSNAME2 db 'Button',0 ; На цьому вікні треба буде знайти вікно кнопки.
HStartButton dd 0 ; Хендл вікна-кнопки.
.code
Start: call FindWindowA,offset CLASSNAME1,0 ; Знайти хендл панелі задач.
OR eax,eax ; Регістр “eax” містить результат пошуку.
jz STOP
call FindWindowExA,eax,0,offset CLASSNAME2,0 ; Визначити хендл дочірнього вікна.
mov HStartButton,eax
; Емітувати натиснення лівої кнопки миші у знайденому вікні:
call SendMessageA,HStartButton,WM_LBUTTONDOWN,0,0
call ShowWindow,HStartButton,SW_HIDE ; Заховати вікно
STOP: call ExitProcess,0
end Start
-------------------------------------------------------------------------------------------------------------------------------
Створення кнопки, яка втiкає вiд мишi
CLASSNAME db 'Button',0
NAME1 db 'Кнопка',0 ; Текст на кнопці
X1 dd 100 ; координати кнопки
Y1 dd 100
.code
Start: call GetModuleHandleA,0 ; отримати хендл модуля для того, щоб
mov AppHWnd,eax ; зв’язати його з вікном
push 0 ; Задати стандартні параметри вікна
push AppHWnd ; хендл програми,
push 0 ; хендл меню,
push 0 ; хендл батьківського вікна,
push 50 ; розмiр по вертикалi,
push 120 ; розмiр по горизонталi,
push Y1 ; координата y,
push X1 ; координата x,
push WS_POPUP or WS_VISIBLE or WS_DLGFRAME
push offset NAME1 ; назва вiкна,
push offset CLASSNAME ; клас кнопок,
push WS_EX_TOPMOST ; поверх інших вiкон.
call CreateWindowExA ; Створити кнопку.
mov NewHWnd,eax ; Зберегти її хендл.
MSG_LOOP: ; Стандартний цикл прийому повідомлень.
Call GetMessageA, offset msg, NewHWnd, 0,0
cmp msMESSAGE,WM_MOUSEMOVE
jnz NOT_MOVE ; Перехоплення події руху миші над кнопкою.
call GetTickCount ; Отримання випадкового числа міллісекунд
mov ebx,eax ; Зробити випадковий приріст координат
sal eax,24
sar eax,26
sal ebx,23
sar ebx,26
add X1,eax
and X1,511 ; Обмежити координати X1, Y1 значенням 511.
add Y1,ebx
and Y1,511
call SetWindowPos,NewHWnd,0,X1,Y1,120,50,0 ; Нова позиція вікна.
NOT_MOVE:
cmp msMESSAGE,WM_KEYDOWN ; якщо повiдомлення про натиснення клавiші,
jnz CONTINUE_LOOP
cmp msWPARAM,VK_ESCAPE ; якщо її код = <ESC>, то STOP
jz STOP
CONTINUE_LOOP:
call DispatchMessageA, offset msg ; обробити повiдомлення
jmp MSG_LOOP
STOP: call ExitProcess,0
End Start
-------------------------------------------------------------------------------------------------------------------------------
Створення вікна ComboBox та додавання в нього 2х рядків
CLASSNAME db 'ComboBox',0 ; Стандартний клас
STR1 db "рядок 1",0 ; Визначення вмісту рядків
STR2 db "рядок 2",0
.code
Start: call GetModuleHandleA,0 ; отримати хендл модуля для того, щоб
mov AppHWnd,eax ; зв’язати його з вікном
push 0 ; Задати параметри для створення вікна:
push AppHWnd ; хендл програми
push 0 ; меню,
push 0 ; батьківське вікно,
push 60 ; розмiр по вертикалi,
push 100 ; розмiр по горизонталi,
push 250 ; координата y,
push 300 ; координата x,
; прапорці стилів: видиме спливаюче вікно з рамкою, яке містить відсортовані рядки:
push WS_POPUP or WS_VISIBLE or WS_DLGFRAME \
or CBS_SORT or CBS_DROPDOWN or CBS_HASSTRINGS
push 0 ; назва вiкна
push offset CLASSNAME ; задати клас “ComboBox”
push WS_EX_TOPMOST ; поверх всiх вiкон.
call CreateWindowExA ; Створити ComboBox.
mov NewHWnd,eax ; Зберегти його хендл.
; Надіслати повідомлення для додавання рядків у вікно.
call SendMessageA,NewHWnd,CB_ADDSTRING,0,offset STR1
call SendMessageA,NewHWnd,CB_ADDSTRING,0,offset STR2
; Далі іде цикл прийому повідомлень відрізняється від стандартного тим, що повідомлення вилучаються як з черги вікна, так і з загальної черги Windows.
MSG_LOOP:
call PeekMessageA,offset msg,NewHWnd, 0h,0, PM_REMOVE
or eax,eax ; Якщо в черзі вікна є повідомлення, то вилучити його і перейти на MESS_OK.
jnz MESS_OK
call PeekMessageA,offset msg,0, 201h,202h, PM_REMOVE
or eax,eax ; Якщо в загальній черзі є повідомлення, то вилучити його і перейти на MESS_OK.
jz MSG_LOOP ; Інакше перейти на початок циклу.
MESS_OK:
cmp msMESSAGE,WM_KEYDOWN ; якщо це повiдомлення про натиснення клавiші,
jnz CONTINUE_LOOP
cmp msWPARAM,VK_ESCAPE ; якщо її код = <ESC>, то STOP
jz STOP
CONTINUE_LOOP:
Call TranslateMessage,offset msg ; Добавити в чергу повідомлення 2-го рівня.
Call DispatchMessageA,offset msg ; Обробити дане повiдомлення.
Jmp MSG_LOOP
STOP: call ExitProcess,0
End Start
-------------------------------------------------------------------------------------------------------------------------------
Встановлення шрифту "Times New Roman" темно-синього кольору на жовтому фоні у вiкнi редагування
EM_SETBKGNDCOLOR equ 1024 + 67 ; Повідомлення для зміни фонового кольору.
EM_SETCHARFORMAT equ 1024 + 68 ; Повідомлення для зміни шрифту.
CLASSNAME db 'RichEdit20A',0 ; Стандартний клас RichEdit версії 2.0 для кодів ANSI.
RichEditDLL db "RichED20.dll",0 ; Бібліотека, яка забезпечує функціонування класу RichEdit.
hLibEdit dd 0 ; Хендл бібліотеки
CHARFORMAT2: ; Структура, яка описує зміну шрифту
CbSize DD 84 ; ЗАГАЛЬНА ДОВЖИНА СТРУКТУРИ
DwMask DD CFM_FACE or CFM_SIZE or CFM_COLOR or CFM_ITALIC ; прапорці зміни
DwEffects DD CFE_ITALIC ; Курсив
YHeight DD 300 ; Висота букв
YOffset DD 0 ; Зміщення уверх або вниз
CrTextColor DD 0A50000h ; Колір букв
BCharSet DB 0 ; Тип кодування
BpitchAndFamily DB 0 ; Тип фонту
SzFaceName DB 'Times New Roman',32-15 dup(0) ; Гарнітура (ДОВЖИНА ПОЛЯ=32)
wWeight DW 0 ; Жирність
sSpacing DW 0 ; Відстань між буквами
crBackColor DD 0 ; Фон
lcid DD 0 ; Ідентифікатор мови
dwReserved DD 0 ; Зарезервовано
sStyle DW 0 ; Стиль в системі “Text Object Model“
wKerning DW 0 ; Розмір шрифту в системі “Text Object Model“
bUnderlineType DB 0 ; Тип підкреслення
bAnimation DB 0 ; Анімація тексту в системі “Text Object Model“
bRevAuthor DB 0 ; Автор тексту для системи “Text Object Model“
bReserved1 DB 0 ; Зарезервовано
.code
Start: call GetModuleHandleA,0 ; отримати хендл модуля для того, щоб
mov AppHWnd,eax ; зв’язати його з вікном
call LoadLibraryA,offset RichEditDLL ; Завантажити бібліотеку
mov hLibEdit,eax ; та зберегти її хендл.
push 0 ; задати параметри для створення вікна:
push AppHWnd ; хендл програми
push 0 ; меню,
push 0 ; батьківське вікно,
push 140 ; розмiр по вертикалi,
push 260 ; розмiр по горизонталi,
push 250 ; координата y,
push 300 ; координата x,
; прапорці стилів: видиме спливаюче вікно з рамкою, в якому багато рядків з можливістю зсуву;
push WS_POPUP or WS_VISIBLE or WS_BORDER \
or WS_VSCROLL or WS_HSCROLL or ES_MULTILINE
push offset WindowCaption ; назва вiкна,
push offset CLASSNAME ; ім’я класу
push WS_EX_TOPMOST ; розширений стиль: поверх всiх вiкон.
call CreateWindowExA ; Створити вікно для редагування.
mov NewHWnd,eax ; зберегти хендл.
; Встановити шрифт та колір фону
call SendMessageA,NewHWnd,EM_SETCHARFORMAT,4,offset CHARFORMAT2
call SendMessageA,NewHWnd,EM_SETBKGNDCOLOR,0,065ffffh
MSG_LOOP: ; Класичний цикл прийому повідомлень для вікна редагування.
call GetMessageA, offset msg, NewHWnd,0,0
cmp msMESSAGE,WM_KEYDOWN
jnz CONTINUE_LOOP
cmp msWPARAM,VK_ESCAPE ; якщо її код = <ESC>, то STOP
jz STOP
CONTINUE_LOOP:
call TranslateMessage, offset msg ; Добавити в чергу повідомлення 2-го рівня.
call DispatchMessageA, offset msg ; Обробити дане повiдомлення.
jmp MSG_LOOP
STOP: call ExitProcess,0
End Start
-------------------------------------------------------------------------------------------------------------------------------
Знаходження всiх комп'ютерів даної локальної мережі
TITLE1 db 'Ресурси мережі:',0 ; Заголовок вікна з текстом.
NETRESOURCE: ; Структура, екземплярами якої заповнюється буфер.
DwScope DD 0 ; загальний тип об'єкту
DwType DD 0 ; файл-сервер або сервер для друку
DwDisplayType DD 0 ; контекст або об'єкт
DwUsage DD 0 ; стан об’єкту
DD 0 ; буде вказувати на локальне iм'я
DD 0 ; буде вказувати на мережне iм'я
DD 0 ; буде вказувати на коментарi
DD 0 ; буде вказувати на iм'я постачальника послуг
hENUM dd 0 ; хендл нумерацiї
NUMBER_COUNT dd 0ffffffffh
BUF_SIZE dd 10000 ; розмiр вiртуального блоку пам'ятi
FORMAT db 'LocalName%ld : %s',0dh,'RemoteName: %s',0dh,'Provider: %s',0dh,'Comments: %s'
db 0dh,'dwScope = %X',0dh,'dwType = %X',0dh,'dwDisplayType = %X',0dh,'dwUsage = %X',0
TEXT1 db 260 dup(0)
.data?
BUF1 db 10000 dup(?)
.code
Start: call WNetOpenEnumA,RESOURCE_CONTEXT,RESOURCETYPE_ANY, 0,offset NETRESOURCE,\
offset hENUM ; отримуємо хендл нумерацiї
cmp eax,NO_ERROR
jnz STOP
; отримуємо кiлькiсть об’єктів нумерацiї в NUMBER_COUNT та записуємо об’єкти в буфер
mov NUMBER_COUNT,5000 ; Вказуємо максимальну кількість об’єктів
call WNetEnumResourceA,hENUM,offset NUMBER_COUNT,offset BUF1,offset BUF_SIZE
; розшифровуємо буфер для кожного об’єкту мережі
mov ecx,NUMBER_COUNT
mov esi,0
mov ebx,offset BUF1
L1: push ecx
push esi
mov eax,NUMBER_COUNT
sub eax,ecx
inc eax
; перетворюємо данi в символьний рядок вiдповiдно заданого формату:
call _wsprintfA,offset TEXT1, offset FORMAT, eax,\
dword ptr [ebx+esi+4*4], dword ptr [ebx+esi+4*5],\
dword ptr [ebx+esi+4*7], dword ptr [ebx+esi+4*6],\
dword ptr [ebx+esi+4*0], dword ptr [ebx+esi+4*1],\
dword ptr [ebx+esi+4*2], dword ptr [ebx+esi+4*3]
add esp,4*11
call MessageBoxA,0,offset TEXT1, offset TITLE1,0
pop esi
add esi,32 ; Кожна структура довжиною 32 байти
pop ecx
loop L1
call WNetCloseEnum,hENUM ; лiквiдовуємо хендл нумерацiї
STOP: call ExitProcess,0
end Start
-------------------------------------------------------------------------------------------------------------------------------
Отримання IP-адреси локального комп'ютеру
; HOSTENT: Структура, яка описує хост.
; h_name DWORD вказівник на локальне iм’я
; h_alias DWORD вказівник на список альтернативних імен
; h_addr WORD тип адрес (стандартно = AF_INET)
; h_len WORD довжина адреси (стандартно = 4)
; h_list DWORD вказівник на список IP-адрес даного хосту
WSADATA: ; структура, яка описує дану версію бібліотеки WinSock.dll
WVersion DW 0
WHighVersion DW 0
SzDescription DB WSADESCRIPTION_LEN + 1 dup (0)
SzSystemStatus DB WSASYS_STATUS_LEN + 1 dup (0)
IMaxSockets DW 0
IMaxUdpDg DW 0
LpVendorInfo DD 0
IP_ADDRESS db 0
.code
Start: push offset WSADATA ; Вказiвник на структуру WSADATA, яку заповнює WINSOCK.DLL
push 0101h ; буде використаний стандарт 1.1
call WSAStartup ; Активізувати WINSOCK.DLL.
test eax,eax
jne STOP
call gethostbyname,offset IP_ADDRESS ; замiсть IP-адреси передати пустий рядок
test eax,eax ; eax – адреса структури “HOSTENT”.
jz STOP
mov ebx,[eax] ; отримати з таблицi HOSTENT назву локального комп'ютера
push ebx
mov eax,[eax+0ch] ; отримати початок списку списків
mov eax,[eax] ; отримати початок списку
mov eax,[eax] ; отримати IP-адресу
call inet_ntoa,eax ; перетворити IP-адресу в форму “xx.xx.xx.xx”
pop ebx
or eax,eax
jz STOP
call MessageBoxA,0,eax,ebx,0 ; вивести отриману адресу
STOP: call WSACleanup ; закiнчити використання бiблiотеки мережевих функцiй
call ExitProcess,0
end Start
-------------------------------------------------------------------------------------------------------------------------------
Отримання назви хосту по його IP-адресi
AF_INET equ 2 ; Сімейство протоколів з довжиною адреси 4 байти.
STR1 db '192.168.0.6',0 ; IP-адреса.
ADR dd 0
.code
Start: call WSAStartup,0101h,offset WSADATA ; отримати налаштування параметрiв WINSOCK.DLL
call inet_addr,offset STR1 ; перетворити рядок “xx.xx.xx.xx” в 4-х байтове число
mov ADR,eax ; та зберегти в змінній ADR
call gethostbyaddr, offset ADR,4,AF_INET ; отримати вказівник на структуру HOSTENT.
cmp eax,0
jz STOP
mov ebx,[eax] ; отримати з HOSTENT назву хосту.
call MessageBoxA,0,ebx,offset STR1,0 ; Вивід у вікно.
STOP: call ExitProcess,0
end Start
-------------------------------------------------------------------------------------------------------------------------------
Отримання IP-адреси хосту по його Iнтернет-назвi
HOST_NAME db 'postoffice.lp.lviv.ua',0 ; Назва хосту.
.code
Start: call WSAStartup,0101h,offset WSADATA ; отримати налаштування параметрiв WINSOCK.DLL
call gethostbyname,offset HOST_NAME
or eax,eax
jz STOP ; такої адреси немає!
mov eax,[eax+0ch] ; отримати початок списку списків
mov eax,[eax] ; отримати початок списку
mov eax,[eax] ; отримати IP-адресу
call inet_ntoa,eax ; перетворити IP-адресу в форму “xx.xx.xx.xx”
call MessageBoxA,0,eax,offset HOST_NAME,0 ; вивести отриману адресу
STOP: call ExitProcess,0
end Start
-------------------------------------------------------------------------------------------------------------------------------
Програмно вiдрегiструвати комп'ютер через 1 годину
TITLE1 db "Закiнчення роботи",0
TEXT1 db "Хочете через годину закiнчити?",0
.code
Start: call SetTimer,0,0,60000*60,offset TimerPROC ; Утворити таймер.
cmp eax,0
jz STOP
call MessageBoxA,0,offset TEXT1,offset TITLE1,30h
Loop1: call GetMessageA, offset msg,0,0,0 ; Цикл прийому повідомлень від таймера.
cmp msMESSAGE,113h ; Якщо код повідомлення WM_TIMER, то вийти з циклу.
jnz Loop1
call ExitWindowsEx,EWX_LOGOFF,0 ; Відрегіструвати користувача.
STOP: call ExitProcess,0
TimerPROC proc hwnd:dword, mes_time:dword, ID:dword, Time:Dword
mov eax,1 ; Процедура таймера.
ret
endp
end Start
-------------------------------------------------------------------------------------------------------------------------------
Надiслати повiдомлення 'HELLO!' на комп'ютер WS23K05R804:
COMPNAME dw 'W','S','2','3','K','0','5','R','8','0','4',0,0,0,0 ; Ім’я комп’ютера в юнікоді.
MSGNAME dw 'H','E','L','L','O','!','!','!',0,0,0,0 ; Текст повідомлення в юнікоді.
LEN1 dd 8*2 ; Довжина тексту.
.code
Start: call NetMessageBufferSend,0,offset COMPNAME,offset COMPNAME, offset MSGNAME,LEN1
or eax,eax
jz STOP
call MessageBoxW,0,offset COMPNAME,offset MSGNAME,0 ; Вивести отриману адресу
STOP: call ExitProcess,0
end Start
-------------------------------------------------------------------------------------------------------------------------------
Отримати ім’я та прiзвище зареєстрованого користувача
BUF_ADR2 dd 0
LEN_NAME dd 260
.data?
USER db 260 dup(?)
.code
Start: call GetUserNameW,offset USER,offset LEN_NAME ; Login в юнікодах.
call NetUserGetInfo, 0, offset USER, 2, offset BUF_ADR2 ; Отримання інформації користувача.
cmp eax,NERR_Success
jnz STOP
mov eax,BUF_ADR2
mov eax,ds:[eax+4*9] ; Елемент містить адресу прізвища та ініціалів.
call MessageBoxW,0,eax,offset USER, 0 ; вивести на екран юнікоди.
STOP: call ExitProcess,0
end Start
-------------------------------------------------------------------------------------------------------------------------------
Вивід у вiкно класу Static малюнок формату BMP
classname db 'Static',0 ; Стандартний клас вікон.