1 2;--- a simple Windows GUI program which creates an 3;--- "empty" window, then enters a "message loop". 4;--- Does not contain directives for Win64 SEH. 5;--- 6;--- to create the binary enter: 7;--- JWasm -win64 Win64_2.asm 8;--- to link, use either: 9;--- MS Link: link Win64_2.obj kernel32.lib user32.lib 10;--- JWlink: jwlink format win pe ru win file Win64_2.obj lib kernel32.lib, user32.lib 11 12 option casemap:none 13 14HINSTANCE typedef QWORD 15HWND typedef QWORD 16HMENU typedef QWORD 17HICON typedef QWORD 18HBRUSH typedef QWORD 19HCURSOR typedef QWORD 20WPARAM typedef QWORD 21LPARAM typedef QWORD 22LPSTR typedef QWORD 23LPVOID typedef QWORD 24UINT typedef DWORD 25 26NULL equ 0 27WS_OVERLAPPEDWINDOW equ 0CF0000h 28CW_USEDEFAULT equ 80000000h 29SW_SHOWDEFAULT equ 10 30SW_SHOWNORMAL equ 1 31IDC_ARROW equ 32512 32IDI_APPLICATION equ 32512 33WM_DESTROY equ 2 34CS_VREDRAW equ 1 35CS_HREDRAW equ 2 36COLOR_WINDOW equ 5 37 38proto_WNDPROC typedef proto :HWND,:UINT,:WPARAM,:LPARAM 39WNDPROC typedef ptr proto_WNDPROC 40 41WNDCLASSEXA struct 8 42cbSize DWORD ? 43style DWORD ? 44lpfnWndProc WNDPROC ? 45cbClsExtra DWORD ? 46cbWndExtra DWORD ? 47hInstance HINSTANCE ? 48hIcon HICON ? 49hCursor HCURSOR ? 50hbrBackground HBRUSH ? 51lpszMenuName LPSTR ? 52lpszClassName LPSTR ? 53hIconSm HICON ? 54WNDCLASSEXA ends 55 56POINT struct 57x SDWORD ? 58y SDWORD ? 59POINT ends 60 61MSG struct 8 62hwnd HWND ? 63message DWORD ? 64wParam WPARAM ? 65lParam LPARAM ? 66time DWORD ? 67pt POINT <> 68MSG ends 69 70GetModuleHandleA proto :LPSTR 71GetCommandLineA proto 72ExitProcess proto :UINT 73LoadIconA proto :HINSTANCE, :LPSTR 74LoadCursorA proto :HINSTANCE, :LPSTR 75RegisterClassExA proto :ptr WNDCLASSEXA 76CreateWindowExA proto :DWORD, :LPSTR, :LPSTR, :DWORD, :SDWORD, :SDWORD, :SDWORD, :SDWORD, :HWND, :HMENU, :HINSTANCE, :LPVOID 77ShowWindow proto :HWND, :SDWORD 78UpdateWindow proto :HWND 79GetMessageA proto :ptr MSG, :HWND, :SDWORD, :SDWORD 80TranslateMessage proto :ptr MSG 81DispatchMessageA proto :ptr MSG 82PostQuitMessage proto :SDWORD 83DefWindowProcA proto :HWND, :UINT, :WPARAM, :LPARAM 84 85WinMain proto :HINSTANCE, :HINSTANCE, :LPSTR, :UINT 86 87 .data 88 89ClassName db "SimpleWinClass",0 90AppName db "Our First Window",0 91 92 .data? 93 94hInstance HINSTANCE ? 95CommandLine LPSTR ? 96 97 .code 98 99start: 100 and rsp, -16 101 invoke GetModuleHandleA, NULL 102 mov hInstance, rax 103 invoke GetCommandLineA 104 mov CommandLine, rax 105 invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT 106 invoke ExitProcess, eax 107 108WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:UINT 109 110 LOCAL wc:WNDCLASSEXA 111 LOCAL msg:MSG 112 LOCAL hwnd:HWND 113 114 and rsp, -16 ;to make the stack 16byte aligned 115 116 mov hInst, rcx ;hInst is the name of the shadow space variable! 117 118 mov wc.cbSize, SIZEOF WNDCLASSEXA 119 mov wc.style, CS_HREDRAW or CS_VREDRAW 120; mov rax, OFFSET WndProc ;using LEA is preferable 121 lea rax, [WndProc] 122 mov wc.lpfnWndProc, rax 123 mov wc.cbClsExtra, NULL 124 mov wc.cbWndExtra, NULL 125 mov wc.hInstance, rcx 126 mov wc.hbrBackground, COLOR_WINDOW+1 127 mov wc.lpszMenuName, NULL 128; mov rax, OFFSET ClassName ;using LEA is preferable 129 lea rax, [ClassName] 130 mov wc.lpszClassName, rax 131 invoke LoadIconA, NULL, IDI_APPLICATION 132 mov wc.hIcon, rax 133 mov wc.hIconSm, rax 134 invoke LoadCursorA, NULL, IDC_ARROW 135 mov wc.hCursor,rax 136 invoke RegisterClassExA, addr wc 137 invoke CreateWindowExA, NULL, ADDR ClassName, ADDR AppName,\ 138 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,\ 139 CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL,\ 140 hInst, NULL 141 mov hwnd,rax 142 invoke ShowWindow, hwnd, SW_SHOWNORMAL 143 invoke UpdateWindow, hwnd 144 .while (1) 145 invoke GetMessageA, ADDR msg, NULL, 0, 0 146 .break .if (!rax) 147 invoke TranslateMessage, ADDR msg 148 invoke DispatchMessageA, ADDR msg 149 .endw 150 mov rax, msg.wParam 151 ret 152WinMain endp 153 154WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 155 156 and rsp,-16 157 .if ( edx == WM_DESTROY ) 158 invoke PostQuitMessage, NULL 159 .else 160 invoke DefWindowProcA, rcx, edx, r8, r9 161 ret 162 .endif 163 xor rax,rax 164 ret 165WndProc endp 166 167end start 168