解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
  BFbkpSjOcvWq 2023年11月02日 38 0

最近用MASM32编程更新SysInfo,增加对IPv6连接信息的收集,使用到了


typedef struct _MIB_TCP6ROW_OWNER_MODULE {
  UCHAR         ucLocalAddr[16];
  DWORD         dwLocalScopeId;
  DWORD         dwLocalPort;
  UCHAR         ucRemoteAddr[16];
  DWORD         dwRemoteScopeId;
  DWORD         dwRemotePort;
  DWORD         dwState;
  DWORD         dwOwningPid;
  LARGE_INTEGER liCreateTimestamp;
  ULONGLONG     OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
} MIB_TCP6ROW_OWNER_MODULE, *PMIB_TCP6ROW_OWNER_MODULE;

typedef struct _MIB_TCP6TABLE_OWNER_MODULE {
  DWORD                    dwNumEntries;
  MIB_TCP6ROW_OWNER_MODULE table[ANY_SIZE];
} MIB_TCP6TABLE_OWNER_MODULE, *PMIB_TCP6TABLE_OWNER_MODULE;

使用继续更新完善:C++ 结构体代码转MASM32代码

将它们转换为MASM32的定义:

;typedef struct _MIB_TCP6ROW_OWNER_MODULE {
;  UCHAR         ucLocalAddr[16];
;  DWORD         dwLocalScopeId;
;  DWORD         dwLocalPort;
;  UCHAR         ucRemoteAddr[16];
;  DWORD         dwRemoteScopeId;
;  DWORD         dwRemotePort;
;  DWORD         dwState;
;  DWORD         dwOwningPid;
;  LARGE_INTEGER liCreateTimestamp;
;  ULONGLONG     OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
;} MIB_TCP6ROW_OWNER_MODULE, *PMIB_TCP6ROW_OWNER_MODULE;
 
MIB_TCP6ROW_OWNER_MODULE STRUCT
	ucLocalAddr     UCHAR	16 dup (?) 
	dwLocalScopeId	DWORD	?
	dwLocalPort     DWORD	?
	ucRemoteAddr	UCHAR	16 dup (?)
	dwRemoteScopeId	DWORD	?
	dwRemotePort	DWORD	?
	dwState	        DWORD	?
	dwOwningPid     DWORD	?
	liCreateTimestamp	LARGE_INTEGER <>
	OwningModuleInfo	ULONGLONG	TCPIP_OWNING_MODULE_SIZE dup(?)
MIB_TCP6ROW_OWNER_MODULE ENDS

PMIB_TCP6ROW_OWNER_MODULE typedef ptr MIB_TCP6ROW_OWNER_MODULE

;typedef struct _MIB_TCP6TABLE_OWNER_MODULE {
;  DWORD                    dwNumEntries;
;  MIB_TCP6ROW_OWNER_MODULE table[ANY_SIZE];
;} MIB_TCP6TABLE_OWNER_MODULE, *PMIB_TCP6TABLE_OWNER_MODULE;
 
MIB_TCP6TABLE_OWNER_MODULE STRUCT
	dwNumEntries DWORD	?
    table        MIB_TCP6ROW_OWNER_MODULE ANY_SIZE dup(<?>)
MIB_TCP6TABLE_OWNER_MODULE ENDS 

PMIB_TCP6TABLE_OWNER_MODULE typedef ptr MIB_TCP6TABLE_OWNER_MODULE

但是程序代码在汇编时出错:

error A2181: initializer must be a string or single item

解决MASM32代码汇编出错: error A2181: initializer must be a string or single item_MASM32

第175行代码就位于MIB_TCP6TABLE_OWNER_MODULE 结构体定义代码中:

MIB_TCP6TABLE_OWNER_MODULE STRUCT                          ;173
	dwNumEntries DWORD	?                                   ;174
    table        MIB_TCP6ROW_OWNER_MODULE ANY_SIZE dup(<?>) ;175
MIB_TCP6TABLE_OWNER_MODULE ENDS                             ;176

这个定义 与 MASM32编写TcpStatC再进阶 显示PID和对应进程说明符 中的

 
MIB_TCPTABLE_OWNER_MODULE struct
    dwNumEntries DWORD ?
    table        MIB_TCPROW_OWNER_MODULE ANY_SIZE dup(<?>)
MIB_TCPTABLE_OWNER_MODULE ends

是类似的,所以先检查了MIB_TCP6ROW_OWNER_MODULE 结构体代码定义,没有发现问题。

估计问题还是出在

table        MIB_TCPROW_OWNER_MODULE ANY_SIZE dup(<?>)

这行代码本身。结构体一般有多个成员, 初始值 <?> 这种写法,用一个?号可能不妥。

于是把代码改成

table        MIB_TCPROW_OWNER_MODULE ANY_SIZE dup(<>)

这次代码顺利汇编完成。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

BFbkpSjOcvWq