CS_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