Inspired by Timo's work, here is the Rich Edit sample converted to Poasm :
https://forum.pellesc.de/index.php?msg=41554
include DlgBox.inc
.code
start:
mov eax,RichEditANSIWndProc
invoke GetModuleHandle,0
invoke DialogBoxParam,eax,DLG_MAIN,0,ADDR DlgProc,0
invoke ExitProcess,eax
DlgProc PROC hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
.IF uMsg==WM_CLOSE
invoke EndDialog,hWnd,0
.ELSE
xor eax,eax
ret
.ENDIF
mov eax,1
ret
DlgProc ENDP
END start
Same example built with binary resource template :
include DlgBox.inc
.data
DialogBox:
INCBIN "MyDlg.bin"
.code
start:
mov eax,RichEditANSIWndProc
invoke GetModuleHandle,0
xor ecx,ecx
invoke DialogBoxIndirectParam,eax,\
ADDR DialogBox,ecx,ADDR DlgProc,ecx
invoke ExitProcess,eax
DlgProc PROC hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
.IF uMsg==WM_CLOSE
invoke EndDialog,hWnd,0
.ELSE
xor eax,eax
ret
.ENDIF
mov eax,1
ret
DlgProc ENDP
END start
Here is the 64-bit version :
include DlgBox.inc
.data
Dlgbox db 'MyDlg',0
.code
start PROC PARMAREA=5*SIZEOF QWORD
LOCAL hModule:QWORD
mov rax,RichEditANSIWndProc
invoke GetModuleHandle,0
mov hModule,rax
invoke DialogBoxParam,hModule,ADDR Dlgbox,0,ADDR DlgProc,0
invoke ExitProcess,rax
start ENDP
DlgProc PROC hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD PARMAREA=4*SIZEOF QWORD
.IF uMsg==WM_CLOSE
invoke EndDialog,hWnd,0
.ELSE
xor rax,rax
ret
.ENDIF
mov eax,1
ret
DlgProc ENDP
END start
Useful for users, who needs template for dialog app with richedit control.
Binary resource template version, 64-bit.
A dialog without any resource section in one source.
Just a one test material for poasm
;.model flat,fastcall
INCLUDELIB kernel32.lib
INCLUDELIB user32.lib
WM_DESTROY equ 2
WM_CLOSE equ 10h
WM_INITDIALOG equ 110h
GetModuleHandleW PROTO :QWORD
ExitProcess PROTO :QWORD
DialogBoxIndirectParamW PROTO :QWORD,:QWORD,:QWORD,:QWORD,:QWORD
EndDialog PROTO :QWORD,:QWORD
PostQuitMessage PROTO :QWORD
MessageBoxW PROTO :QWORD,:QWORD,:QWORD,:QWORD
;----------------------
DlgProc PROTO :QWORD,:DWORD,:QWORD,:QWORD
WMInitdialog PROTO :QWORD
WMDestroy PROTO
WMClose PROTO :QWORD
ifdef __POASM__
.drectve segment
db '/subsystem:windows '
.drectve ends
endif
.data
;align 4
DlgBox dw 1 ; dlgVer
dw 0FFFF ; signature
dd 0 ; helpID
dd 0 ; exStyle
dd 10CA0800h ; style
dw 0 ; cDlgItems
dw 0 ; x
dw 0 ; y
dw 200 ; cx
dw 100 ; cy
dw 0 ; empty menu
dw 0 ; empty windowClass
;dw "Test",0 ; title POAsm
dw 'T','e','s','t',0 ; title
;sMsg dw "OK to close",0
sMsg dw 'O','K',' ','t','o',' ','c','l','o','s','e',0
.code
; parameters RCX, RDX, R8 and R9
start PROC PARMAREA=5*sizeof QWORD
INVOKE GetModuleHandleW,0
mov rcx,rax
INVOKE DialogBoxIndirectParamW,rcx,ADDR DlgBox,0,ADDR DlgProc,0
INVOKE ExitProcess, rax
start ENDP
DlgProc PROC hWnd:QWORD,uMsg:DWORD,wParam:QWORD,lParam:QWORD PARMAREA=4*sizeof QWORD
;mov hWnd, rcx ; ?
mov QWORD PTR [rsp+30h],rcx
;mov uMsg, rdx
mov DWORD PTR [rsp+38h],edx
;mov wParam, r8
mov QWORD PTR [rsp+40h],r8
;mov lParam, r9
mov QWORD PTR [rsp+48h],r9
mov eax,uMsg
.if uMsg==WM_INITDIALOG
INVOKE WMInitdialog, hWnd
.elseif uMsg==WM_CLOSE
INVOKE WMClose, hWnd
.elseif uMsg==WM_DESTROY
INVOKE WMDestroy
.else
@@: xor rax,rax
.endif
ret
DlgProc ENDP
WMInitdialog PROC hWnd:QWORD PARMAREA=4*sizeof QWORD
;mov hWnd,rcx
;mov qword ptr [rsp+30h],rcx
mov rax,1
ret
WMInitdialog ENDP
WMDestroy PROC
INVOKE PostQuitMessage,0
mov rax,1
ret
WMDestroy ENDP
WMClose PROC hWnd:QWORD PARMAREA=4*sizeof QWORD
;mov hWnd,rcx
mov QWORD PTR [rsp+30h],rcx
INVOKE MessageBoxW,hWnd,ADDR sMsg, 0, 21h
.if rax == 1
;mov rcx,hWnd
mov rcx,QWORD PTR [rsp+30h]
INVOKE EndDialog,rcx,0
.endif
ret
WMClose ENDP
END start
Hi Timo,
Thanks for your version.