WIN32API
Posted on April 18, 2010, 4:21 pm UTC by Iago (over 2 years ago)Code (highlighted for ASM)
- ; NASM: nasmw -f obj nasmpad.asm
- ; ALINK: alink -c -oPE -subsys gui nasmpad
- extern CreateWindowExA
- import CreateWindowExA user32.dll
- extern RegisterClassExA
- import RegisterClassExA user32.dll
- extern GetModuleHandleA
- import GetModuleHandleA kernel32.dll
- extern LoadIconA
- import LoadIconA user32.dll
- extern LoadCursorA
- import LoadCursorA user32.dll
- extern ShowWindow
- import ShowWindow user32.dll
- extern UpdateWindow
- import UpdateWindow user32.dll
- extern GetMessageA
- import GetMessageA user32.dll
- extern TranslateMessage
- import TranslateMessage user32.dll
- extern DispatchMessageA
- import DispatchMessageA user32.dll
- extern ExitProcess
- import ExitProcess kernel32.dll
- extern DefWindowProcA
- import DefWindowProcA user32.dll
- struc 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
- endstruc
- struc POINT
- .x resd 1
- .y resd 1
- endstruc
- struc MSG
- .hwnd resd 1
- .message resd 1
- .wParam resd 1
- .lParam resd 1
- .time resd 1
- .pt resb POINT_size
- endstruc
- segment .data use32
- CS_VREDRAW equ 1h
- CS_HREDRAW equ 2h
- WinClass:
- istruc WNDCLASSEX
- at WNDCLASSEX.cbSize, dd WNDCLASSEX_size
- at WNDCLASSEX.style, dd CS_VREDRAW + CS_HREDRAW
- at WNDCLASSEX.lpfnWndProc, dd Windowprocedure
- at WNDCLASSEX.cbClsExtra, dd 0
- at WNDCLASSEX.cbWndExtra, dd 0
- at WNDCLASSEX.hInstance, dd 0
- at WNDCLASSEX.hIcon, dd 0
- at WNDCLASSEX.hCursor, dd 0
- at WNDCLASSEX.hbrBackground, dd COLOR_BACKGROUND
- at WNDCLASSEX.lpszMenuName, dd 0
- at WNDCLASSEX.lpszClassName, dd szClassName
- at WNDCLASSEX.hIconSm, dd 0
- iend
- WinMSG:
- istruc MSG
- at MSG.hwnd, dd 0
- at MSG.message, dd 0
- at MSG.wParam, dd 0
- at MSG.lParam, dd 0
- at MSG.time, dd 0
- at MSG.pt, dd 0
- iend
- Handle dd 0
- Button dd 0
- BtnClass db "Button"
- BtnT db "Titulo"
- Icon dd 0
- Cursor dd 0
- szClassName db "nasmpad_0001"
- szTitle db "Nasmpad"
- IDI_APPLICATION equ 32512
- IDC_ARROW equ IDI_APPLICATION
- CW_USEDEFAULT equ 80000000h
- WS_EX_WINDOWEDGE equ 00000100h
- WS_EX_CLIENTEDGE equ 00000200h
- WS_OVERLAPPED equ 0h
- WS_CAPTION equ 0C00000h
- WS_SYSMENU equ 80000h
- WS_VISIBLE equ 268435456d
- WS_CHILD equ 1073741824d
- WS_CHILDWINDOW equ WS_CHILD
- WS_THICKFRAME equ 40000h
- WS_MINIMIZEBOX equ 20000h
- WS_MAXIMIZEBOX equ 10000h
- WS_EX_OVERLAPPEDWINDOW equ WS_EX_WINDOWEDGE|WS_EX_CLIENTEDGE
- WS_OVERLAPPEDWINDOW equ WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX
- SW_SHOWNORMAL equ 1
- WM_DESTROY equ 2h
- COLOR_BACKGROUND equ 1
- segment .code use32
- global ..start
- ..start:
- push dword 0
- call [GetModuleHandleA]
- mov [WinClass+WNDCLASSEX.hInstance], eax
- push dword IDI_APPLICATION
- push dword 0
- call [LoadIconA]
- mov [WinClass+WNDCLASSEX.hIcon],eax
- push dword IDC_ARROW
- push dword 0
- call [LoadCursorA]
- mov [WinClass+WNDCLASSEX.hCursor],eax
- push dword WinClass
- call [RegisterClassExA]
- push dword 0
- push dword [WinClass+WNDCLASSEX.hInstance]
- push dword 0
- push dword 0
- push dword 480
- push dword 640
- push dword CW_USEDEFAULT
- push dword CW_USEDEFAULT
- push dword WS_OVERLAPPEDWINDOW
- push dword szTitle
- push dword szClassName
- push dword WS_EX_OVERLAPPEDWINDOW
- call [CreateWindowExA]
- mov [Handle], eax
- push dword SW_SHOWNORMAL
- push dword [Handle]
- call [ShowWindow]
- MsgLoop:
- push dword 0
- push dword 0
- push dword 0
- push dword WinMSG
- call [GetMessageA]
- push dword WinMSG
- call [TranslateMessage]
- push dword WinMSG
- call [DispatchMessageA]
- jmp MsgLoop
- Windowprocedure:
- %define hWnd ebp+8
- %define Msg ebp+0ch
- %define wParam ebp+10h
- %define lParam ebp+14h
- push ebp
- mov ebp,esp
- cmp dword [Msg],WM_DESTROY
- je Finish
- .DefMsgHandler:
- push dword [lParam]
- push dword [wParam]
- push dword [Msg]
- push dword [hWnd]
- call [DefWindowProcA]
- .Exit:
- mov esp, ebp
- pop ebp
- ret
- Finish:
- push dword 0
- call [ExitProcess]
- jmp Windowprocedure.DefMsgHandler