Hi,
I've wrote simple program, that creates new process. Main process is console program and child process is gui. when i run it program crashes. I've loaded it into debugger and it crash somewhere in the CreateProcessA. I don't know that function well. I guess that parameters i delivered was not suitable. What i did wrong?
here is the code of main app:
;--------MAKE-------------------------------------------------------------
;jwasm -win64 mt1.asm
;link /subsystem:console /entry:_start mt1.obj
;--------INCLUDES---------------------------------------------------------
includelib \jwasm\wininc208\lib64\kernel32.lib
includelib \jwasm\wininc208\lib64\user32.lib
;--------EXTERNALS--------------------------------------------------------
extern GetStdHandle :proc
extern ExitProcess :proc
extern CreateProcessA :proc
extern WriteConsoleA :proc
extern GetStartupInfoA :proc
;--------STRUCTS----------------------------------------------------------
STARTUPINFO STRUCT
cb DWORD ?
DWORD ? ; PADDING
lpReserved QWORD ?
lpDesktop QWORD ?
lpTitle QWORD ?
dwX DWORD ?
dwY DWORD ?
dwXSize DWORD ?
dwYSize DWORD ?
dwXCountChars DWORD ?
dwYCountChars DWORD ?
dwFillAttribute DWORD ?
dwFlags DWORD ?
wShowWindow WORD ?
cbReserved2 WORD ?
DWORD ? ;PADDING
lpReserved2 QWORD ?
hStdInput QWORD ?
hStdOutput QWORD ?
hStdError QWORD ?
STARTUPINFO ENDS
PROCESS_INFORMATION STRUCT
hProcess QWORD ?
hThread QWORD ?
dwProcessId DWORD ?
dwThreadId DWORD ?
PROCESS_INFORMATION ENDS
;--------CONSTS-----------------------------------------------------------
STD_OUTPUT_HANDLE equ -11
NORMAL_PRIORITY_CLASS equ 20h
NULL equ 0h
FALSE equ 0h
;--------DATA-------------------------------------------------------------
.data?
TestStartUp STARTUPINFO<>
TestProcessInfo PROCESS_INFORMATION<>
hStdOut dq ?
qwWritten dq ?
.data
tAppName db "mt.exe",0
tCreateProcessFailed db "CreateProcess failed "
tCreateProcessSuccess db "CreateProcess success"
;--------CODE-------------------------------------------------------------
.code
_start proc
mov rcx, STD_OUTPUT_HANDLE
call GetStdHandle
mov hStdOut, rax
mov rcx, offset TestStartUp
call GetStartupInfoA
mov rcx, offset TestProcessInfo
xor rdx, rdx
xor r8, r8
xor r9, r9
sub rsp, [4 * 8]
push FALSE
push NORMAL_PRIORITY_CLASS
push NULL
push NULL
mov rax, offset TestStartUp
push rax
mov rax, offset TestProcessInfo
push rax
call CreateProcessA
test rax, rax
mov rbx, offset tCreateProcessFailed
mov rdx, offset tCreateProcessSuccess
cmovz rdx, rbx
mov rcx, hStdOut
mov r8, lengthof tCreateProcessSuccess
mov r9, offset qwWritten
mov qword ptr [rsp + 8 * 4], 0
call WriteConsoleA
xor rcx, rcx
call ExitProcess
_start endp
end
and child app:
;--------MAKE-------------------------------------------------------------
;jwasm -win64 mt.asm
;link /subsystem:windows /entry:_start mt.obj
;--------INCLUDES---------------------------------------------------------
includelib \jwasm\wininc208\lib64\kernel32.lib
includelib \jwasm\wininc208\lib64\user32.lib
;--------EXTERNALS--------------------------------------------------------
extern ExitProcess :near
extern MessageBoxA :near
;--------DATA-------------------------------------------------------------
.data?
.data
tCpt db 'My name is MT', 0
tMsg db "Hi, I'm process created by MT1 app!", 0
;--------CODE-------------------------------------------------------------
.code
_start proc
sub rsp,28h ;shadow space, aligns stack
mov rcx, 0 ;hWnd = HWND_DESKTOP
lea rdx, tMsg ;LPCSTR lpText
lea r8, tCpt ;LPCSTR lpCaption
mov r9d, 0 ;uType = MB_OK
call MessageBoxA ;call MessageBox API functio call MessageBoxA
xor rcx, rcx
call ExitProcess
_start endp
end