Создаем вирус и антивирус (Гульев) - страница 28

WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:

DWORD, lparam:DWORD

LOCAL theDC:DWORD

;Проверим, какое сообщение получили, и перейдем к обработке

cmp [wmsg],WM_DESTROY

je wmdestroy

cmp [wmsg],WM_RBUTTONDOWN

je wmrbuttondown

cmp [wmsg],WM_SIZE

je wmsize

cmp [wmsg],WM_CREATE

je wmcreate

cmp [wmsg],WM_LBUTTONDOWN

je wmlbuttondown

cmp [wmsg],WM_PAINT

je wmpaint

cmp [wmsg],WM_GETMINMAXINFO

je wmgetminmaxinfo

;Данная программа не обрабатывает это сообщение.

;Передадим его Windows,

;чтобы оно было обработано по умолчанию

jmp defwndproc

;Сообщение WM_PAINT (перерисовать содержимое окна)

wmpaint:

;Подготовим окно для перерисовки

push offset lppaint

push [hwnd]

call BeginPaint

mov [theDC], eax

;Переведем в ASCII−формат значение mbx_count, которое

;показывает, сколько раз была нажата левая кнопка мыши

mov eax,[mbx_count]

mov edi, offset s_num

call HexWrite32

;Вывод строки в окно

push L MSG_L ;Длина строки

push offset szPaint ;Строка

push L 5 ;Y

push L 5 ;X

push [theDC] ;DC

call TextOut

;Обозначим завершение перерисовки окна

push offset lppaint

push [hwnd]

call EndPaint

;Выходим из обработки сообщения

mov eax, 0

jmp finish

;Сообщение WM_CREATE (создание окна)

wmcreate:

;Выходим из обработки сообщения

mov eax, 0

jmp finish

;Сообщение, не обрабатываемое данной программой, передаем Windows

defwndproc:

push [lparam]

push [wparam]

push [wmsg]

push [hwnd]

call DefWindowProc

;Выходим из обработки сообщения

jmp finish

;Сообщение WM_DESTROY (уничтожение окна)

wmdestroy:

;Закроем поток

push L 0

call PostQuitMessage

;Выходим из обработки сообщения

mov eax, 0

jmp finish

;Сообщение WM_LBUTTONDOWN (нажата левая кнопка мыши)

wmlbuttondown:

inc [mbx_count]

;Обновим содержимое окна

push L 0

push L 0

push [hwnd]

call InvalidateRect

;Выходим из обработки сообщения

mov eax, 0

jmp finish

;Сообщение WM_RBUTTONDOWN (нажата правая кнопка мыши)

wmrbuttondown:

push L 0

call MessageBeep

;Выходим из обработки сообщения

jmp finish

;Сообщение WM_SIZE (изменен размер окна)

wmsize:

;Выходим из обработки сообщения

mov eax, 0

jmp finish

;Сообщение WM_GETMINMAXINFO (попытка изменить размер

;или положение окна)

wmgetminmaxinfo:

;Заполним структуру MINMAXINFO

mov ebx, [lparam]

mov [(MINMAXINFO ptr ebx).mintrackposition_x],350

mov [(MINMAXINFO ptr ebx).mintrackposition_y],60

;Выходим из обработки сообщения

mov eax, 0

jmp finish

;Выходим из обработки сообщения

finish:

ret

WndProc endp

;Процедура перевода байта в ASCII−формат для печати. Значение,

;находящееся в регистре AL, будет записано в ASCII−формате

;по адресу ES:EDI

HexWrite8 proc

;Разделяем байт на полубайты и загружаем их в регистры AH и AL

mov ah,al