有人知道如何使用Windows编译器ml.exe在程序集中创建嵌套结构
我想声明startupinfoexa(https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-startupinfoexa)的结构,但其中包含startupinfoinfoa(https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa)的结构
startupinfoa结构在我的代码中这样声明:
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
并且它运作良好,但是现在我想在我的代码中使用startupinfoexa,但是我真的不知道如何声明它,因为它包含了startupinfoa结构。我在下面使用的方法不起作用:
STARTUPINFOEXA struct
StartupInfo STARTUPINFOA ?
lpAttributeList DWORD ?
STARTUPINFOEXA ends
任何想法?
谢谢
使用尖括号:
STARTUPINFOEXA struct
StartupInfo STARTUPINFOA <>
lpAttributeList DWORD ?
STARTUPINFOEXA ends
示例(程序在控制台中执行"cmd /cDIR"
:
.686
.MODEL FLAT
CreateProcessA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WaitForSingleObject PROTO STDCALL :DWORD,:DWORD
ExitProcess PROTO STDCALL :DWORD
puts PROTO C :DWORD
fflush PROTO C :DWORD
_getch PROTO C
INCLUDELIB kernel32.lib
INCLUDELIB msvcrt.lib
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
STARTUPINFOEXA struct
StartupInfo STARTUPINFOA <>
lpAttributeList DWORD ?
STARTUPINFOEXA ends
PROCESS_INFORMATION STRUCT ; https://msdn.microsoft.com/library/windows/desktop/ms684873.aspx
hProcess DWORD ?
hThread DWORD ?
dwProcessId DWORD ?
dwThreadId DWORD ?
PROCESS_INFORMATION ENDS
.DATA
app db "C:\WINDOWS\system32\cmd.exe",0
arg db "/c dir", 0
msg db 10,10,"ok",10,0
startinfoex STARTUPINFOEXA <>
procinfo PROCESS_INFORMATION <>
.CODE
_start:
mov startinfoex.StartupInfo.cb, sizeof (STARTUPINFOEXA)
; CreateProcess(app,arg,0,0,false,0,0,0,&startupinfo,&procinfo)
push OFFSET procinfo
push OFFSET startinfoex
push 0
push 0
push 0
push 0
push 0
push 0
push OFFSET arg
push OFFSET app
call CreateProcessA ; https://msdn.microsoft.com/library/windows/desktop/ms682425.aspx
; WaitForSingleObject( procinfo.hProcess, INFINITE );
push -1 ; INFINITE
push dword ptr [procinfo.hProcess]
call WaitForSingleObject
; puts ("ok"), fflush to flush the stdout-buffer
push OFFSET msg
call puts
mov dword ptr [esp], 0
call fflush
add esp, 4
call _getch ; Stop and wait for a key pressed.
; return 0
push 0
call ExitProcess
END _start