rendered paste bodyCS_DBLCLKS equ 8h
COLOR_BACKGROUND equ 1
IDI_APPLICATION equ 32512
IDC_ARROW equ 32512
HWND_DESKTOP equ 0
CW_USEDEFAULT equ 80000000h
WS_OVERLAPPEDWINDOW equ 0h|0C00000h|80000h|40000h|20000h|10000h
SW_SHOWNORMAL equ 1
WM_DESTROY equ 2h
%macro imprt 2-*
%define %%dll %1
%rep %0-1
%rotate 1
extern %1_
import %1_ %%dll %1
%1: jmp [%1_]
%endrep
%endmacro
section text USE32
imprt kernel32.dll, GetModuleHandleA, ExitProcess
imprt user32.dll, LoadIconA, LoadCursorA, RegisterClassExA, CreateWindowExA, ShowWindow, UpdateWindow
imprt user32.dll, GetMessageA, TranslateMessage, DispatchMessageA, DefWindowProcA, PostQuitMessage
global ..start
..start:
push byte 0
call GetModuleHandleA
mov [hThisInstance], eax
mov [wndclassex.hInstance], eax
mov dword [wndclassex.lpszClassName], classname
mov dword [wndclassex.lpfnWndProc], callback
mov dword [wndclassex.style], CS_DBLCLKS
mov dword [wndclassex.cbsize], 48
mov dword [wndclassex.cbClsExtra], 0
mov dword [wndclassex.cbWndExtra], 0
mov dword [wndclassex.lpszMenuName], 0
mov dword [wndclassex.hbrBackground], COLOR_BACKGROUND
;HICON LoadIcon(
; HINSTANCE hInstance,
; LPCTSTR lpIconName
;);
push IDI_APPLICATION
push byte 0
call LoadIconA
mov [wndclassex.hIcon], eax
mov [wndclassex.hIconSm], eax
;HCURSOR LoadCursor(
; HINSTANCE hInstance,
; LPCTSTR lpCursorName
;);
push IDC_ARROW
push byte 0
call LoadCursorA
mov [wndclassex.hCursor], eax
;ATOM RegisterClassEx(
; CONST WNDCLASSEX *lpwcx
;);
push wndclassex
call RegisterClassExA
;HWND CreateWindowEx(
; DWORD dwExStyle,
; LPCTSTR lpClassName,
; LPCTSTR lpWindowName,
; DWORD dwStyle,
; int x,
; int y,
; int nWidth,
; int nHeight,
; HWND hWndParent,
; HMENU hMenu,
; HINSTANCE hInstance,
; LPVOID lpParam
;);
push byte 0
push hThisInstance
push byte 0
push dword HWND_DESKTOP
push 375
push 544
push CW_USEDEFAULT
push CW_USEDEFAULT
push WS_OVERLAPPEDWINDOW
push titletext
push classname
push byte 0
call CreateWindowExA
mov [hwnd], eax
;BOOL ShowWindow(
; HWND hWnd,
; int nCmdShow
;);
push SW_SHOWNORMAL
push eax ;window handler from CreateWindowExA
call ShowWindow
;BOOL UpdateWindow(
; HWND hWnd // handle to window
;);
push dword [hwnd]
call UpdateWindow
.messageloop
;BOOL GetMessage(
; LPMSG lpMsg,
; HWND hWnd,
; UINT wMsgFilterMin,
; UINT wMsgFilterMax
;);
push byte -1
push byte 0
push byte 0
push msg
call GetMessageA
or eax, eax
jz .exit
push msg
call TranslateMessage
push msg
call DispatchMessageA
jmp .messageloop
.exit
push byte 0
call ExitProcess
callback:
push ebp
mov ebp, esp
cmp dword [ebp + 12], WM_DESTROY ;skip ebp, eip, hWnd
je .destroy
push dword [ebp+20]
push dword [ebp+16]
push dword [ebp+12]
push dword [ebp+8]
call DefWindowProcA
jmp .return
.destroy
push byte 0
call PostQuitMessage
.return
pop ebp
ret 16
section data USE32
classname db 'hello',0
titletext db 'hej',0
section bss USE32
hThisInstance resd 1
hwnd resd 1
wndclassex
.cbsize resd 1
.style resd 1
.lpfnWndProc resd 1
.cbClsExtra resd 1
.cbWndExtra resd 1
.hInstance resd 1
.hIcon resd 1
.hCursor resd 1
.hbrBackground resd 1
.lpszMenuName resd 1
.lpszClassName resd 1
.hIconSm resd 1
msg
.hwnd resd 1
.message resd 1
.wparam resd 1
.lparam resd 1
.time resd 1
.pt resd 2