Win64下彙編寫對話框

用匯編寫界面當然是自己折騰自己~

首先是定義

Includelib Kernel32.Lib
Includelib Advapi32.Lib
Includelib User32.Lib
Includelib Gdi32.Lib
IncludeLib ComCtl32.Lib

EXTERN wsprintfA:PROC
EXTERN RtlZeroMemory:PROC
EXTERN MessageBoxA:PROC
EXTERN LoadIconA:PROC
EXTERN LoadCursorA:PROC
EXTERN GetModuleHandleA:PROC
EXTERN SendMessageA:PROC
EXTERN InitCommonControls:PROC
EXTERN DialogBoxParamA:PROC
EXTERN EndDialog:PROC

.DATA

szInfo		BYTE		"Hi",0
szTrueExit	BYTE		"Quit Now?",0	

.DATA?
hInstance	QWORD		?
hIcon		QWORD		?


接着是asm代碼

入口點 DialogBoxParamA有五個參數,所以最後一個還要通過堆棧的形式傳遞

Entry PROC

  	push    rdi
	sub	rsp,30H

	xor	rcx,rcx
	call	GetModuleHandleA
	mov	hInstance,rax

	call	InitCommonControls

	mov	rcx,hInstance
	mov	rdx,IDD_DLG
	xor	r8,r8
	lea	r9,DlgProc
	xor	rax,rax
	mov	[rsp+20H],rax
	call	DialogBoxParamA
	
	add     rsp, 30h
	pop     rdi
	xor	rax,rax
	ret

Entry ENDP

對話框處理函數 保存rcx rdx r8 r9四個寄存器

DlgProc	PROC

	mov [rsp+8H],rcx
	mov [rsp+10H],rdx
	mov [rsp+18H],r8
	mov [rsp+20H],r9

  	push    rdi
	sub     rsp, 20H

	cmp rdx,WM_INITDIALOG
	je @DlgInit

	cmp rdx,WM_CLOSE
	je @DlgClose

	cmp rdx,WM_COMMAND
	je @DlgCommand
	
	add     rsp, 20H
	pop     rdi
	mov	rax, FALSE
	ret


以及後面的case部分

@DlgClose:

	xor	rax,rax
	mov	eax,BN_CLICKED
	shl	eax,16
	mov	ax,IDC_BTNOK

	mov rcx,[rsp+20H+8+8]
	mov rdx,WM_COMMAND
	mov r8,rax
	xor r9,r9
	call SendMessageA
	
	jmp	@Exit


@DlgInit:
	
	jmp	@Exit

@DlgCommand:

	cmp r8,IDC_BTNOK
	jne @Exit

	mov rcx,[rsp+20H+8+8]
	lea rdx,szTrueExit
	lea r8,szInfo
	mov  r9,MB_YESNO or MB_ICONQUESTION
	call MessageBoxA
	
	cmp rax,IDYES
	jne @Exit

	mov rcx,[rsp+20H+8+8]
	xor rdx,rdx
	call EndDialog

	jmp	@Exit

@Exit:

	add     rsp, 20h
	pop     rdi
	mov	rax,TRUE
	ret

DlgProc	ENDP




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章