您的位置:首页 > 其它

枚举当前系统网卡

2008-08-18 23:23 197 查看
导读:
  By LooL
  GetAdaptersInfo功能返回当前电脑上的网络适配器信息
  DWORDGetAdaptersInfo(
  PIP_ADAPTER_INFOpAdapterInfo,// 存放返回数据的缓冲
  PULONGpOutBufLen// 返回数据的大小
  )
  Parameters
  pAdapterInfo
  [输出] 指向一个缓冲区,缓冲区中存放的是 IP_ADAPTER_INFO结构组成的链表
  pOutBufLen
  [输入] 指向一个 ULONG 变量,给出存放pAdapterInfo链表缓冲区大小。如果输入时给出的缓冲区比输出需求的小,则返回需要的大小,并返回ERROR_BUFFER_OVERFLOW错误
  关于IP_ADAPTER_INFO结构
  IP_ADAPTER_INFOSTRUCT DWORD
  Next dd ? ;指向下一个IP_ADAPTER_INFO结构
  ComboIndex dd ? ;保留
  AdapterName db MAX_ADAPTER_NAME_LENGTH + 4 dup (?)
  ;适配器名称
  Description db MAX_ADAPTER_DESCRIPTION_LENGTH + 4 dup (?)
  ;适配器描述符
  AddressLength dd ? ;适配器硬件地址描述符长度
  Address db MAX_ADAPTER_ADDRESS_LENGTH dup (?)
  ;适配器硬件地址描述符
  Index dd ? ;适配器编号
  uType dd ? ;适配器类型
  DhcpEnabled dd ? ;HDCP可用否
  CurrentIpAddress dd ? ;保留(注意,这里不是当前IP地址)
  IpAddressList IP_ADDR_STRING ;IP地址
  GatewayList IP_ADDR_STRING ;GateWay地址
  DhcpServer IP_ADDR_STRING ;DHCP地址
  HaveWins dd ? ;是否有Wins
  PrimaryWinsServer IP_ADDR_STRING ;首选Win Ip地址
  SecondaryWinsServer IP_ADDR_STRING ;备用Win IP地址
  LeaseObtained dd ? ;HDCP获得日期时间
  LeaseExpires dd ? ;HDCP过期日期时间
  IP_ADAPTER_INFOENDS
  需要说明的是 IpAddressList IP_ADDR_STRING 在IPv4下一个适配器可以有多个IP地址
  IP_ADDR_STRINGSTRUCT
  Next dd ? ;ptr to IP_ADDR_STRING
  IpAddress IP_ADDRESS_STRING <4*4 dup (?)>
  IpMask IP_MASK_STRING <>
  Context dd ?
  IP_ADDR_STRING ENDS
  存放标准的IP地址,xxx.xxx.xxx.xxx
  IP_ADDRESS_STRINGSTRUCT
  String db 4*4 dup (?)
  IP_ADDRESS_STRING ENDS
  #Mode=CON
  .386
  .model flat, stdcall
  option casemap :none
  include windows.inc
  include user32.inc
  include kernel32.inc
  include masm32.inc
  includelib user32.lib
  includelib kernel32.lib
  includelib masm32.lib
  include macro.asm
  includelib iphlpapi.lib
  include iphlpapi.inc
  .data?
  lenBuffer dd ?
  pAdapterBuffer dd ?
  buffer db 100 dup(?)
  .data
  szNextLine db 0Ah,0Dh,0Ah,0Dh,0
  .CODE
  START:
  mov lenBuffer, 1 ;给一个很小的buffer长度
  
  invoke GetAdaptersInfo, addr buffer, addr lenBuffer
  .IF eax==ERROR_NO_DATA
  jmp @no_data
  .ELSEIF eax==ERROR_BUFFER_OVERFLOW
  ;返回真正需要的大小在 lenBuffer
  invoke GlobalAlloc, GMEM_FIXED or GMEM_ZEROINIT, lenBuffer
  ;申请一块lenBuffer大小的空间
  mov pAdapterBuffer, eax
  .ELSE
  jmp @error
  .ENDIF
  
  ;--- Get adapter info in real buffer ---
  invoke GetAdaptersInfo, pAdapterBuffer, addr lenBuffer
  .IF eax==ERROR_NO_DATA
  jmp @no_data
  .ELSEIF eax!=ERROR_SUCCESS
  jmp @error
  .ENDIF
  
  ;遍历返回信息的结构体
  mov edi, pAdapterBuffer
  assume edi:PTR IP_ADAPTER_INFO
  .WHILE edi
  invoke wsprintf,addr buffer, CTXT("适配器名称: %s %s"),addr [edi].AdapterName,addr szNextLine
  invoke StdOut,addr buffer
  
  lea esi, [edi].IpAddressList ;取这个结构体的地址
  ;注意这里是一个结构体,
  ;而不是指向一个结构体的指针
  ;具体的可以在这里输出esi看看它的地址,再输出GatewayList
  ;项的地址就明白了
  
  .WHILE esi
  invoke wsprintf,addr buffer,CTXT("适配器 IP : %s %s"),addr (IP_ADDR_STRING PTR [esi]).IpAddress,addr szNextLine
  invoke StdOut,addr buffer
  mov esi, (IP_ADDR_STRING PTR [esi]).Next
  .ENDW
  
  mov edi, [edi].Next ;指向下一个适配器
  .ENDW
  assume edi:nothing
  
  invoke GlobalFree, pAdapterBuffer
  @no_data:
  @error:
  
  ;暂停显示,回车键关闭
  invoke StdIn,addr buffer,sizeof buffer
  invoke ExitProcess,0
  end START
  运行结果:
  XP/Vista 还支持一个更新的API GetAdaptersAddresses Function,这个调用的参数都是64位的,现在我还不知道如何调用,如果有朋友知道不妨拿出来一起讨论。
  参考:
  1. 本文程序改编自 http://www.madwizard.org/view.php?page=downloads中adapterinfo_beta.rar程序;
  2. GetAdaptersInfo API的更具体说明请参考MSDN http://msdn2.microsoft.com/en-us/library/aa365917.aspx

本文转自
http://www.aogosoft.com/downpage.asp?mode=viewtext&id=160
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: