首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateProcessA函数在MASM64中不工作(ml64.exe)

CreateProcessA函数在MASM64中不工作(ml64.exe)
EN

Stack Overflow用户
提问于 2016-07-17 10:37:08
回答 3查看 571关注 0票数 0

我想编写启动另一个程序(进程)的程序。我正在使用Visual 2015中的MASM64 (ml64.exe)。

程序不起作用。什么都没显示出来。在调试器中,我会遇到访问冲突。

我不知道我的代码有什么问题。

我的代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
@echo off

ml64.exe prog1.asm /link /entry:Main /subsystem:windows /defaultlib:"kernel32.Lib" /defaultlib:"user32.Lib"

pause

提前谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2016-07-17 13:33:09

您应该检查PROCESS_INFORMATION和STARTUPINFO结构的定义,因为它们在x86和x64之间可能有所不同。例如,句柄定义为指针,而不是DWORD(32位整数)。

票数 4
EN

Stack Overflow用户

发布于 2016-08-31 20:19:13

在您的函数中,保留足够的空间来调用具有这么多参数的子函数。在您的函数prolog中使用.ALLOCSTACK

然后简单地分配整个参数列表。

代码语言:javascript
复制
mov QWORD PTR [rsp+48h], rax                     
mov QWORD PTR [rsp+40h], rbx                     
mov QWORD PTR [rsp+38h], 00h                     
mov QWORD PTR [rsp+30h], 00h                     
mov QWORD PTR [rsp+28h], NORMAL_PRIORITY_CLASS
mov QWORD PTR [rsp+20h], 00h

xor r9, r9    ; pass 0              
xor r8, r8    ; pass 0
xor edx, edx  ; pass 0  (higher DWORD becomes always also zero, saving the REX-byte)
lea rcx, szProcName
call CreateProcessA  
票数 0
EN

Stack Overflow用户

发布于 2021-01-25 20:49:37

这是个有点老的问题,但既然我刚刚解决了,就把它写下来。现在,我正为同样的问题而挣扎,但却在与NASM斗争。问题是一样的,但是语法会有一点不同。您的问题是您的STARTUPINFOA和PROCESS_INFORMATION不正确,原因有两个:

  1. 指针是DWORD64在x64系统上
  2. 您还没有考虑过64位系统上的结构填充

NASM语法中的正确结构如下:

代码语言:javascript
复制
; https://msdn.microsoft.com/library/windows/desktop/ms686331.aspx
STRUC _STARTUPINFOA
    .cb:                resq 1
    .lpReserved:        resq 1
    .lpDesktop:         resq 1
    .lpTitle:           resq 1
    .dwX:               resd 1
    .dwY:               resd 1
    .dwXSize:           resd 1
    .dwYSize:           resd 1
    .dwXCountChars:     resd 1
    .dwYCountChars:     resd 1
    .dwFillAttribute:   resd 1
    .dwFlags:           resd 1
    .wShowWindow:       resd 1
    .cbReserved2:       resd 1
    .lpReserved2:       resq 1
    .hStdInput:         resq 1
    .hStdOutput:        resq 1
    .hStdError:         resq 1
ENDSTRUC

; https://msdn.microsoft.com/library/windows/desktop/ms684873.aspx
STRUC _PROCESS_INFORMATION
    .hProcess:          resq 1
    .hThread:           resq 1
    .dwProcessId:       resd 1
    .dwThreadId:        resd 1
ENDSTRUC

稍微解释一下:

  1. resq = DWORD64
  2. resd = DWORD32

如果遵循结构,那么大多数字段都可以正确填充,但这是两个不同的字段。原因是结构填充。MS编译器在结构中选择最大的元素,然后将所有其他字段都填充到结构中。为了给出一个例子,STARTUPINFOA的情况如下:

  1. 编译器选择DWORD64作为最大的元素。
  2. cb字段是DWORD,但是由于它不能用下一个字段(lpReserved: DWORD64)填充它,所以它将它填充到DWORD64
  3. lpReserved,lpDesktop和lpTitle已经是DWORD64了
  4. 从dwX到dwFlags,大小可以用下一个元素填充,这样就不会改变
  5. wShowWindow和cbReserved2只是字,所以编译器将它们放在一起变成8个字节,因此每个字段都被更改为DWORD。
  6. 从lpReserved2到hStdError已经是DWORD64

当我做了正确的填充物时,效果就像魅力一样。祝你好运!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38420322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档