| Sulaiman Chang Personal Website |
|
Tutorial 14 : Process
Please assemble the following program first as tut_14a.exe
format PE GUI 4.0
entry start
include '%fasminc%\win32a.inc'
section '.data' data readable writeable
mbCaption db 'Message Box Title',0
mbText db 'Win32 Assembly with FASM is Great',0
section '.code' code readable executable
start:
push MB_OK
push mbCaption
push mbText
push dword NULL
call [MessageBox]
invoke ExitProcess,0
section '.idata' import data readable writeable
library KERNEL32, 'KERNEL32.DLL',\
USER32, 'USER32.DLL'
import KERNEL32,\
ExitProcess, 'ExitProcess'
import USER32,\
MessageBox, 'MessageBoxA'
Result :
Then the following flat assembly code that will use the assembled tut_14a.exe
format PE GUI 4.0
entry start
include '%fasminc%\win32a.inc'
; +-----------------------+
; | menu item declaration |
; +-----------------------+
MI_PROCESS_CREATE equ 110
MI_PROCESS_TERMINATE equ 120
MI_EXIT equ 190
section '.data' data readable writeable
sTitle db 'Tutorial 14',0
sClsName db 'TUT14',0
hWindow dd ?
hInstance dd ?
msg MSG
wc WNDCLASS
hMenu dd ? ;menu handle
proExitCode dd ? ;process exit code
progName db 'tut_14a.exe',0
progStartInfo STARTUPINFO
pi PROCESS_INFORMATION
section '.code' code readable executable
start:
; +------------------------------+
; | registering the window class |
; +------------------------------+
invoke GetModuleHandle,NULL
mov [hInstance],eax
mov [wc.hInstance],eax
mov [wc.style],CS_HREDRAW or CS_VREDRAW
mov [wc.lpfnWndProc],window_procedure
mov [wc.lpszClassName],sClsName
mov [wc.lpszMenuName],30
mov [wc.hbrBackground],COLOR_WINDOW+1
invoke LoadIcon,NULL,IDI_APPLICATION
mov [wc.hIcon],eax
invoke LoadCursor,NULL,IDC_ARROW
mov [wc.hCursor],eax
invoke RegisterClass,wc
; +--------------------------+
; | creating the main window |
; +--------------------------+
invoke CreateWindowEx,\
WS_EX_CLIENTEDGE,\
sClsName,\
sTitle,\
WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
300,\
200,\
NULL,\
NULL,\
[hInstance],\
NULL
mov [hWindow],eax
invoke GetMenu,eax
mov [hMenu],eax
; +---------------------------+
; | entering the message loop |
; +---------------------------+
window_message_loop_start:
invoke GetMessage,msg,NULL,0,0
or eax,eax
je window_message_loop_end
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp window_message_loop_start
window_message_loop_end:
invoke ExitProcess,0
; +----------------------+
; | the window procedure |
; +----------------------+
proc window_procedure,hWnd,uMsg,wParam,lParam
push ebx esi edi
cmp [uMsg],WM_INITMENUPOPUP
je wmINITMENUPOPUP
cmp [uMsg],WM_COMMAND
je wmCOMMAND
cmp [uMsg],WM_DESTROY
je wmDESTROY
wmDEFAULT:
invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
jmp wmBYE
wmINITMENUPOPUP:
invoke GetExitCodeProcess,[pi.hProcess],proExitCode
cmp eax,TRUE
je GetExitCodeProcess_TRUE
invoke EnableMenuItem,[hMenu],MI_PROCESS_CREATE,MF_ENABLED
invoke EnableMenuItem,[hMenu],MI_PROCESS_TERMINATE,MF_GRAYED
jmp wmBYE
GetExitCodeProcess_TRUE:
cmp [proExitCode],STILL_ACTIVE
je GetExitCodeProcess_STILL_ACTIVE
invoke EnableMenuItem,[hMenu],MI_PROCESS_CREATE,MF_ENABLED
invoke EnableMenuItem,[hMenu],MI_PROCESS_TERMINATE,MF_GRAYED
jmp wmBYE
GetExitCodeProcess_STILL_ACTIVE:
invoke EnableMenuItem,[hMenu],MI_PROCESS_CREATE,MF_GRAYED
invoke EnableMenuItem,[hMenu],MI_PROCESS_TERMINATE,MF_ENABLED
jmp wmBYE
wmCOMMAND:
cmp [wParam],0xFFFF and MI_PROCESS_CREATE
je wmCOMMAND_MI_PROCESS_CREATE
cmp [wParam],0xFFFF and MI_PROCESS_TERMINATE
je wmCOMMAND_MI_PROCESS_TERMINATE
cmp [wParam],0xFFFF and MI_EXIT
je wmCOMMAND_MI_EXIT
jmp wmBYE
wmCOMMAND_MI_EXIT:
invoke DestroyWindow,[hWnd]
jmp wmBYE
wmCOMMAND_MI_PROCESS_CREATE:
cmp [pi.hProcess],0
je pi_hProcess_IS_0
invoke CloseHandle,[pi.hProcess]
mov [pi.hProcess],0
pi_hProcess_IS_0:
invoke GetStartupInfo,[progStartInfo]
invoke CreateProcess,progName,NULL,NULL,NULL,FALSE,\
NORMAL_PRIORITY_CLASS,\
NULL,NULL,progStartInfo,pi
invoke CloseHandle,[pi.hThread]
jmp wmBYE
wmCOMMAND_MI_PROCESS_TERMINATE:
invoke GetExitCodeProcess,[pi.hProcess],proExitCode
cmp [proExitCode],STILL_ACTIVE
jne proExitCode_NOT_STILL_ACTIVE
invoke TerminateProcess,[pi.hProcess],0
proExitCode_NOT_STILL_ACTIVE:
invoke CloseHandle,[pi.hProcess]
mov [pi.hProcess],0
jmp wmBYE
wmDESTROY:
invoke PostQuitMessage,0
wmBYE:
pop edi esi ebx
return
endp
section '.idata' import data readable writeable
library KERNEL32, 'KERNEL32.DLL',\
USER32, 'USER32.DLL'
import KERNEL32,\
GetModuleHandle, 'GetModuleHandleA',\
GetExitCodeProcess, 'GetExitCodeProcess',\
GetStartupInfo, 'GetStartupInfoA',\
CreateProcess, 'CreateProcessA',\
TerminateProcess, 'TerminateProcess',\
CloseHandle, 'CloseHandle',\
ExitProcess, 'ExitProcess'
import USER32,\
RegisterClass, 'RegisterClassA',\
CreateWindowEx, 'CreateWindowExA',\
DefWindowProc, 'DefWindowProcA',\
LoadCursor, 'LoadCursorA',\
LoadIcon, 'LoadIconA',\
GetMenu, 'GetMenu',\
EnableMenuItem, 'EnableMenuItem',\
GetMessage, 'GetMessageA',\
DestroyWindow, 'DestroyWindow',\
TranslateMessage, 'TranslateMessage',\
DispatchMessage, 'DispatchMessageA',\
PostQuitMessage, 'PostQuitMessage'
section '.rsrc' resource data readable
directory RT_MENU,appMenu
resource appMenu,\
30,LANG_NEUTRAL,menuMain
menu menuMain
menuitem '&Process',0,MFR_POPUP + MFR_END
menuitem '&Create Process',MI_PROCESS_CREATE,0
menuitem '&Terminate Process',MI_PROCESS_TERMINATE,0
menuseparator
menuitem 'E&xit',MI_EXIT,MFR_END
|
| Copyright © 2004 Sulaiman Chang. All Rights Reserved. |