Win32 Assembly
LoadIconA PROTO :DWORD, :DWORD LoadIcon equ < LoadIconA > |
Figura 1 - Segmento dati di FONTWIN.ASM |
---|
_DATA SEGMENT DWORD PUBLIC USE32 'DATA' className db 'FontWin', 0 winTitle db 'Win32 Assembly - Applicazione FontWin', 0 msgTitolo db 'Win 32 Assembly', 0 msgCreate db 'Procedura FontWin_OnCreate.', 10 db 'Messaggio WM_CREATE ricevuto!', 10 db 'Inizializzazioni effettuate.', 0 msgClose db 'Procedura FontWin_OnClose.', 10 db 'Messaggio WM_CLOSE ricevuto!', 10 db 'Chiudere FONTWIN.EXE ?', 0 strOut1 db 'Output di stringhe di testo in Win32' LEN_STROUT1 = $ - offset strOut1 strOut2 db 'True Type' LEN_STROUT2 = $ - offset strOut2 strOut3 db 'Testo centrato nella finestra', 0 fontName db 'Times New Roman', 0 fontHandle dd 0 _DATA ENDS _BSS SEGMENT DWORD PUBLIC USE32 'BSS' hInstance dd ? ; handle dell'applicazione commandLine dd ? ; puntatore alla command line hWindow dd ? ; handle della main window fontStruct LOGFONT > ; struttura LOGFONT _BSS ENDS |
28 * 28 * 28 = 28+8+8 =
224 = 16777216 colori = 16M colori
MAKE_COLORREF MACRO intRed, intGreen, intBlue xor eax, eax mov ah, intBlue shl eax, 8 mov ah, intGreen mov al, intRed ENDM |
HBRUSH CreateSolidBrush(COLORREF crColor);
MAKE_COLORREF 0, 150, 150 ; crea una terna RGB invoke CreateSolidBrush, eax ; e la converte in HBRUSH mov wc.hbrBackground, eax ; colore di sfondo della finestra |
HBRUSH CreateHatchBrush(int fnStyle, COLORREF crColor);
invoke CreateHatchBrush, HS_DIAGCROSS, eax
Figura 3 - Window procedure WndProc |
---|
WndProc proc hWnd :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD messaggio_WM_CREATE: cmp uMsg, WM_CREATE ; (uMsg == WM_CREATE) ? jne messaggio_WM_PAINT call FontWin_OnCreate, hWnd, NULL jmp messaggio_restituito ; passa WM_CREATE a DefWindowProc messaggio_WM_PAINT: cmp uMsg, WM_PAINT ; (uMsg == WM_PAINT) ? jne messaggio_WM_CLOSE call FontWin_OnPaint, hWnd jmp exitWndProc messaggio_WM_CLOSE: cmp uMsg, WM_CLOSE ; (uMsg == WM_CLOSE) ? jne messaggio_WM_DESTROY call FontWin_OnClose, hWnd cmp eax, IDYES jne exitWndProc jmp messaggio_restituito ; passa WM_CLOSE a DefWindowProc messaggio_WM_DESTROY: cmp uMsg, WM_DESTROY ; (uMsg == WM_DESTROY) ? jne messaggio_restituito call FontWin_OnDestroy, hWnd jmp exitWndProc messaggio_restituito: call DefWindowProc, hWnd, uMsg, wParam, lParam ret exitWndProc: xor eax, eax ret WndProc endp |
Figura 4 - Struttura di WndProc in C/C++ |
---|
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { HANDLE_MSG(hWnd, WM_CREATE, FontWin_OnCreate); HANDLE_MSG(hWnd, WM_PAINT, FontWin_OnPaint); HANDLE_MSG(hWnd, WM_CLOSE, FontWin_OnClose); HANDLE_MSG(hWnd, WM_DESTROY, FontWin_OnDestroy); default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } } |
#define HANDLE_MSG(hwnd, message, fn) \ case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn)) |
case WM_CREATE: return HANDLE_WM_CREATE((hwnd), (wParam), (lParam), (fn))
/* BOOL Cls_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) */ #define HANDLE_WM_CREATE(hwnd, wParam, lParam, fn) \ ((fn)((hwnd), (LPCREATESTRUCT)(lParam)) ? 0L : (LRESULT)-1L) |
FontWin_OnCreate(hwnd, lParam);
BOOL FontWin_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
void FontWin_OnClose(HWND hwnd);
void FontWin_OnDestroy(HWND hwnd);
void FontWin_OnPaint(HWND hwnd);
HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint);
PAINTSTRUCT STRUC hdc HDC ? ; handle del DC da usare fErase BOOL ? ; flag aggiornamento sfondo rcPaint RECT < ? > ; area di output fRestore BOOL ? ; riservato a Win32 fIncUpdate BOOL ? ; riservato a Win32 rgbReserved BYTE 32 dup (?) ; riservato a Win32 PAINTSTRUCT ENDS |
RECT STRUC left LONG ? ; ascissa P1 top LONG ? ; ordinata P1 right LONG ? ; ascissa P2 bottom LONG ? ; ordinata P2 RECT ENDS |
BOOL EndPaint(HWND hwnd, CONST LPPAINTSTRUCT lpPaint);
Cls_OnPaint proc hwnd :HWND LOCAL paintStruct :DWORD LOCAL paintDC :DWORD invoke BeginPaint, hwnd, addr paintStruct mov paintDC, eax ; elaborazione di WM_PAINT invoke EndPaint, hwnd, addr paintStruct ret Cls_OnPaint endp |
BOOL TextOut(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString,
int cbString);
strOut1 db 'Output di stringhe di testo in Win32' LEN_STROUT1 = $ - offset strOut1 |
invoke TextOut, paintDC, 10, 10, offset strOut1, LEN_STROUT1
COLORREF SetBkColor(HDC hdc, COLORREF crColor);
MAKE_COLORREF 0, 0, 0 invoke SetBkColor, paintDC, eax |
COLORREF SetTextColor(HDC hdc, COLORREF crColor);
MAKE_COLORREF 200, 0, 0 invoke SetTextColor, paintDC, eax |
int SetBkMode(HDC hdc, int iBkMode);
invoke SetBkMode, paintDC, TRANSPARENT MAKE_COLORREF 0, 250, 0 invoke SetTextColor, paintDC, eax invoke TextOut, paintDC, 10, 10, offset strOut1, LEN_STROUT1 |
int DrawText(HDC hdc, LPCTSTR lpString, int nCount, LPRECT lpRect,
UINT uFormat);
DT_SINGLELINE OR DT_CENTER OR DT_VCENTER
BOOL GetClientRect(HWND hwnd, LPRECT lpRect);
invoke GetClientRect, hwnd, addr paintRect MAKE_COLORREF 150, 0, 0 invoke SetTextColor, paintDC, eax invoke DrawText, paintDC, addr strOut3, -1, addr paintRect, DT_SINGLELINE OR DT_CENTER OR DT_VCENTER |
LOGFONT STRUC lfHeight LONG ? ; altezza cella carattere lfWidth LONG ? ; larghezza cella carattere lfEscapement LONG ? ; inclinazione del testo in gradi * 10 lfOrientation LONG ? ; inclinazione dei char in gradi * 10 lfWeight LONG ? ; peso del font (0 - 1000) lfItalic BYTE ? ; TRUE = font italic lfUnderline BYTE ? ; TRUE = font sottolineato lfStrikeOut BYTE ? ; TRUE = font sbarrato lfCharSet BYTE ? ; set di caratteri lfOutPrecision BYTE ? ; precisione nell'output del font lfClipPrecision BYTE ? ; precisione nel clipping del font lfQuality BYTE ? ; qualita' dell'output lfPitchAndFamily BYTE ? ; tipo e famiglia del font lfFaceName TCHAR LF_FACESIZE dup (?) ; nome del font LOGFONT ENDS |
VARIABLE_PITCH OR FF_ROMAN
HFONT CreateFontIndirect(CONST LPLOGFONT lplf);
BOOL DeleteObject(HGDIOBJ hObject);
cmp fontHandle, 0 je short continue invoke DeleteObject, fontHandle continue: invoke CreateFontIndirect, addr fontStruct mov fontHandle, eax |
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);
invoke SelectObject, paintDC, fontHandle mov oldFont, eax invoke TextOut, paintDC, 10, 10, addr strOut1, LEN_STROUT1 invoke SelectObject, paintDC, oldFont |
MemSet proc ptrMem :DWORD, fillValue :DWORD, fillSize :DWORD push edi ; salva il contenuto di edi mov edi, ptrMem ; edi punta al blocco di memoria da inizializzare mov eax, fillValue ; al = byte ptr fillValue[0] (inizializzatore) mov ecx, fillSize ; ecx = n. byte da riempire (contatore) cld ; DF = 0 (incremento automatico puntatori) rep stosb ; riempie [ptrMem] con fillValue byte pop edi ; ripristina il vecchio contenuto di edi ret MemSet endp |
FontWin_OnCreate proc hwnd :DWORD, lpCreateStruct :DWORD call MemSet, offset fontStruct, 0, SIZE LOGFONT mov fontStruct.lfHeight, 50 mov fontStruct.lfWeight, 700 mov fontStruct.lfEscapement, 0 mov fontStruct.lfItalic, TRUE mov fontStruct.lfUnderline, TRUE mov fontStruct.lfCharSet, ANSI_CHARSET mov fontStruct.lfOutPrecision, OUT_TT_ONLY_PRECIS mov fontStruct.lfClipPrecision, CLIP_DEFAULT_PRECIS mov fontStruct.lfQuality, DEFAULT_QUALITY mov fontStruct.lfPitchAndFamily, VARIABLE_PITCH OR FF_ROMAN call StrCpy, offset fontStruct.lfFaceName, offset fontName call MessageBox, hwnd, offset msgCreate, offset msgTitolo, MB_OK OR MB_ICONINFORMATION mov eax, TRUE ret FontWin_OnCreate endp |
'Times New Roman', 0
(Figura 1)StrCpy proc strTo :DWORD, strFrom :DWORD mov ecx, strFrom ; ecx punta a strFrom mov edx, strTo ; edx punta a strTo strcpy_loop: mov al, [ecx] ; trasferisce un byte mov [edx], al ; da [ecx] in [edx] inc ecx ; prossimo byte sorgente inc edx ; prossimo byte destinaz. test al, al ; fine stringa ? jnz strcpy_loop ret StrCpy endp |
LOCAL paintStruct :PAINTSTRUCT ; struttura PAINTSTRUCT LOCAL paintRect :RECT ; area di output LOCAL paintDC :HDC ; handle del DC LOCAL oldFont :HFONT ; handle del font LOCAL counter :DWORD ; contatore LOCAL angolo :DWORD ; inclinazione stringa |
invoke BeginPaint, hwnd, addr paintStruct mov paintDC, eax |
invoke SetBkMode, paintDC, TRANSPARENT MAKE_COLORREF 0, 250, 0 invoke SetTextColor, paintDC, eax invoke TextOut, paintDC, 10, 10, offset strOut1, LEN_STROUT1 |
SetFont proc angolazione :DWORD MOV32 fontStruct.lfEscapement, angolazione cmp fontHandle, 0 je short setfont_continue invoke DeleteObject, fontHandle setfont_continue: invoke CreateFontIndirect, offset fontStruct mov fontHandle, eax ret SetFont endp |
MAKE_COLORREF 250, 250, 0 invoke SetTextColor, paintDC, eax mov counter, 8 mov angolo, 0 fontRotateLoop: invoke SetFont, angolo invoke SelectObject, paintDC, fontHandle mov oldFont, eax invoke TextOut, paintDC, 300, 250, offset strOut2, LEN_STROUT2 invoke SelectObject, paintDC, oldFont add angolo, 450 dec counter jnz fontRotateLoop |
invoke SetFont, 0 invoke SelectObject, paintDC, fontHandle mov oldFont, eax invoke GetClientRect, hwnd, addr paintRect MAKE_COLORREF 150, 0, 0 invoke SetTextColor, paintDC, eax invoke DrawText, paintDC, addr strOut3, -1, addr paintRect, DT_SINGLELINE OR DT_CENTER OR DT_VCENTER invoke SelectObject, paintDC, oldFont |
invoke EndPaint, hwnd, paintStruct
FontWin_OnClose proc hwnd :DWORD invoke MessageBox, hwnd, offset msgClose, offset msgTitolo, MB_YESNO OR MB_ICONQUESTION ret ; eax = return value (IDYES o IDNO) FontWin_OnClose endp |
FontWin_OnDestroy proc hwnd :DWORD cmp fontHandle, 0 je short ondestroy_continue invoke DeleteObject, fontHandle ondestroy_continue: invoke PostQuitMessage, NULL ret FontWin_OnDestroy endp |