Hallo da draußen,
ich habe schon lönger Erfahrung mit asm, aber nie so richtig mit Fenstern.
Bisher immer einzellne API Funktionen verwendet oder kleine Algorithmen geschrieben, oder auch mal das ein oder andere Crackme gelöst.
Ich weiß, dass mit masm die asm-Fensterentwicklung wesentlich einfacher ist, aber ich lehne masm grundsätzlich ab. Grund: pseudo-asm (IF, invoke, ...), ich mag es lieber nostalgisch, möchte darauf aber nicht näher eingehen, einfach meine Meinung.
Nun zu meinem Bisherigen Code (quelle: deinmeister.de):
win32n.inc gibt hier: http://rs1.szif.hu/~tomcat/win32/win32n.zip
Der Code ist etwas Chaotisch, es war der einzigste den ich in NASM-syntax gefunden habe. Ich habe ihn leicht modifiziert (vereinfacht), da ich keine Ressourcen verwende.
Wenn ich das Programm assembliere und linke, ist das Ergebnis ausführbar, aber unsichtbar.
assembliert und gelinkt auf diese Weise:
Woran liegt es, das das Fenster nicht sichtbar ist??
Ich wäre auch über Tutorials und Codebeispiele für Win32 Fensterprogramme in NASM-Syntax dankbar.
Mit freundlichem Gruß
zaibl
ich habe schon lönger Erfahrung mit asm, aber nie so richtig mit Fenstern.
Bisher immer einzellne API Funktionen verwendet oder kleine Algorithmen geschrieben, oder auch mal das ein oder andere Crackme gelöst.
Ich weiß, dass mit masm die asm-Fensterentwicklung wesentlich einfacher ist, aber ich lehne masm grundsätzlich ab. Grund: pseudo-asm (IF, invoke, ...), ich mag es lieber nostalgisch, möchte darauf aber nicht näher eingehen, einfach meine Meinung.
Nun zu meinem Bisherigen Code (quelle: deinmeister.de):
Code:
%include 'win32n.inc'
EXTERN GetModuleHandleA
EXTERN RegisterClassExA
EXTERN LoadIconA
EXTERN LoadCursorA
EXTERN CreateWindowExA
EXTERN GetMessageA
EXTERN DispatchMessageA
EXTERN ExitProcess
EXTERN DefWindowProcA
EXTERN PostQuitMessage
EXTERN MessageBoxA
EXTERN SendMessageA
[segment .data]
UnsereFensterklasse:
istruc WNDCLASSEX
at WNDCLASSEX.cbSize, dd WNDCLASSEX_size
at WNDCLASSEX.style, dd CS_VREDRAW + CS_HREDRAW
at WNDCLASSEX.lpfnWndProc, dd Fensterprozedur
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_HIGHLIGHT+1
at WNDCLASSEX.lpszMenuName, dd 0
at WNDCLASSEX.lpszClassName, dd Fensterklassenname
at WNDCLASSEX.hIconSm, dd 0
iend
Fensterhandle dd 0
MSGhWnd equ 0
MSGmsg equ 4
MSGwParam equ 8
MSGlParam equ 12
MessageBuffer dd 0,0,0,0,0,0,0
Fenstertitel db "ordinäres Standardfenster",0
Fensterklassenname db "UnsereFensterklasse",0
Fenstername db "Oooooh... Ein Fenster",0
SagNein db 'NEEEEEEEEEEEIN',0
FenstergroesseInX equ 300
FenstergroesseInY equ 200
FensterpositionInX equ 100
FensterpositionInY equ 120
[segment .text]
[global main]
main:
push dword 0
call GetModuleHandleA
mov [UnsereFensterklasse+WNDCLASS.hInstance],eax
;zwei Ressourcen werden geladen (die Menueressource wird automatisch geladen,
;wenn sie in der Fensterklasse definiert wurde
push dword 0
push dword [UnsereFensterklasse+WNDCLASS.hInstance]
call LoadIconA
mov [UnsereFensterklasse+WNDCLASS.hIcon],eax
push dword 0
push dword [UnsereFensterklasse+WNDCLASS.hInstance]
call LoadCursorA
mov [UnsereFensterklasse+WNDCLASS.hCursor],eax
;schicke dem OS die Definition der Fensterklasse
push dword UnsereFensterklasse
call RegisterClassExA
;erzeuge ein Fenster nach der Fensterklasse:
push dword 0
push dword [UnsereFensterklasse+WNDCLASS.hInstance]
push dword 0
push dword 0
push dword FenstergroesseInY
push dword FenstergroesseInX
push dword FensterpositionInY
push dword FensterpositionInX
push dword WS_CAPTION + WS_MAXIMIZEBOX + WS_MINIMIZEBOX + WS_SIZEBOX + WS_SYSMENU + WS_VISIBLE
push dword Fenstername
push dword Fensterklassenname
push dword WS_EX_CLIENTEDGE + WS_EX_WINDOWEDGE
call CreateWindowExA
mov [Fensterhandle],eax
;Die wichtigste Stelle eines Windows-Programms: Die Message Pump / Message Loop. Hier werden
;die eingehenden Meldungen vorverarbeitet und an das entsprechende Fenster verschickt
MessagePumpStart:
push dword 0
push dword 0
push dword 0
push dword MessageBuffer
call GetMessageA
or eax,eax
jz WM_QUIT_empfangen
push dword MessageBuffer
call DispatchMessageA
jmp MessagePumpStart
WM_QUIT_empfangen:
push dword 0
call ExitProcess
Fensterprozedur:
;nur 2 Meldungen werden ueberprueft: WM_COMMAND fuer aktivierte Menues und WM_DESTROY, die
;anzeigt, das das Fenster vernichtet wird.
;Den Rest arbeitet DefaultWndProc von Windows ab.
cmp dword [esp+4+MSGmsg],WM_COMMAND
jne keineInteressanteMeldung
keineInteressanteMeldung:
cmp dword [esp+4+MSGmsg],WM_DESTROY
je Selbstzerstoerung
jmp [DefWindowProcA]
Selbstzerstoerung:
push dword MB_OK | MB_APPLMODAL
push dword Fenstertitel
push dword SagNein
push dword [Fensterhandle]
call [MessageBoxA]
push dword 0
call [PostQuitMessage]
;setze Rueckgabewert = 0
xor eax,eax
ret 16
win32n.inc gibt hier: http://rs1.szif.hu/~tomcat/win32/win32n.zip
Der Code ist etwas Chaotisch, es war der einzigste den ich in NASM-syntax gefunden habe. Ich habe ihn leicht modifiziert (vereinfacht), da ich keine Ressourcen verwende.
Wenn ich das Programm assembliere und linke, ist das Ergebnis ausführbar, aber unsichtbar.
assembliert und gelinkt auf diese Weise:
Code:
nasm -fwin32 test.asm alink -oPE -subsys gui test.obj WIN32.LIB -entry main
Woran liegt es, das das Fenster nicht sichtbar ist??
Ich wäre auch über Tutorials und Codebeispiele für Win32 Fensterprogramme in NASM-Syntax dankbar.
Mit freundlichem Gruß
zaibl