format pe64 gui 5.0
entry start

include "include\win64a.inc"


section '.data' data readable writeable

nulq dq ?

class db "window x64",0

wc WNDCLASSEX sizeof.WNDCLASSEX,0,WindowProc,0,0,0,0,0,0,0,class,0
msg MSG


section '.text' code readable executable

start:
	sub rsp,8		; Make stack qword aligned

	sub rsp,8
	xor rcx,rcx
	call [GetModuleHandleA]
	add rsp,8

	mov [wc.hInstance],rax

	sub rsp,10h
	mov rdx,IDI_APPLICATION
	xor rcx,rcx
	call [LoadIconA]
	add rsp,10h

	mov [wc.hIcon],rax
	mov [wc.hIconSm],rax

	sub rsp,10h
	mov rdx,IDC_ARROW
	xor rcx,rcx
	call [LoadCursorA]
	add rsp,10h

	mov [wc.hCursor],rax

	sub rsp,8
	mov rcx,wc
	call [RegisterClassExA]
	add rsp,8

	push 0
	push [wc.hInstance]
	push 0
	push 0
	push -CW_USEDEFAULT
	push -CW_USEDEFAULT
	push -CW_USEDEFAULT
	push -CW_USEDEFAULT
	sub rsp,20h
	mov r9,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU
	mov r8,nulq
	mov rdx,class
	xor rcx,rcx
	call [CreateWindowExA]
	add rsp,20

msg_loop:
	sub rsp,20h
	xor r9,r9
	xor r8,r8
	xor rdx,rdx
	mov rcx,msg
	call [GetMessageA]
	add rsp,20h

	cmp eax,1
	jb end_loop
	jnz msg_loop

	sub rsp,8
	mov rcx,msg
	call [TranslateMessage]
	add rsp,8

	sub rsp,8
	mov rcx,msg
	call [DispatchMessageA]
	add rsp,8

	jmp msg_loop

end_loop:
	sub rsp,8
	xor rcx,rcx
	call [ExitProcess]

	nop

proc WindowProc uses rbx rsi rdi, hwnd,wmsg,wparam,lparam

	mov [rbp+28h],r9 ;lparam
	mov [rbp+20h],r8 ;wparam
	mov [rbp+18h],rdx ;wmsg
	mov [rbp+10h],rcx ;hwnd

	cmp rdx,WM_DESTROY
	jz wmdestroy
	cmp rdx,WM_CREATE
	jz wmcreate

	jmp defwndproc

wmcreate:
	jmp finish

defwndproc:
	sub rsp,20h
	mov r9,[rbp+28h] ;lparam
	mov r8,[rbp+20h] ;wparam
	mov rdx,[rbp+18h] ;wmsg
	mov rcx,[ebp+10h] ;hwnd
	call [DefWindowProcA]
	add rsp,20h

	jmp finish

wmdestroy:
	sub rsp,8
	xor rcx,rcx
	call [PostQuitMessage]
	add rsp,8	

finish:
	ret

endp


section '.idata' import data readable writeable

dd 0,0,0,rva kernel32n,rva kernel32t
dd 0,0,0,rva user32n,rva user32t
dd 0,0,0,0,0

kernel32t:
GetModuleHandleA dq rva _GetModuleHandleA
ExitProcess dq rva _ExitProcess
	dq 0
user32t:
LoadIconA dq rva _LoadIconA
LoadCursorA dq rva _LoadCursorA
RegisterClassExA dq rva _RegisterClassExA
CreateWindowExA dq rva _CreateWindowExA
GetMessageA dq rva _GetMessageA
TranslateMessage dq rva _TranslateMessage
DispatchMessageA dq rva _DispatchMessageA
DefWindowProcA dq rva _DefWindowProcA
PostQuitMessage dq rva _PostQuitMessage
	dq 0

kernel32n db "kernel32.dll",0
user32n db "user32.dll",0

_GetModuleHandleA dw 0
	db "GetModuleHandleA",0

_ExitProcess dw 0
	db "ExitProcess",0
_LoadIconA dw 0 
	db "LoadIconA",0
_LoadCursorA dw 0
	db "LoadCursorA",0
_RegisterClassExA dw 0
	db "RegisterClassExA",0
_CreateWindowExA dw 0
	db "CreateWindowExA",0
_GetMessageA dw 0
	db "GetMessageA",0
_TranslateMessage dw 0
	db "TranslateMessage",0
_DispatchMessageA dw 0
	db "DispatchMessageA",0
_DefWindowProcA dw 0
	db "DefWindowProcA",0
_PostQuitMessage dw 0
	db "PostQuitMessage",0