使用 MASM 编译器将结构嵌套到程序集文件中



有人知道如何使用Windows编译器ml在程序集中创建嵌套结构吗.exe

我想声明startupinfoexa的结构(https://learn.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-startupinfoexa(,但它包含结构startupinfoa(https://learn.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:WINDOWSsystem32cmd.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

最新更新