【发布时间】:2016-07-17 10:37:08
【问题描述】:
我想编写启动另一个程序(进程)的程序。我正在使用 Visual Studio 2015 中的 MASM64 (ml64.exe)。
程序不工作。什么都没有显示。在调试器中我得到访问冲突。
我不知道我的代码有什么问题。
我的代码:
extrn ExitProcess : proc
extrn MessageBoxA : proc
extrn CreateProcessA : proc
PROCESS_INFORMATION struct
hProcess DWORD ?
hThread DWORD ?
dwProcessId DWORD ?
dwThreadId DWORD ?
PROCESS_INFORMATION ends
STARTUPINFOA struct
cb DWORD ?
lpReserved DWORD ?
lpDesktop DWORD ?
lpTitle DWORD ?
dwX DWORD ?
dwY DWORD ?
dwXSize DWORD ?
dwYSize DWORD ?
dwXCountChars DWORD ?
dwYCountChars DWORD ?
dwFillAttribute DWORD ?
dwFlags DWORD ?
wShowWindow WORD ?
cbReserved2 WORD ?
lpReserved2 DWORD ?
hStdInput DWORD ?
hStdOutput DWORD ?
hStdError DWORD ?
STARTUPINFOA ends
.const
MB_ICONINFORMATION equ 40h
ERROR_ALREADY_EXISTS equ 0B7h
NORMAL_PRIORITY_CLASS equ 020h
.data
szText db "This is first application which creates new process using CreateProcessA.", 00h
szCaption db "Information",00h
processInfo PROCESS_INFORMATION <>
startupInfo STARTUPINFOA <>
szProcName db "D:\Apps\SampleApp.exe", 00h
.code
Main proc
;not sure if correct - begin
lea rax, processInfo
lea rbx, startupInfo
sub rsp, 60h
push rax
push rbx
push 00h
push 00h
push NORMAL_PRIORITY_CLASS
push 00h
mov r9, 00h
mov r8, 00h
mov rdx, 00h
lea rcx, szProcName
call CreateProcessA
add rsp, 60h
;not sure if correct - end
sub rsp, 28h
mov r9, MB_ICONINFORMATION
lea r8, szCaption
lea rdx, szText
xor rcx, rcx
call MessageBoxA
add rsp, 28h
Exit:
xor rcx, rcx
call ExitProcess
Main endp
end
build.bat
@echo off
ml64.exe prog1.asm /link /entry:Main /subsystem:windows /defaultlib:"kernel32.Lib" /defaultlib:"user32.Lib"
pause
提前感谢您的帮助。
【问题讨论】:
-
堆栈指针必须在 16 个字节上对齐,在任何 API 调用之前,但在调用 CreateProcessA 之前不要这样做 - 已经足够崩溃了
-
我有
sub rsp, 60h。我已将其更改为sub rsp, 58h,但它仍然不起作用......应该有什么价值? -
调试器已经不存在,看看哪里崩溃了?
-
启动信息你也没有初始化..
-
In debugger I get Access Violation.在哪条指令上?使用调试器的全部意义在于获取详细信息并进一步调查(例如检查寄存器内容)。
标签: windows winapi assembly masm