CreateProcessA函数在MASM64(ml64.exe)中不起作用 [英] CreateProcessA function doesn't work in MASM64 (ml64.exe)
本文介绍了CreateProcessA函数在MASM64(ml64.exe)中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想编写启动另一个程序(进程)的程序。我使用的是来自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:AppsSampleApp.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
提前感谢您的帮助。
推荐答案
除了初始化STARTUPINFO
并确保使用正确的数据类型(指针在64位Windows中为64位宽,而DWORD
始终为32位)外,还需要正确分配参数区域(有时也称为"阴影空间"):
参数区域始终位于堆栈的底部(即使使用
alloca
),因此在任何函数调用期间它都将始终与返回地址相邻。
它至少包含四个条目,但始终有足够的空间来存放可能被调用的任何函数所需的所有参数。
请注意,始终为寄存器参数分配空间,即使参数本身从未驻留到堆栈;被调用方保证已为其所有参数分配了空间。
我的重点,来自here
假设正确初始化所需的所有数据结构,则可能调用CreateProcessA
:
; Stack is assumed aligned here
push rax ; Not aligned (08h)
push rbx ; Aligned (10h)
push 00h ; Not aligned (18h)
push 00h ; Aligned (20h)
push NORMAL_PRIORITY_CLASS ; Not aligned (28h)
push 00h ; Aligned (30h)
; Make room for the first four (register) parameters
; Stack is aligned, not need to subtract 28h, just 20h (4*8)
sub rsp, 20h
mov r9, 00h
mov r8, 00h
mov rdx, 00h
lea rcx, szProcName
call CreateProcessA
add rsp, 50h
请注意,调用方负责在调用后清理堆栈。
您使用sub rsp, ...
在堆栈上保留空间的想法并非完全错误。
当然,您必须正确计算,但最重要的是,该技术不能立即与ES兼容。
设置参数需要sub rsp, ...
类型的一个或多个间接存储。
push
ES只会再次移动堆栈指针,使以前的所有工作毫无用处。
这篇关于CreateProcessA函数在MASM64(ml64.exe)中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文