CreateProcessA函数在MASM64(ml64.exe)中不起作用 [英] CreateProcessA function doesn't work in MASM64 (ml64.exe)

查看:0
本文介绍了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, ...类型的一个或多个间接存储。 pushES只会再次移动堆栈指针,使以前的所有工作毫无用处。

这篇关于CreateProcessA函数在MASM64(ml64.exe)中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆