//adapter 适配器 import win.reg; namespace inet.adapter ::IpHlpApi := ..raw.loadDll("IPHlpApi.dll") GetAdaptersInfo = ::IpHlpApi.api("GetAdaptersInfo","int(pointer info,int& size)") var IP_ADDR_STRING; IP_ADDR_STRING = class{ pointer next; byte ipAddress[16]; byte ipMask[16]; int context; getNextIpAddrString = function(){ if( owner.next ){ var addr = IP_ADDR_STRING(); ..raw.convert(owner.next,addr ); addr._string_str(); return addr,addr.ipAddress; } }; eachAddress = function(){ return function(cur){ if( !cur ) return owner,owner.ipAddress; return cur.getNextIpAddrString(); },owner }; _string_str = function(){ owner.ipAddress = ..string.str(owner.ipAddress ) owner.ipMask = ..string.str(owner.ipMask ) } } IP_ADAPTER_INFO = class{ pointer next; int comboIndex; byte adapterName[260]; byte description[132]; INT addressLength; byte address[8]; INT index; INT type; INT dhcpEnabled; pointer currentIpAddress; struct ipAddressList = IP_ADDR_STRING(); struct gatewayList = IP_ADDR_STRING(); struct dhcpServer = IP_ADDR_STRING(); int haveWins; struct primaryWinsServer = IP_ADDR_STRING(); struct secondaryWinsServer = IP_ADDR_STRING(); int leaseObtained; int leaseExpires; @_meta; } IP_ADAPTER_INFO._meta = { _get = { eachAddress = function(){ return owner.ipAddressList.eachAddress() }; eachGateway = function(){ return owner.gatewayList.eachAddress() }; eachDhcpServer = function(){ return owner.dhcpServer.eachAddress() }; } } //迭代遍历所有网卡 each = function(){ var ret,size = GetAdaptersInfo( ,0 ); if( ret != 111/*ERROR_BUFFER_OVERFLOW*/ ) return function(){ }; var pBuf = ..raw.buffer( size ); ret = GetAdaptersInfo(pBuf,size) if( ret ) error(..string.format("GetAdaptersInfo Faild! errCode:%0x",ret) ,2 ) var ptr = pBuf; return function(){ if( !ptr){ pBuf = null; return null; } var info = IP_ADAPTER_INFO(); ..raw.convert(ptr,info); info.mac = ..string.format("%02X-%02X-%02X-%02X-%02X-%02X", info.address[1], info.address[2], info.address[3], info.address[4], info.address[5], info.address[6] ) info.adapterName = ..string.str(info.adapterName) info.description = ..string.str(info.description) info.ipAddressList._string_str() info.gatewayList._string_str() info.dhcpServer._string_str() if(info.haveWins){ info.primaryWinsServer._string_str() info.secondaryWinsServer._string_str() } var reg = ..win.reg("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\"+info.adapterName+"\Connection",true); if(reg){ info.pnpInstanceId = reg.queryValue("PnPInstanceId"); info.netConnectionId = reg.queryValue("Name"); reg.close(); } ptr = pBuf;//for gc; ptr = info.next; return info; }; } get = function(name){ for adpt in each(){ if(adpt.adapterName == name){ return adpt; } } } /**intellisense() inet.adapter = 用于获取网络适配器信息(不含禁用的网卡与回环网卡)\n\ninet.adapterAddresses 可以得到更多信息。\nsys.networkCards 取网卡硬件信息(含禁用的网卡)。\n\n可使用 com.wmi 查询 Win32_NetworkAdapter 得到网卡信息,\n com.wmi 查询 Win32_NetworkAdapterConfiguration 得到网络适配器连接配置 inet.adapter.each() = @//遍历所有连接\nfor adptInfo in inet.adapter.each() { \n __/*adptInfo 为网络连接信息*/\n}\n!net_adptInfo. inet.adapter.get( = 查找并返回网络适配器与配置信息 inet.adapter.get(.(adapterName) = 查找并返回网络适配器与配置信息。\n@adapterName 用字符串指定 GUID 格式适配器 inet.adapter.get() = !net_adptInfo. !net_adptInfo.mac = MAC地址,文本格式 !net_adptInfo.address = MAC地址,数值格式 !net_adptInfo.pnpInstanceId = 设备实例 ID,由"设备ID\实例ID"组成,\n设备实例 ID用于 process.devcon 作为参数时前面要添加@ !net_adptInfo.netConnectionId = 网络连接名 !net_adptInfo.adapterName = 网卡名称 !net_adptInfo.description = 网卡描述 !net_adptInfo.addressLength = 网卡地址长度 !net_adptInfo.index = 网络接口索引号 !net_adptInfo.type = 网络接口类型\n例如 _MIB_IF_TYPE_ETHERNET !net_adptInfo.dhcpEnabled = 是否启用DHCP !net_adptInfo.haveWins = 是否启动了Wins服务 !net_adptInfo.leaseObtained = DHCP租赁时间 !net_adptInfo.leaseExpires = DHCP租赁失效时间 !net_adptInfo.ipAddressList = !ipaddr_string. !net_adptInfo.gatewayList = !ipaddr_string. !net_adptInfo.dhcpServer = !ipaddr_string. !net_adptInfo.primaryWinsServer = !ipaddr_string. !net_adptInfo.secondaryWinsServer = !ipaddr_string. !net_adptInfo.eachAddress() = @for addr,strAddr in ??.eachAddress(){ __/*遍历 IP 地址,strAddr 为字符串格式 IP 地址。\naddr 为当前 IP_ADAPTER_INFO 结构体,不用管。*/ } !net_adptInfo.eachGateway() = @for addr,strAddr in ??.eachGateway(){ __/*遍历网关地址,strAddr 为字符串格式 IP 地址。\naddr 为当前 IP_ADAPTER_INFO 结构体,不用管。*/ } !net_adptInfo.eachDhcpServer() = @for addr,strAddr in ??.eachDhcpServer(){ __/*遍历 DHCP 服务器地址,strAddr 为字符串格式 IP 地址。\naddr 为当前 IP_ADAPTER_INFO 结构体,不用管。*/ } !ipaddr_string.getNextIpAddrString() = 获取下一个IP地址\n!ipaddr_string. !ipaddr_string.eachAddress() = 遍历IP列表\n!ipaddr_string. !ipaddr_string.ipAddress = IP地址 !ipaddr_string.ipMask = 掩码 !ipaddr_string.context = _MIB_IF_TYPE_OTHER=@1/*_MIB_IF_TYPE_OTHER*/ _MIB_IF_TYPE_ETHERNET=@6/*_MIB_IF_TYPE_ETHERNET*/ _MIB_IF_TYPE_TOKENRING=@9/*_MIB_IF_TYPE_TOKENRING*/ _MIB_IF_TYPE_FDDI=@0xF/*_MIB_IF_TYPE_FDDI*/ _MIB_IF_TYPE_PPP=@0x17/*_MIB_IF_TYPE_PPP*/ _MIB_IF_TYPE_LOOPBACK=@0x18/*_MIB_IF_TYPE_LOOPBACK*/ _MIB_IF_TYPE_SLIP=@0x1C/*_MIB_IF_TYPE_SLIP*/ _IF_TYPE_IEEE80211=@71/*_IF_TYPE_IEEE80211*/ end intellisense**/