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