LoadIcon equ
MessageBox equ
RegisterClass equ
TextOut equ
.data
newhwnd dd 0
lppaint PAINTSTRUCT >
msg MSGSTRUCT >
wc WNDCLASS >
mbx_count dd 0
hInst dd 0
szTitleName db ”Bizatch by Quantum / VLAD activated”
zero db 0
szAlternate db ”more than once”,0
szClassName db ”ASMCLASS32”,0
;Сообщение, выводимое в окне
szPaint db ”Left Button pressed:”
s_num db ”00000000h times.”,0
;Размер сообщения
MSG_L EQU ($−offset szPaint)−1
.code
;Сюда обычно передается управление от загрузчика.
start:
;Получим HMODULE
push L 0
call GetModuleHandle
mov [hInst],eax
push L 0
push offset szClassName
call FindWindow
or eax,eax
jz reg_class
;Пространство для модификации строки заголовка
mov [zero],” ”
reg_class:
;Инициализируем структуру WndClass
mov [wc.clsStyle],CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
mov [wc.clsLpfnWndProc],offset WndProc
mov [wc.clsCbClsExtra],0
mov [wc.clsCbWndExtra],0
mov eax,[hInst]
mov [wc.clsHInstance], eax
;Загружаем значок
push L IDI_APPLICATION
push L 0
call LoadIcon
mov [wc.clsHIcon], eax
;Загружаем курсор
push L IDC_ARROW
push L 0
call LoadCursor
mov [wc.clsHCursor], eax
;Инициализируем оставшиеся поля структуры WndClass
mov [wc.clsHbrBackground],COLOR_WINDOW+1
mov dword ptr [wc.clsLpszMenuName],0
mov dword ptr [wc.clsLpszClassName],offset szClassName
;Регистрируем класс окна
push offset wc
call RegisterClass
;Создаем окно
push L 0 ;lpParam
push [hInst] ;hInstance
push L 0 ;Меню
push L 0 ;hwnd родительского
окна
push L CW_USEDEFAULT ;Высота
push L CW_USEDEFAULT ;Длина
push L CW_USEDEFAULT ;Y
push L CW_USEDEFAULT ;X
push L WS_OVERLAPPEDWINDOW ;Style
push offset szTitleName ;Title Style
push offset szClassName ;Class name
push L 0 ;extra style
call CreateWindowEx
;Сохраняем HWND
mov [newhwnd], eax
;Отображаем окно на экране
push L SW_SHOWNORMAL
push [newhwnd]
call ShowWindow
;Обновляем содержимое окна
push [newhwnd]
call UpdateWindow
;Очередь сообщений
msg_loop:
;Прочитаем следующее сообщение из очереди
push L 0
push L 0
push L 0
push offset msg
call GetMessage
;Если функция GetMessage вернула нулевое значение, то завершаем
;обработку сообщений и выходим из процесса
cmp ax,0
je end_loop
;Преобразуем виртуальные коды клавиш в сообщения клавиатуры
push offset msg
call TranslateMessage
;Передаем это сообщение назад в Windows
push offset msg
call DispatchMessage
;Переходим к следующему сообщению
jmp msg_loop
;Выход из процесса
end_loop:
push [msg.msWPARAM]
call ExitProcess
;Обработка сообщений окна. Win32 требует сохранения регистров
;EBX, EDI, ESI. Запишем эти регистры после ”uses” в строке ”proc”.
;Это позволит Ассемблеру сохранить их