assembly - 使用masm编译器将结构嵌套到汇编文件中
问题描述
有人知道如何使用 windows 编译器 ml.exe 在程序集中创建嵌套结构吗
我想声明 startupinfoexa 的结构(https://docs.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-startupinfoexa)但它包含结构 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"
在控制台中执行 a):
.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
推荐阅读
- sql - 只有在 SQL Server 中不为空时,我如何连接?
- reactjs - .net core 3.1 web API如何重定向到JWT身份验证的登录页面失败
- laravel - 通过 AJAX 渲染刀片组件不会启动组件属性和方法
- node.js - Oracle Linux 服务器的 Nginx 配置返回/重定向到默认 oracle 页面
- html - Vue.js 路由器链接 css 道具
- reactjs - 用于反应的 Ant 设计 UI 库,类型为 flex 的行作为道具未按预期工作
- docker - docker 无法连接到另一个 docker 服务
- python - 从函数列表创建一个新函数
- bash - 如何在线修改 shell 脚本中的变量?
- python - 如何为我的代码执行设置计时器?