导读:
By LooL
GetAdaptersInfo功能返回当前电脑上的网络适配器信息
DWORD GetAdaptersInfo(
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
By LooL
GetAdaptersInfo功能返回当前电脑上的网络适配器信息
DWORD GetAdaptersInfo(
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