2016-07-17 7 views
-1

別のプログラム(プロセス)を起動するプログラムを作成したいと思います。私はVisual Studio 2015のMASM64(ml64.exe)を使用しています。MASM64(ml64.exe)でCreateProcessA関数が動作しません

プログラムが動作しません。何も表示されません。デバッガで私はアクセス違反を取得します。

私のコードに何が間違っているかわかりません。

マイコード:

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 

あなたの助けを事前に感謝

@echo off 

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

pause 

あるbuild.bat。

+0

スタックポインタは、任意のAPI呼び出しの前に、16バイトにアラインする必要がありますが、あなたはコールCreateProcessA前にこれをしない全体のパラメータリストを割り当てますクラッシュのために十分な – RbMm

+0

私は 'sub rsp、60h'を持っています。私はこれを 'sub rsp、58h'に変更しましたが、まだ動作しません...どのような価値があるはずですか? – Dave

+1

クラッシュのためにデバッガは既に存在しません。 – RbMm

答えて

3

PROCESS_INFORMATIONおよびSTARTUPINFO構造体の定義は、x86とx64で異なる可能性があるため、確認してください。たとえば、ハンドルはDWORD(32ビット整数)ではなくポインタとして定義されます。

3

STARTUPINFOを初期化し、正しいデータ型を(DWORDは常に32ビットである一方、ポインタが、64ビットWindowsで64ビット幅です)を使用してくださいであることに加え、あなたも正しくパラメータ領域を(割り当てる必要がありますまた時々「シャドウ・スペース」)として知られている:

パラメータ領域がスタックの一番下に常にある(allocaが使用されている場合でも)、それは常に任意の関数の間にリターンアドレスに隣接することになるように、コール。
少なくとも4つのエントリが含まれていますが、呼び出すことができる関数が必要とするすべてのパラメータを保持するのに十分なスペースが常に必要です。
パラメータ自体が決してスタックに帰着しない場合でも、レジスタパラメータ
には常にスペースが割り当てられます。呼び出し先は、すべてのパラメーターに対してスペースが割り当てられていることが保証されます。必要なすべてのデータ構造を正しく初期化を想定し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, ...とスタック上のスペースを確保する


あなたの考えは完全に間違っていないです。
もちろん、計算を正しく行う必要がありますが、最も重要なことに、そのテクニックはすぐにpushと互換性がありません。

sub rsp, ...を取得したら、引数を設定するために、mov [rsp+...], ...の1つ以上の間接的なストアが必要です。 pushは、スタックポインタを再びに移動するだけで、これまでの作業はすべて役に立たなくなります。

+1

「パラメータ領域」は、「シャドウ領域」と呼ばれることがよくあります。 OPのコードがwin64呼び出し規約に従っていないことがよく分かりました。 –

0

あなたの関数では、非常に多くのパラメータを持つサブ関数を呼び出すのに十分なスペースを確保します。すでに - あなたの関数のプロローグ

でそのための 使用.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 
関連する問題