1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
| extern GetModuleHandleA
extern ExitProcess
extern CreateWindowExA
extern LoadIconA
extern LoadCursorA
extern RegisterClassExA
extern ShowWindow
extern UpdateWindow
extern GetMessageA
extern TranslateMessage
extern DispatchMessageA
extern PostQuitMessage
extern DefWindowProcA
extern MessageBoxA
import GetModuleHandleA kernel32.dll
import ExitProcess kernel32.dll
import CreateWindowExA user32.dll
import LoadIconA user32.dll
import LoadCursorA user32.dll
import RegisterClassExA user32.dll
import ShowWindow user32.dll
import UpdateWindow user32.dll
import GetMessageA user32.dll
import TranslateMessage user32.dll
import DispatchMessageA user32.dll
import PostQuitMessage user32.dll
import DefWindowProcA user32.dll
import MessageBoxA user32.dll
%define hWnd ebp+8
%define uMsg ebp+12
%define wParam ebp+16
%define lParam ebp+20
;=================================================================
; API GetModuleHandleA
;=================================================================
section .text use32
..start:
push dword 0
call [GetModuleHandleA]
test eax, eax
jz _stderr
call WinMain
push hInstance
call [ExitProcess]
;=================================================================
; Structure WNDCLASSEX
;=================================================================
WinMain:
mov dword [hInstance], eax
mov dword [WNDCLASS+wc.cbSize], 48
mov dword [WNDCLASS+wc.style], 3h
mov dword [WNDCLASS+wc.lpfnWndProc], WinProc
mov dword [WNDCLASS+wc.cbClsExtra], 0
mov dword [WNDCLASS+wc.cbWndExtra], 0
mov dword [WNDCLASS+wc.hInstance], eax
push dword 32512
push dword 0
call [LoadIconA]
push dword eax
mov dword [WNDCLASS+wc.hIcon], eax
push dword 32512
push dword 0
call [LoadCursorA]
mov dword [WNDCLASS+wc.hCursor], eax
mov dword [WNDCLASS+wc.hbrBackGround], 10h
mov dword [WNDCLASS+wc.lpszMenuName], 0
mov dword [WNDCLASS+wc.lpszClassName], WinClass
pop dword eax
mov dword [WNDCLASS+wc.hIconSm], eax
;=================================================================
; API RegisterClasseExA
;=================================================================
push dword WNDCLASS
call [RegisterClassExA]
test eax, eax
jz _stderr
;=================================================================
; API CreateWindowExA
;=================================================================
push dword 0
push dword [hInstance]
push dword 0
push dword 0
push dword 280
push dword 480
push dword 150
push dword 150
push dword 04ca0000h
push dword _WinName
push dword WinClass
push dword 0
call [CreateWindowExA]
test eax, eax
jz _stderr
mov dword [____HWND], eax
;=================================================================
; APIs ShowWindow, UpdateWindow
;=================================================================
push dword 1h
push dword [____HWND]
call [ShowWindow]
push dword [____HWND]
call [UpdateWindow]
;=================================================================
; APIs GetMessage, TranslateMessage, DispatchMessage
;=================================================================
___LOOP:
push dword 0
push dword 0
push dword 0
push dword ____HWND
call [GetMessageA]
test eax, eax
je ___exit
push dword ____HWND
call [TranslateMessage]
push dword ____HWND
call [DispatchMessageA]
jmp ___LOOP
;=================================================================
; Procédure Window et check point messages
;=================================================================
WinProc:
push ebp
mov ebp, esp
mov eax, [uMsg]
cmp eax, 1h
jne destroy
push dword 0 ; C'est ici que ça cloche
push dword [hInstance] ; Je passe mes paramètres
push 0100h ; pour créer un bouton
push dword [hWnd]
push dword 32
push dword 160
push dword 15
push dword 15
push dword 50000001h
push dword ButtonName
push dword ButtonClass
push dword 0 ; et c'est lors de l'appel
call [CreateWindowExA] ; de la fonction CreateWindow
mov dword [btn01_HWND], eax ; que ça coince, elle devrait
jmp EndProc ; me renvoyer l'handle de mon
; bouton, au lieu de ça :
destroy: ; EAX = 00000000
mov eax, [uMsg] ; message du debuggeur :
cmp eax, 2h ; CANNOT FIND WND CLASS
je ___exit ; ....???.....
EndProc:
push dword [lParam]
push dword [wParam]
push dword [uMsg]
push dword [hWnd]
call [DefWindowProcA]
mov esp, ebp
pop ebp
ret 16
;=================================================================
; Procédure de sortie et message d'erreur
;=================================================================
___exit:
push dword 0
call [PostQuitMessage]
popad
xor eax, eax
mov esp, ebp
pop ebp
ret 16
_stderr:
push dword 0
push dword _caption
push dword _____msg
push dword 0
call [MessageBoxA]
jmp ___exit
;=================================================================
; Déclarations des strings et des données non initialisés
;=================================================================
section .data use32
WinClass db "Template",0
_caption db "LoL...",0
_____msg db "I screwed up!",0
_WinName db "Sample",0
ButtonName db "Pousse moa",0
ButtonClass db "ButtonClass",0
section .bss use32
WNDCLASS resd 12
hInstance resd 1
____HWND resd 1
btn01_HWND resd 1
struc wc
.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
;=================================================================
; nasm -f obj file.asm
; alink -c -oPE file
;================================================================= |
Partager