使用 masm 编译器将嵌套结构转换为程序集文件
nested structure into an assembly file using masm compiler
有人知道如何使用 windows 编译器在汇编中创建嵌套结构 ml.exe
我要声明startupinfoexa的结构(https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-startupinfoexa) but it contains the structure startupinfoa (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
有人知道如何使用 windows 编译器在汇编中创建嵌套结构 ml.exe
我要声明startupinfoexa的结构(https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-startupinfoexa) but it contains the structure startupinfoa (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