最近用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 STRUCTucLocalAddr 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 ENDSPMIB_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 STRUCTdwNumEntries 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
第175行代码就位于MIB_TCP6TABLE_OWNER_MODULE 结构体定义代码中:
MIB_TCP6TABLE_OWNER_MODULE STRUCT ;173dwNumEntries DWORD ? ;174table MIB_TCP6ROW_OWNER_MODULE ANY_SIZE dup(<?>) ;175
MIB_TCP6TABLE_OWNER_MODULE ENDS ;176
这个定义 与 MASM32编写TcpStatC再进阶 显示PID和对应进程说明符 中的
MIB_TCPTABLE_OWNER_MODULE structdwNumEntries 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(<>)
这次代码顺利汇编完成