我想编写启动另一个程序(进程)的程序。我正在使用Visual 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
endbuild.bat
@echo off
ml64.exe prog1.asm /link /entry:Main /subsystem:windows /defaultlib:"kernel32.Lib" /defaultlib:"user32.Lib"
pause提前谢谢你的帮助。
发布于 2016-07-17 13:33:09
您应该检查PROCESS_INFORMATION和STARTUPINFO结构的定义,因为它们在x86和x64之间可能有所不同。例如,句柄定义为指针,而不是DWORD(32位整数)。
发布于 2016-08-31 20:19:13
在您的函数中,保留足够的空间来调用具有这么多参数的子函数。在您的函数prolog中使用.ALLOCSTACK
然后简单地分配整个参数列表。
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 发布于 2021-01-25 20:49:37
这是个有点老的问题,但既然我刚刚解决了,就把它写下来。现在,我正为同样的问题而挣扎,但却在与NASM斗争。问题是一样的,但是语法会有一点不同。您的问题是您的STARTUPINFOA和PROCESS_INFORMATION不正确,原因有两个:
NASM语法中的正确结构如下:
; 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稍微解释一下:
如果遵循结构,那么大多数字段都可以正确填充,但这是两个不同的字段。原因是结构填充。MS编译器在结构中选择最大的元素,然后将所有其他字段都填充到结构中。为了给出一个例子,STARTUPINFOA的情况如下:
当我做了正确的填充物时,效果就像魅力一样。祝你好运!)
https://stackoverflow.com/questions/38420322
复制相似问题