All pastes #39746 Raw Edit

Unnamed

public text v1 · immutable
#39746 ·published 2006-02-03 13:12 UTC
rendered paste body
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