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

清疚 2024-03-24 22:24 136阅读 0赞

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

  1. typedef struct _MIB_TCP6ROW_OWNER_MODULE {
  2. UCHAR ucLocalAddr[16];
  3. DWORD dwLocalScopeId;
  4. DWORD dwLocalPort;
  5. UCHAR ucRemoteAddr[16];
  6. DWORD dwRemoteScopeId;
  7. DWORD dwRemotePort;
  8. DWORD dwState;
  9. DWORD dwOwningPid;
  10. LARGE_INTEGER liCreateTimestamp;
  11. ULONGLONG OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
  12. } MIB_TCP6ROW_OWNER_MODULE, *PMIB_TCP6ROW_OWNER_MODULE;

  1. typedef struct _MIB_TCP6TABLE_OWNER_MODULE {
  2. DWORD dwNumEntries;
  3. MIB_TCP6ROW_OWNER_MODULE table[ANY_SIZE];
  4. } MIB_TCP6TABLE_OWNER_MODULE, *PMIB_TCP6TABLE_OWNER_MODULE;

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

将它们转换为MASM32的定义:

  1. ;typedef struct _MIB_TCP6ROW_OWNER_MODULE {
  2. ; UCHAR ucLocalAddr[16];
  3. ; DWORD dwLocalScopeId;
  4. ; DWORD dwLocalPort;
  5. ; UCHAR ucRemoteAddr[16];
  6. ; DWORD dwRemoteScopeId;
  7. ; DWORD dwRemotePort;
  8. ; DWORD dwState;
  9. ; DWORD dwOwningPid;
  10. ; LARGE_INTEGER liCreateTimestamp;
  11. ; ULONGLONG OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
  12. ;} MIB_TCP6ROW_OWNER_MODULE, *PMIB_TCP6ROW_OWNER_MODULE;
  13. MIB_TCP6ROW_OWNER_MODULE STRUCT
  14. ucLocalAddr UCHAR 16 dup (?)
  15. dwLocalScopeId DWORD ?
  16. dwLocalPort DWORD ?
  17. ucRemoteAddr UCHAR 16 dup (?)
  18. dwRemoteScopeId DWORD ?
  19. dwRemotePort DWORD ?
  20. dwState DWORD ?
  21. dwOwningPid DWORD ?
  22. liCreateTimestamp LARGE_INTEGER <>
  23. OwningModuleInfo ULONGLONG TCPIP_OWNING_MODULE_SIZE dup(?)
  24. MIB_TCP6ROW_OWNER_MODULE ENDS
  25. PMIB_TCP6ROW_OWNER_MODULE typedef ptr MIB_TCP6ROW_OWNER_MODULE
  26. ;typedef struct _MIB_TCP6TABLE_OWNER_MODULE {
  27. ; DWORD dwNumEntries;
  28. ; MIB_TCP6ROW_OWNER_MODULE table[ANY_SIZE];
  29. ;} MIB_TCP6TABLE_OWNER_MODULE, *PMIB_TCP6TABLE_OWNER_MODULE;
  30. MIB_TCP6TABLE_OWNER_MODULE STRUCT
  31. dwNumEntries DWORD ?
  32. table MIB_TCP6ROW_OWNER_MODULE ANY_SIZE dup(<?>)
  33. MIB_TCP6TABLE_OWNER_MODULE ENDS
  34. PMIB_TCP6TABLE_OWNER_MODULE typedef ptr MIB_TCP6TABLE_OWNER_MODULE

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

error A2181: initializer must be a string or single item

f3f05533b97041d9aced1abd7addaa4c.jpeg

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

  1. MIB_TCP6TABLE_OWNER_MODULE STRUCT ;173
  2. dwNumEntries DWORD ? ;174
  3. table MIB_TCP6ROW_OWNER_MODULE ANY_SIZE dup(<?>) ;175
  4. MIB_TCP6TABLE_OWNER_MODULE ENDS ;176

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

  1. MIB_TCPTABLE_OWNER_MODULE struct
  2. dwNumEntries DWORD ?
  3. table MIB_TCPROW_OWNER_MODULE ANY_SIZE dup(<?>)
  4. MIB_TCPTABLE_OWNER_MODULE ends

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

估计问题还是出在

  1. table MIB_TCPROW_OWNER_MODULE ANY_SIZE dup(<?>)

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

于是把代码改成

  1. table MIB_TCPROW_OWNER_MODULE ANY_SIZE dup(<>)

这次代码顺利汇编完成

发表评论

表情:
评论列表 (有 0 条评论,136人围观)

还没有评论,来说两句吧...

相关阅读