LAN info - Windows only

Share your advanced PureBasic knowledge/code with the community.
User avatar
doctorized
Addict
Addict
Posts: 856
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: LAN info - Windows only

Post by doctorized »

Now I saw all your posts. Yes, I have one LAN card on every pc I tested the code. Now that I know what is going on I have my way to find the solution. Sorry for posting a code that is not functional. I will fix it ASAP.
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Re: LAN info - Windows only

Post by ts-soft »

You can create a virtual lancard with virtualbox or vmware to see what happens.
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
User avatar
doctorized
Addict
Addict
Posts: 856
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: LAN info - Windows only

Post by doctorized »

I made some changes and now shows correctly my two lan cards. Test it and tell me if it works for you.
Some improvements must be done, the code is a little strange, as infratec said, because it comes from an old VB project.

Code: Select all

#MIB_IF_TYPE_OTHER = 1
#MIB_IF_TYPE_ETHERNET = 6
#MIB_IF_TYPE_TOKENRING = 9
#MIB_IF_TYPE_FDDI = 15
#MIB_IF_TYPE_PPP = 23
#MIB_IF_TYPE_LOOPBACK = 24
#MIB_IF_TYPE_SLIP = 28

#MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0
#MIB_IF_OPER_STATUS_UNREACHABLE = 1
#MIB_IF_OPER_STATUS_DISCONNECTED = 2
#MIB_IF_OPER_STATUS_CONNECTING = 3
#MIB_IF_OPER_STATUS_CONNECTED = 4
#MIB_IF_OPER_STATUS_OPERATIONAL = 5

#BROADCAST_NODETYPE = 1
#PEER_TO_PEER_NODETYPE = 2
#MIXED_NODETYPE = 4
#HYBRID_NODETYPE = 8

Structure IP_ADDR_STRING1
    NextAdapter.i
    IpAddress.a[16];IP_ADDRESS_STRING
    IpMask.a[16];IP_ADDRESS_STRING
    Context.i
 EndStructure
 
 Structure FIXED_INFO1
    HostName.a[132]            ;MAX_HOSTNAME_LEN + 4
    DomainName.a[132]         ;MAX_DOMAIN_NAME_LEN + 4
    CurrentDnsServer.i
    DnsServerList.IP_ADDR_STRING1
    NodeType.l
    ScopeId.a[260]             ;MAX_SCOPE_ID_LEN + 4
    EnableRouting.l
    EnableProxy.l
    EnableDns.l
 EndStructure
 
Structure IP_ADAPTER_INFO1
    NextAdapter.i
    ComboIndex.l
    AdapterName.a[260] ;MAX_ADAPTER_NAME_LENGTH + 4
    Description.a[132] ;MAX_ADAPTER_DESCRIPTION_LENGTH + 4
    AddressLength.l
    Address.a[8] ;MAX_ADAPTER_ADDRESS_LENGTH
    index.l
    Type.l
    DhcpEnabled.i
    CurrentIpAddress.i
    IpAddressList.IP_ADDR_STRING1
    GatewayList.IP_ADDR_STRING1
    DhcpServer.IP_ADDR_STRING1
    HaveWINS.i
    PrimaryWinsServer.IP_ADDR_STRING1
    SecondaryWinsServer.IP_ADDR_STRING1
    LeaseObtained.i
    LeaseExpires.i
 EndStructure
 
 Structure MIB_IFROW
    wszName.a[512] ;MAX_INTERFACE_NAME_LEN * 2
    dwIndex.l
    dwType.l
    dwMtu.l
    dwSpeed.l
    dwPhysAddrLen.l
    bPhysAddr.a[8] ;MAXLEN_PHYSADDR
    dwAdminStatus.l
    dwOperStatus.l
    dwLastChange.l
    dwInOctets.l
    dwInUcastPkts.l
    dwInNUcastPkts.l
    dwInDiscards.l
    dwInErrors.l
    dwInUnknownProtos.l
    dwOutOctets.l
    dwOutUcastPkts.l
    dwOutNUcastPkts.l
    dwOutDiscards.l
    dwOutErrors.l
    dwOutQLen.l
    dwDescrLen.l
    bDescr.a[256] ;MAXLEN_IFDESCR
EndStructure

Structure MIB_IFTABLE1
    dwNumEntries.l
    table.MIB_IFROW[50]
 EndStructure
 
Structure NetWorkInfo
index.l
HostName.s
DomainName.s
DNSIPAdd.s[11]
nod.s
ScopeID.s
DNSE.s
ProxyE.s
RoutE.s
Conx.s
AdapterName.s[11]
Type.s[11]
Speed.s[11]
sMTU.s[11]
packsS.s[11]
bytesS.s[11]
packsR.s[11]
bytesR.s[11]
status.s[11]
IPAddr.s[11]
SubMask.s[11]
Addr.s[11]
Indx.s[11]
DHCPE.s[11]
DHCPIPAddr.s[11]
DHCPIPMask.s[11]
DHCPLObt.s[11]
DHCPLExp.s[11]
GateIPAddress.s[11]
GateIPMask.s[11]
HaveWINS.s[11]
PWINSIPAddress.s[11]
PWINSIPMask.s[11]
SWINSIPAddress.s[11]
SWINSIPMask.s[11]
EndStructure

Global MIB_IFTABLE.MIB_IFTABLE1
 Global Dim IP_ADAPTER_INFO.IP_ADAPTER_INFO1(1)
 Global NewList NICs.s()
 Global GroupDemicals.s = ","
 Global GroupThousands.s = "."
 Global LANInfo.NetWorkInfo
 
 Procedure.d int32_uint32(lValue.l)
int32uint32.l
    If lValue < 0
        int32uint32 = lValue + $100000000
    Else
        int32uint32 = lValue
    EndIf
    ProcedureReturn int32uint32
 EndProcedure
 
 Procedure.s c2str(num.d, demical.l=0)
ProcedureReturn ReplaceString(StrD(num,demical), ".", GroupDemicals)
EndProcedure

Procedure.s FormatByteSize(n.q)
  Protected s.s=Str(n)
  Protected len=Len(s)
  Protected ret.s
 
  For i=0 To len-1
    If i And Not i%3 : ret="." + ret : EndIf; "." is the greek symbol for separating thousands. Use your own.
    ret= Mid(s,len-i,1) +ret
  Next
 
  ProcedureReturn ret
EndProcedure

Procedure.s SpaceDivider(space.q)
tm.s:mt.d=space
If mt>1000: mt / 1024:tm = " KB":EndIf
If mt>1000: mt / 1024:tm = " MB":EndIf
If mt>1000: mt / 1024:tm = " GB":EndIf
If mt>1000: mt / 1024:tm = " TB":EndIf
ProcedureReturn ReplaceString(StrD(mt,3), ".", GroupDemicals) + tm
EndProcedure

Procedure LAN()
hMod.i = LoadLibrary_("iphlpapi.dll")
FuncName.s = Space(60)
PokeS(@FuncName,"GetAdaptersInfo",-1,#PB_Ascii)
If GetProcAddress_(hMod, FuncName) <> 0 
	;lBufferLength.l = SizeOf(IP_ADAPTER_INFO1)
	lErrors = GetAdaptersInfo_(0, @lBufferLength)
	ReDim IP_ADAPTER_INFO.IP_ADAPTER_INFO1(19);(lBufferLength/SizeOf(IP_ADAPTER_INFO1))
	lErrors = GetAdaptersInfo_(@IP_ADAPTER_INFO(0), @lBufferLength)
	If lErrors <> #ERROR_SUCCESS: MessageRequester("Error","GetAdaptersInfo_() error."): ProcedureReturn: EndIf
	lBufferPos.l
	;ShowMemoryViewer(@IP_ADAPTER_INFO(0),SizeOf(IP_ADAPTER_INFO1)*18)
	For i=0 To 100
		;Debug PeekS(@IP_ADAPTER_INFO(i)\Description,-1,#PB_Ascii)
		LANInfo\AdapterName[AdapterCount] = PeekS(@IP_ADAPTER_INFO(i)\Description,-1,#PB_Ascii)
		lBufferPos = lBufferPos + SizeOf(IP_ADAPTER_INFO1)
		If lBufferPos < lBufferLength 
			AdapterCount + 1
		Else
			Break
		EndIf
	Next
Else
	MessageRequester("error","Could not connect with 'iphlpapi.dll'.")
	ProcedureReturn
EndIf
AdapterCount.i
tmp.s
tmp2.d
FuncName = Space(60)
PokeS(@FuncName,"GetIfTable",-1,#PB_Ascii)
If GetProcAddress_(hMod, FuncName) <> 0  ;for speed and status
lSize = SizeOf(MIB_IFTABLE1)
lErrors = GetIfTable_(@MIB_IFTABLE, @lSize, 0)
EndIf
;Debug "MIB_IFTABLE\dwNumEntries = " + Str(MIB_IFTABLE\dwNumEntries)
;For i=0 To MIB_IFTABLE\dwNumEntries
;	Debug PeekS(@MIB_IFTABLE\table[i]\wszName,-1,#PB_Unicode)
;	Debug MIB_IFTABLE\table[i]\dwMtu
;Next
;ShowMemoryViewer(@MIB_IFTABLE,SizeOf(MIB_IFTABLE1))
FuncName = Space(60)
PokeS(@FuncName,"GetNetworkParams",-1,#PB_Ascii)
If GetProcAddress_(hMod, FuncName) <> 0 
	xx = 0
	Dim FIXED_INFO.FIXED_INFO1(9)
	lBufferLength = SizeOf(FIXED_INFO1)*9
	lErrors = GetNetworkParams_(@FIXED_INFO(), @lBufferLength)
	For i=0 To 9
		With FIXED_INFO(i)
			If \HostName = 0:Break:EndIf
		IP_ADDR_STRING.IP_ADDR_STRING1
		LANInfo\HostName = PeekS(@\Hostname,-1,#PB_Ascii)
		LANInfo\DomainName = PeekS(@\DomainName,-1,#PB_Ascii)
		If \EnableDns = 1:  LANInfo\DNSE = "Yes": Else: LANInfo\DNSE = "No": EndIf
		LANInfo\DNSIPAdd[xx] = PeekS(@\DnsServerList\IpAddress,-1,#PB_Ascii)
		lNext.l = \DnsServerList\NextAdapter
		While aa.l=0
			If lNext <> 0 
				If IsBadReadPtr_(lNext, SizeOf(IP_ADDR_STRING1)) = #False
					MoveMemory(@lNext, @IP_ADDR_STRING, SizeOf(IP_ADDR_STRING1))
				EndIf
				If lNext <> IP_ADDR_STRING\NextAdapter 
					lNext = IP_ADDR_STRING\NextAdapter
					xx = xx + 1
					LANInfo\DNSIPAdd[xx] = PeekS(@IP_ADDR_STRING\IpAddress[0],-1,#PB_Ascii)
				Else
					aa=1
				EndIf
			Else
				aa=1
			EndIf
		Wend
		Select \NodeType
			Case #BROADCAST_NODETYPE: LANInfo\nod = "Broadcast"
			Case #PEER_TO_PEER_NODETYPE: LANInfo\nod = "Peer To Peer"
			Case #MIXED_NODETYPE: LANInfo\nod = "Mixed"
			Case #HYBRID_NODETYPE: LANInfo\nod = "Hybrid"
			Default: LANInfo\nod = "Unknown " + Str(\NodeType)
		EndSelect
		LANInfo\ScopeID = ReplaceString(PeekS(@\ScopeId[0],-1,#PB_Ascii), Chr(0), "")
		If \EnableProxy = 1: LANInfo\ProxyE = "Yes": Else: LANInfo\ProxyE = "No": EndIf
		If \EnableRouting = 1:  LANInfo\RoutE = "Yes": Else: LANInfo\RoutE = "No": EndIf
	EndWith
	Next
Else
	MessageRequester("error","GetNetworkParams not found")
EndIf
For i = 0 To AdapterCount
	With IP_ADAPTER_INFO(i)
		Select \Type
		   Case #MIB_IF_TYPE_OTHER: LANInfo\Type[i] = "Other"
		   Case #MIB_IF_TYPE_ETHERNET: LANInfo\Type[i] = "Ethernet"
		   Case #MIB_IF_TYPE_TOKENRING: LANInfo\Type[i] = "Tokenring"
		   Case #MIB_IF_TYPE_FDDI: LANInfo\Type[i] = "FDDI"
		   Case #MIB_IF_TYPE_PPP: LANInfo\Type[i] = "PPP"
		   Case #MIB_IF_TYPE_LOOPBACK: LANInfo\Type[i] = "Loopback"
		   Case #MIB_IF_TYPE_SLIP: LANInfo\Type[i] = "Slip"
		   Default: LANInfo\Type[i] = "Unknown " + Str(\Type)
		EndSelect
		For ii = 0 To 20
			If PeekS(@MIB_IFTABLE\table[ii]\bDescr,-1,#PB_Ascii) = LANInfo\AdapterName[i]
				tmp2 = int32_uint32(MIB_IFTABLE\table[ii]\dwSpeed): tmp = " bit"
				If tmp2 >= 1000:  tmp2 = tmp2 / 1000: tmp = " Kbit":EndIf
				If tmp2 >= 1000:  tmp2 = tmp2 / 1000: tmp = " Mbit": EndIf
				If tmp2 >= 1000:  tmp2 = tmp2 / 1000: tmp = " Gbit": EndIf
				LANInfo\Speed[i] = c2str(tmp2,2) + tmp
				LANInfo\sMTU[i] = Str(MIB_IFTABLE\table[ii]\dwMtu) + " bytes"
				LANInfo\packsS[i] = FormatByteSize(MIB_IFTABLE\table[ii]\dwOutNUcastPkts + MIB_IFTABLE\table[ii]\dwOutUcastPkts)
				
				tmp = FormatByteSize(MIB_IFTABLE\table[ii]\dwOutOctets)
				If tmp = "":  tmp = "0": EndIf
				If MIB_IFTABLE\table[ii]\dwOutOctets > 1024
					tmp + "  ( " + SpaceDivider(MIB_IFTABLE\table[ii]\dwOutOctets) + " )"
					If Right(tmp,6) = GroupDemicals + "000 )":tmp=Left(tmp,Len(tmp)-6) + " )": EndIf
				EndIf
				LANInfo\bytesS[i] = tmp
				LANInfo\packsR[i] = FormatByteSize(MIB_IFTABLE\table[ii]\dwInNUcastPkts + MIB_IFTABLE\table[ii]\dwInUcastPkts)
		
				tmp = FormatByteSize(MIB_IFTABLE\table[ii]\dwInOctets)
				If tmp = "":  tmp = "0": EndIf
				If (MIB_IFTABLE\table[ii]\dwInOctets & $FFFFFFFF) > 1024
					tmp + "  ( " + SpaceDivider(MIB_IFTABLE\table[ii]\dwInOctets) + " )"
					If Right(tmp,6) = GroupDemicals + "000 )":tmp=Left(tmp,Len(tmp)-6) + " )": EndIf
				EndIf
				LANInfo\bytesR[i] = tmp
				
				Select MIB_IFTABLE\table[ii]\dwOperStatus
		    		Case #MIB_IF_OPER_STATUS_NON_OPERATIONAL: LANInfo\status[i] = "Non operational"
		    		Case #MIB_IF_OPER_STATUS_UNREACHABLE: LANInfo\status[i] = "Unreachable"
		    		Case #MIB_IF_OPER_STATUS_DISCONNECTED: LANInfo\status[i] = "Disconnected"
		    		Case #MIB_IF_OPER_STATUS_CONNECTING: LANInfo\status[i] = "Connecting"
		    		Case #MIB_IF_OPER_STATUS_CONNECTED: LANInfo\status[i] = "Connected"
		    		Case #MIB_IF_OPER_STATUS_OPERATIONAL: LANInfo\status[i] = "Operational"
		    		Default: LANInfo\status[i] = "Unknown " + c2str(int32_uint32(MIB_IFTABLE\table[ii]\dwOperStatus),0)
				EndSelect
				Break
			EndIf
		Next
	
		LANInfo\IPAddr[i] = PeekS(@\IpAddressList\IpAddress,-1,#PB_Ascii)
		LANInfo\SubMask[i] = PeekS(@\IpAddressList\IpMask,-1,#PB_Ascii)
		tmp = ""
		If Len(PeekS(@\AdapterName,-1,#PB_Ascii)) >= \AddressLength
		   For lIncrement.l = 0 To \AddressLength-1
		       tmp = tmp + RSet(Hex(\Address[lIncrement] & $FF),2,"0")
		    Next lIncrement
		   tmp = RSet(tmp,12,"0")
		   tmp = Left(tmp, 2) + ":" + Mid(tmp, 3, 2) + ":" + Mid(tmp, 5, 2) + ":" + Mid(tmp, 7, 2) + ":" + Mid(tmp, 9, 2) + ":" + Mid(tmp, 11, 2)
		   LANInfo\Addr[i] = tmp
		EndIf
		LANInfo\Indx[i] = (c2str(int32_uint32(\Index),0))
		
		If \DhcpEnabled = 1:  LANInfo\DHCPE[i] = "Yes": Else: LANInfo\DHCPE[i] = "No": EndIf
		LANInfo\DHCPIPAddr[i] = PeekS(@\DhcpServer\IpAddress,-1,#PB_Ascii)
		LANInfo\DHCPIPMask[i] = PeekS(@\DhcpServer\IpMask,-1,#PB_Ascii)
		If \LeaseObtained > 10000 
		  tmp = FormatDate("%dd/%mm/%yyyy , %hh:%ii:%ss",AddDate( 1/1/1970,#PB_Date_Second, \LeaseObtained))
		  LANInfo\DHCPLObt[i] = FormatDate("%dd/%mm/%yyyy , %hh:%ii:%ss",AddDate( ParseDate("%dd/%mm/%yyyy , %hh:%ii:%ss",tmp),#PB_Date_Minute,-TZResult ))
		Else
			LANInfo\DHCPLObt[i] = "NotAvailable"
		EndIf
		If \LeaseExpires > 10000 
		  tmp = FormatDate("%dd/%mm/%yyyy , %hh:%ii:%ss",AddDate( 1/1/1970,#PB_Date_Second, \LeaseExpires))
		  LANInfo\DHCPLExp[i] = FormatDate("%dd/%mm/%yyyy , %hh:%ii:%ss",AddDate( ParseDate("%dd/%mm/%yyyy , %hh:%ii:%ss",tmp),#PB_Date_Minute,-TZResult))
		Else
			LANInfo\DHCPLExp[i] = "NotAvailable"
		EndIf
	   
		CopyMemory(@\IpAddressList,@IP_ADDR_STRING,SizeOf(IP_ADDR_STRING1))
		For ii=0 To 100
		   If IP_ADDR_STRING\NextAdapter <> 0 
		       If IsBadReadPtr_(@IP_ADDR_STRING\NextAdapter, SizeOf(IP_ADDR_STRING1)) = #False 
		           MoveMemory(@IP_ADDR_STRING\NextAdapter, @IP_ADDR_STRING, SizeOf(IP_ADDR_STRING1))
		       EndIf
		   Else
		       Break
		   EndIf
		   If bShutdown = #True: Break: EndIf
		Next
	  LANInfo\GateIPAddress[i] = PeekS(@\GatewayList\IpAddress,-1,#PB_Ascii)
	  LANInfo\GateIPMask[i] = PeekS(@\GatewayList\IpMask,-1,#PB_Ascii)
	  If \HaveWINS = 1:  LANInfo\HaveWINS[i] = "Yes": Else: LANInfo\HaveWINS[i] = "No": EndIf
	  LANInfo\PWINSIPAddress[i] = PeekS(@\PrimaryWinsServer\IpAddress,-1,#PB_Ascii)
	  LANInfo\PWINSIPMask[i] = PeekS(@\PrimaryWinsServer\IpMask,-1,#PB_Ascii)
	  LANInfo\SWINSIPAddress[i] = PeekS(@\SecondaryWinsServer\IpAddress,-1,#PB_Ascii)
	  LANInfo\SWINSIPMask[i] = PeekS(@\SecondaryWinsServer\IpMask,-1,#PB_Ascii)
	EndWith
Next
EndProcedure

If OpenWindow(0, 0, 0, 432, 510, "LAN", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 		ListIconGadget(0,5,5,422,500,"Element",200,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
 		AddGadgetColumn(0,1,"Data",200)
EndIf

LAN()
AddGadgetItem(0,-1,"Host  name"+Chr(10)+LANInfo\HostName)
AddGadgetItem(0,-1,"Domain  name"+Chr(10)+LANInfo\DomainName)
AddGadgetItem(0,-1,"DNS  enabled"+Chr(10)+LANInfo\DNSE)
For i=0 To 10
	If LANInfo\DNSIPAdd[i] <> ""
		AddGadgetItem(0,-1,"DNS  Server  IP  address  #" + Str(i+1)+Chr(10)+LANInfo\DNSIPAdd[i])
	EndIf
Next
AddGadgetItem(0,-1,"Node  type"+Chr(10)+LANInfo\nod)
AddGadgetItem(0,-1,"Scope  ID"+Chr(10)+LANInfo\ScopeID)
AddGadgetItem(0,-1,"WINS  Proxy  Enabled"+Chr(10)+LANInfo\ProxyE)
AddGadgetItem(0,-1,"IP  Routing  Enabled"+Chr(10)+LANInfo\RoutE)
For i=0 To 10
	If LANInfo\AdapterName[i] <> ""
		AddGadgetItem(0,-1,""+Chr(10)+"")
		AddGadgetItem(0,-1,"Connection  #"+Str(i+1)+Chr(10)+"")
		SetGadgetItemColor(0,CountGadgetItems(0)-1,#PB_Gadget_FrontColor,$906000,0)
		AddGadgetItem(0,-1,"Adapter  name"+Chr(10)+LANInfo\AdapterName[i])
		AddGadgetItem(0,-1,"Type"+Chr(10)+LANInfo\Type[i])
		AddGadgetItem(0,-1,"Speed"+Chr(10)+LANInfo\Speed[i])
		AddGadgetItem(0,-1,"Maximum  Transfer  Unit  Size  (MTU)"+Chr(10)+LANInfo\sMTU[i])
		AddGadgetItem(0,-1,"Packets  sent"+Chr(10)+LANInfo\packsS[i])
		AddGadgetItem(0,-1,"Bytes  sent"+Chr(10)+LANInfo\bytesS[i])
		AddGadgetItem(0,-1,"Packets  received"+Chr(10)+LANInfo\packsR[i])
		AddGadgetItem(0,-1,"Bytes  received"+Chr(10)+LANInfo\bytesR[i])
		AddGadgetItem(0,-1,"Status"+Chr(10)+LANInfo\status[i])
		AddGadgetItem(0,-1,"IP"+Chr(10)+LANInfo\IPAddr[i])
		AddGadgetItem(0,-1,"SubMask"+Chr(10)+LANInfo\SubMask[i])
		AddGadgetItem(0,-1,"Address"+Chr(10)+LANInfo\Addr[i])
		AddGadgetItem(0,-1,"Index"+Chr(10)+LANInfo\Indx[i])
		AddGadgetItem(0,-1,"DHCP  enabled"+Chr(10)+LANInfo\DHCPE[i])
		AddGadgetItem(0,-1,"DCHP  IP  address"+Chr(10)+LANInfo\DHCPIPAddr[i])
		AddGadgetItem(0,-1,"DCHP  IP  mask"+Chr(10)+LANInfo\DHCPIPMask[i])
		AddGadgetItem(0,-1,"DHCP lease obtained"+Chr(10)+LANInfo\DHCPLObt[i])
		AddGadgetItem(0,-1,"DHCP lease expires"+Chr(10)+LANInfo\DHCPLExp[i])
		AddGadgetItem(0,-1,"Gateway  IP  address"+Chr(10)+LANInfo\GateIPAddress[i])
		AddGadgetItem(0,-1,"Gateway  IP  mask"+Chr(10)+LANInfo\GateIPMask[i])
		AddGadgetItem(0,-1,"Have  WINS"+Chr(10)+LANInfo\HaveWINS[i])
		If LANInfo\HaveWINS[i] = "Yes"
			AddGadgetItem(0,-1,"Primary  WINS  Server  IP  address"+Chr(10)+LANInfo\PWINSIPAddress[i])
			AddGadgetItem(0,-1,"Primary  WINS  Server  IP  mask"+Chr(10)+LANInfo\PWINSIPMask[i])
			AddGadgetItem(0,-1,"Secondary  WINS  Server  IP  address"+Chr(10)+LANInfo\SWINSIPAddress[i])
			AddGadgetItem(0,-1,"Secondary  WINS  Server  IP  Mask"+Chr(10)+LANInfo\SWINSIPMask[i])
		EndIf
	EndIf
Next
	
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

End   
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Re: LAN info - Windows only

Post by ts-soft »

Image
This one works!
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
Gadget
User
User
Posts: 38
Joined: Tue Mar 11, 2014 8:11 pm
Location: UK

Re: LAN info - Windows only

Post by Gadget »

Works for me too
Windows 10 and PB 5.73 (both x64)
infratec
Always Here
Always Here
Posts: 6874
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: LAN info - Windows only

Post by infratec »

Hi,

'with a little help from my friends' I mananged to remove all fixed sizes.
Now it has 'no limits'

Code: Select all

;EnableExplicit

#GroupDemicals$ = ","
#GroupThousands$ = "."



#MIB_IF_TYPE_OTHER = 1
#MIB_IF_TYPE_ETHERNET = 6
#MIB_IF_TYPE_TOKENRING = 9
#MIB_IF_TYPE_FDDI = 15
#MIB_IF_TYPE_PPP = 23
#MIB_IF_TYPE_LOOPBACK = 24
#MIB_IF_TYPE_SLIP = 28

#MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0
#MIB_IF_OPER_STATUS_UNREACHABLE = 1
#MIB_IF_OPER_STATUS_DISCONNECTED = 2
#MIB_IF_OPER_STATUS_CONNECTING = 3
#MIB_IF_OPER_STATUS_CONNECTED = 4
#MIB_IF_OPER_STATUS_OPERATIONAL = 5

#BROADCAST_NODETYPE = 1
#PEER_TO_PEER_NODETYPE = 2
#MIXED_NODETYPE = 4
#HYBRID_NODETYPE = 8

#MAX_HOSTNAME_LEN = 128
#MAX_DOMAIN_NAME_LEN = 128
#MAX_SCOPE_ID_LEN = 256

#MAX_ADAPTER_NAME = 128
#MAX_ADAPTER_DESCRIPTION_LENGTH = 128
#MAX_ADAPTER_NAME_LENGTH = 256
#MAX_ADAPTER_ADDRESS_LENGTH = 8

#MAX_INTERFACE_NAME_LEN = 256
#MAXLEN_PHYSADDR = 8
#MAXLEN_IFDESCR = 256

#ERROR_SUCCESS = 0
#ERROR_BUFFER_OVERFLOW = 111
#ERROR_INSUFFICIENT_BUFFER = 122

Structure IP_ADDRESS_STRING
  String.a[16]
EndStructure

Structure IP_MASK_STRING
  String.a[16]
EndStructure

Structure IP_ADDR_STRING
  NextAdapter.i
  IpAddress.IP_ADDRESS_STRING
  IpMask.IP_ADDRESS_STRING
  Context.i
EndStructure

Structure FIXED_INFO
  HostName.a[#MAX_HOSTNAME_LEN + 4]
  DomainName.a[#MAX_DOMAIN_NAME_LEN + 4]
  CurrentDnsServer.i
  DnsServerList.IP_ADDR_STRING
  NodeType.l
  ScopeId.a[#MAX_SCOPE_ID_LEN + 4]
  EnableRouting.l
  EnableProxy.l
  EnableDns.l
EndStructure

Structure IP_ADAPTER_INFO
  *NextAdapter
  ComboIndex.l
  AdapterName.a[#MAX_ADAPTER_NAME_LENGTH + 4]
  Description.a[#MAX_ADAPTER_DESCRIPTION_LENGTH + 4]
  AddressLength.l
  Address.a[#MAX_ADAPTER_ADDRESS_LENGTH]
  index.l
  Type.l
  DhcpEnabled.i
  *CurrentIpAddress.IP_ADDR_STRING
  IpAddressList.IP_ADDR_STRING
  GatewayList.IP_ADDR_STRING
  DhcpServer.IP_ADDR_STRING
  HaveWINS.l
  PrimaryWinsServer.IP_ADDR_STRING
  SecondaryWinsServer.IP_ADDR_STRING
  LeaseObtained.l
  LeaseExpires.l
EndStructure

Structure MIB_IFROW
  wszName.a[#MAX_INTERFACE_NAME_LEN * 2]  ; * 2 cause stored as unicode
  dwIndex.l
  dwType.l
  dwMtu.l
  dwSpeed.l
  dwPhysAddrLen.l
  bPhysAddr.a[#MAXLEN_PHYSADDR]
  dwAdminStatus.l
  dwOperStatus.l
  dwLastChange.l
  dwInOctets.l
  dwInUcastPkts.l
  dwInNUcastPkts.l
  dwInDiscards.l
  dwInErrors.l
  dwInUnknownProtos.l
  dwOutOctets.l
  dwOutUcastPkts.l
  dwOutNUcastPkts.l
  dwOutDiscards.l
  dwOutErrors.l
  dwOutQLen.l
  dwDescrLen.l
  bDescr.a[#MAXLEN_IFDESCR]
EndStructure


Structure MIB_IFTABLE
  dwNumEntries.l
  table.MIB_IFROW[0]
EndStructure


Structure AdapterStructure
  AdapterName.s
  Type.s
  Speed.s
  sMTU.s
  packsS.s
  bytesS.s
  packsR.s
  bytesR.s
  status.s
  IPAddr.s
  SubMask.s
  Addr.s
  Indx.s
  DHCPE.s
  DHCPIPAddr.s
  DHCPIPMask.s
  DHCPLObt.s
  DHCPLExp.s
  GateIPAddress.s
  GateIPMask.s
  HaveWINS.s
  PWINSIPAddress.s
  PWINSIPMask.s
  SWINSIPAddress.s
  SWINSIPMask.s
EndStructure


Structure NetWorkInfoStructure
  index.l
  HostName.s
  DomainName.s
  nod.s
  ScopeID.s
  DNSE.s
  ProxyE.s
  RoutE.s
  Conx.s
  List DNSIPAddList.s()
  List AdapterList.AdapterStructure()
EndStructure




Procedure.d int32_uint32(lValue.l)
  
  Protected int32uint32.l
  
  
  If lValue < 0
    int32uint32 = lValue + $100000000
  Else
    int32uint32 = lValue
  EndIf
  
  ProcedureReturn int32uint32
  
EndProcedure


Procedure.s c2str(num.d, demical.l=0)
  
  ProcedureReturn ReplaceString(StrD(num,demical), ".", #GroupDemicals$)
  
EndProcedure


Procedure.s FormatByteSize(n.q)
  
  Protected.i length, i
  Protected s$, ret$
  
  
  s$ = Str(n)
  length = Len(s$) - 1
  For i = 0 To length
    If i And Not i % 3 : ret$ = #GroupThousands$ + ret$ : EndIf
    ret$ = Mid(s$, length - i, 1) + ret$
  Next
 
  ProcedureReturn ret$
  
EndProcedure


Procedure.s SpaceDivider(space.q)
  
  Protected.d mt
  Protected tm$
  
  
  mt = space
  If mt > 1000 : mt / 1024 : tm$ = " KB" : EndIf
  If mt > 1000 : mt / 1024 : tm$ = " MB" : EndIf
  If mt > 1000 : mt / 1024 : tm$ = " GB" : EndIf
  If mt > 1000 : mt / 1024 : tm$ = " TB" : EndIf
  
  ProcedureReturn ReplaceString(StrD(mt, 3), ".", #GroupDemicals$) + tm$
  
EndProcedure


Procedure LAN(*LANInfo.NetWorkInfoStructure)
  
  Protected.i AdapterCount, MIBCount
  Protected *MIBIfTable.MIB_IFTABLE
  Dim IPAdapterInfo.IP_ADAPTER_INFO(0)
  NewList NICs.s()
  
  
  hMod.i = LoadLibrary_("iphlpapi.dll")
  FuncName.s = Space(60)
  PokeS(@FuncName,"GetAdaptersInfo",-1,#PB_Ascii)
  If GetProcAddress_(hMod, FuncName) <> 0
    
    lBufferLength.l = 0
    lErrors = GetAdaptersInfo_(@IPAdapterInfo(0), @lBufferLength)
    
    If lErrors = #ERROR_BUFFER_OVERFLOW
      AdapterCount = lBufferLength / SizeOf(IP_ADAPTER_INFO)
      ReDim IPAdapterInfo(AdapterCount)
    EndIf
    lBufferLength = AdapterCount * SizeOf(IP_ADAPTER_INFO)
    
    lErrors = GetAdaptersInfo_(@IPAdapterInfo(0), @lBufferLength)
    If lErrors <> #ERROR_SUCCESS: ProcedureReturn: EndIf
    lBufferPos.l
;     For i=0 To AdapterCount - 1
;       Debug PeekS(@IPAdapterInfo(i)\AdapterName, #MAX_ADAPTER_NAME_LENGTH + 4, #PB_Ascii)
;       Debug PeekS(@IPAdapterInfo(i)\Description, #MAX_ADAPTER_DESCRIPTION_LENGTH + 4, #PB_Ascii)      
;     Next
  Else
    MessageRequester("error","Could not load 'iphlpapi.dll'.")
    ProcedureReturn
  EndIf
  
  AdapterCount.i
  tmp.s
  tmp2.d
  FuncName = Space(60)
  PokeS(@FuncName,"GetIfTable",-1,#PB_Ascii)
  If GetProcAddress_(hMod, FuncName) <> 0  ;for speed and status
    
    lSize = 0
    lErrors = GetIfTable_(*MIBIfTable, @lSize, 0)
    
    If lErrors = #ERROR_INSUFFICIENT_BUFFER
      ;Debug lSize - SizeOf(LONG)
      *MIBIfTable = AllocateMemory(lSize)
    EndIf
    
    lErrors = GetIfTable_(*MIBIfTable, @lSize, 0)
    If lErrors <> #ERROR_SUCCESS: ProcedureReturn: EndIf
    
;     Debug *MIBIfTable\dwNumEntries
;     
;     For i = 0 To *MIBIfTable\dwNumEntries - 1
;       Debug PeekS(@*MIBIfTable\table[i]\bDescr[0], *MIBIfTable\table[i]\dwDescrLen, #PB_Ascii)
;       Debug PeekS(@*MIBIfTable\table[i]\wszName[0], #MAX_INTERFACE_NAME_LEN, #PB_Unicode)
;       Debug *MIBIfTable\table[i]\dwOutOctets
;     Next i
    
  EndIf
  FuncName = Space(60)
  PokeS(@FuncName,"GetNetworkParams",-1,#PB_Ascii)
  If GetProcAddress_(hMod, FuncName) <> 0
    xx = 0
    FixedInfo.FIXED_INFO
    lBufferLength = SizeOf(FIXED_INFO)
    lErrors = GetNetworkParams_(@FixedInfo, @lBufferLength)
    With FixedInfo
      IPAddrString.IP_ADDR_STRING
      *LANInfo\HostName = PeekS(@\Hostname,-1,#PB_Ascii)
      *LANInfo\DomainName = PeekS(@\DomainName,-1,#PB_Ascii)
      If \EnableDns = 1:  *LANInfo\DNSE = "Yes": Else: *LANInfo\DNSE = "No": EndIf
      
      AddElement(*LANInfo\DNSIPAddList())
      *LANInfo\DNSIPAddList() = PeekS(@\DnsServerList\IpAddress,-1,#PB_Ascii)
      
      lNext.l = \DnsServerList\NextAdapter
      While aa.l=0
        If lNext <> 0
          If IsBadReadPtr_(lNext, SizeOf(IP_ADDR_STRING)) = #False
            MoveMemory(@lNext, @IPAddrString, SizeOf(IP_ADDR_STRING))
          EndIf
          If lNext <> IPAddrString\NextAdapter
            lNext = IPAddrString\NextAdapter
            xx = xx + 1
            ;*LANInfo\DNSIPAdd[xx] = PeekS(@IPAddrString\IpAddress\String,-1,#PB_Ascii)
            AddElement(*LANInfo\DNSIPAddList())
            *LANInfo\DNSIPAddList() = PeekS(@IPAddrString\IpAddress\String,-1,#PB_Ascii)
          Else
            aa=1
          EndIf
        Else
          aa=1
        EndIf
      Wend
      Select \NodeType
        Case #BROADCAST_NODETYPE: *LANInfo\nod = "Broadcast"
        Case #PEER_TO_PEER_NODETYPE: *LANInfo\nod = "Peer To Peer"
        Case #MIXED_NODETYPE: *LANInfo\nod = "Mixed"
        Case #HYBRID_NODETYPE: *LANInfo\nod = "Hybrid"
        Default: *LANInfo\nod = "Unknown " + Str(\NodeType)
      EndSelect
      *LANInfo\ScopeID = ReplaceString(PeekS(@\ScopeId[0],-1,#PB_Ascii), Chr(0), "")
      If \EnableProxy = 1: *LANInfo\ProxyE = "Yes": Else: *LANInfo\ProxyE = "No": EndIf
      If \EnableRouting = 1:  *LANInfo\RoutE = "Yes": Else: *LANInfo\RoutE = "No": EndIf
    EndWith
  Else
    MessageRequester("error","GetNetworkParams not found")
  EndIf
  
  For i = 0 To AdapterCount
    With IPAdapterInfo(i)
      
      For ii = 0 To *MIBIfTable\dwNumEntries - 1
        If PeekS(@*MIBIfTable\table[ii]\bDescr[0], *MIBIfTable\table[ii]\dwDescrLen, #PB_Ascii) = PeekS(@IPAdapterInfo(i)\Description, #MAX_ADAPTER_DESCRIPTION_LENGTH + 4,#PB_Ascii)
          
          ;Debug "Found " + PeekS(@IPAdapterInfo(i)\Description, #MAX_ADAPTER_DESCRIPTION_LENGTH + 4,#PB_Ascii)
          
          AddElement(*LANInfo\AdapterList())
          
          *LANInfo\AdapterList()\AdapterName = PeekS(@IPAdapterInfo(i)\Description, #MAX_ADAPTER_DESCRIPTION_LENGTH + 4,#PB_Ascii)
          
          Select \Type
            Case #MIB_IF_TYPE_OTHER: *LANInfo\AdapterList()\Type = "Other"
            Case #MIB_IF_TYPE_ETHERNET: *LANInfo\AdapterList()\Type = "Ethernet"
            Case #MIB_IF_TYPE_TOKENRING: *LANInfo\AdapterList()\Type = "Tokenring"
            Case #MIB_IF_TYPE_FDDI: *LANInfo\AdapterList()\Type = "FDDI"
            Case #MIB_IF_TYPE_PPP: *LANInfo\AdapterList()\Type = "PPP"
            Case #MIB_IF_TYPE_LOOPBACK: *LANInfo\AdapterList()\Type = "Loopback"
            Case #MIB_IF_TYPE_SLIP: *LANInfo\AdapterList()\Type = "Slip"
            Default: *LANInfo\AdapterList()\Type = "Unknown " + Str(\Type)
          EndSelect
          
          tmp2 = int32_uint32(*MIBIfTable\table[ii]\dwSpeed): tmp = " bit"
          If tmp2 >= 1000:  tmp2 = tmp2 / 1000: tmp = " Kbit":EndIf
          If tmp2 >= 1000:  tmp2 = tmp2 / 1000: tmp = " Mbit": EndIf
          If tmp2 >= 1000:  tmp2 = tmp2 / 1000: tmp = " Gbit": EndIf
          *LANInfo\AdapterList()\Speed = c2str(tmp2,2) + tmp
          *LANInfo\AdapterList()\sMTU = Str(*MIBIfTable\table[ii]\dwMtu) + " bytes"
          *LANInfo\AdapterList()\packsS = FormatByteSize(*MIBIfTable\table[ii]\dwOutNUcastPkts + *MIBIfTable\table[ii]\dwOutUcastPkts)
          
          tmp = FormatByteSize(*MIBIfTable\table[ii]\dwOutOctets)
          If tmp = "":  tmp = "0": EndIf
          If *MIBIfTable\table[ii]\dwOutOctets > 1024
            tmp + "  ( " + SpaceDivider(*MIBIfTable\table[ii]\dwOutOctets) + " )"
            If Right(tmp,6) = #GroupDemicals$ + "000 )":tmp=Left(tmp,Len(tmp)-6) + " )": EndIf
          EndIf
          *LANInfo\AdapterList()\bytesS = tmp
          *LANInfo\AdapterList()\packsR = FormatByteSize(*MIBIfTable\table[ii]\dwInNUcastPkts + *MIBIfTable\table[ii]\dwInUcastPkts)
          
          tmp = FormatByteSize(*MIBIfTable\table[ii]\dwInOctets)
          If tmp = "":  tmp = "0": EndIf
          If (*MIBIfTable\table[ii]\dwInOctets & $FFFFFFFF) > 1024
            tmp + "  ( " + SpaceDivider(*MIBIfTable\table[ii]\dwInOctets) + " )"
            If Right(tmp,6) = #GroupDemicals$ + "000 )":tmp=Left(tmp,Len(tmp)-6) + " )": EndIf
          EndIf
          *LANInfo\AdapterList()\bytesR = tmp
          
          Select *MIBIfTable\table[ii]\dwOperStatus
            Case #MIB_IF_OPER_STATUS_NON_OPERATIONAL: *LANInfo\AdapterList()\status = "Non operational"
            Case #MIB_IF_OPER_STATUS_UNREACHABLE: *LANInfo\AdapterList()\status = "Unreachable"
            Case #MIB_IF_OPER_STATUS_DISCONNECTED: *LANInfo\AdapterList()\status = "Disconnected"
            Case #MIB_IF_OPER_STATUS_CONNECTING: *LANInfo\AdapterList()\status = "Connecting"
            Case #MIB_IF_OPER_STATUS_CONNECTED: *LANInfo\AdapterList()\status = "Connected"
            Case #MIB_IF_OPER_STATUS_OPERATIONAL: *LANInfo\AdapterList()\status = "Operational"
            Default: *LANInfo\AdapterList()\status = "Unknown " + c2str(int32_uint32(*MIBIfTable\table[ii]\dwOperStatus),0)
          EndSelect
          
          Break
          
        EndIf
      Next
      
      *LANInfo\AdapterList()\IPAddr = PeekS(@\IpAddressList\IpAddress,-1,#PB_Ascii)
      *LANInfo\AdapterList()\SubMask = PeekS(@\IpAddressList\IpMask,-1,#PB_Ascii)
      tmp = ""
      If Len(PeekS(@\AdapterName,-1,#PB_Ascii)) >= \AddressLength
        For lIncrement.l = 0 To \AddressLength-1
          tmp = tmp + RSet(Hex(\Address[lIncrement] & $FF),2,"0")
        Next lIncrement
        tmp = RSet(tmp,12,"0")
        tmp = Left(tmp, 2) + ":" + Mid(tmp, 3, 2) + ":" + Mid(tmp, 5, 2) + ":" + Mid(tmp, 7, 2) + ":" + Mid(tmp, 9, 2) + ":" + Mid(tmp, 11, 2)
        *LANInfo\AdapterList()\Addr = tmp
      EndIf
      *LANInfo\AdapterList()\Indx = (c2str(int32_uint32(\Index),0))
      
      If \DhcpEnabled = 1:  *LANInfo\AdapterList()\DHCPE = "Yes": Else: *LANInfo\AdapterList()\DHCPE = "No": EndIf
      *LANInfo\AdapterList()\DHCPIPAddr = PeekS(@\DhcpServer\IpAddress,-1,#PB_Ascii)
      *LANInfo\AdapterList()\DHCPIPMask = PeekS(@\DhcpServer\IpMask,-1,#PB_Ascii)
      If \LeaseObtained > 10000
        tmp = FormatDate("%dd/%mm/%yyyy , %hh:%ii:%ss",AddDate( 1/1/1970,#PB_Date_Second, \LeaseObtained))
        *LANInfo\AdapterList()\DHCPLObt = FormatDate("%dd/%mm/%yyyy , %hh:%ii:%ss",AddDate( ParseDate("%dd/%mm/%yyyy , %hh:%ii:%ss",tmp),#PB_Date_Minute,-TZResult ))
      Else
        *LANInfo\AdapterList()\DHCPLObt = "NotAvailable"
      EndIf
      If \LeaseExpires > 10000
        tmp = FormatDate("%dd/%mm/%yyyy , %hh:%ii:%ss",AddDate( 1/1/1970,#PB_Date_Second, \LeaseExpires))
        *LANInfo\AdapterList()\DHCPLExp = FormatDate("%dd/%mm/%yyyy , %hh:%ii:%ss",AddDate( ParseDate("%dd/%mm/%yyyy , %hh:%ii:%ss",tmp),#PB_Date_Minute,-TZResult))
      Else
        *LANInfo\AdapterList()\DHCPLExp = "NotAvailable"
      EndIf
      
      CopyMemory(@\IpAddressList,@IPAddrString,SizeOf(IP_ADDR_STRING))
      For ii=0 To 100
        If IPAddrString\NextAdapter <> 0
          If IsBadReadPtr_(@IPAddrString\NextAdapter, SizeOf(IP_ADDR_STRING)) = #False
            MoveMemory(@IPAddrString\NextAdapter, @IPAddrString, SizeOf(IP_ADDR_STRING))
          EndIf
        Else
          Break
        EndIf
        If bShutdown = #True: Break: EndIf
      Next
      *LANInfo\AdapterList()\GateIPAddress = PeekS(@\GatewayList\IpAddress,-1,#PB_Ascii)
      *LANInfo\AdapterList()\GateIPMask = PeekS(@\GatewayList\IpMask,-1,#PB_Ascii)
      If \HaveWINS = 1:  *LANInfo\AdapterList()\HaveWINS = "Yes": Else: *LANInfo\AdapterList()\HaveWINS = "No": EndIf
      *LANInfo\AdapterList()\PWINSIPAddress = PeekS(@\PrimaryWinsServer\IpAddress,-1,#PB_Ascii)
      *LANInfo\AdapterList()\PWINSIPMask = PeekS(@\PrimaryWinsServer\IpMask,-1,#PB_Ascii)
      *LANInfo\AdapterList()\SWINSIPAddress = PeekS(@\SecondaryWinsServer\IpAddress,-1,#PB_Ascii)
      *LANInfo\AdapterList()\SWINSIPMask = PeekS(@\SecondaryWinsServer\IpMask,-1,#PB_Ascii)
    EndWith
  Next
  
  If *MIBIfTable
    FreeMemory(*MIBIfTable)
  EndIf
  
EndProcedure




;-Main
Define.i i
Define LANInfo.NetWorkInfoStructure

If OpenWindow(0, 0, 0, 432, 510, "Network Info", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(0,5,5,422,500,"Element",200,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  AddGadgetColumn(0,1,"Data",200)
EndIf

LAN(@LANInfo)

AddGadgetItem(0,-1,"Host  name"+#LF$+LANInfo\HostName)
AddGadgetItem(0,-1,"Domain  name"+#LF$+LANInfo\DomainName)
AddGadgetItem(0,-1,"DNS  enabled"+#LF$+LANInfo\DNSE)
ForEach LANInfo\DNSIPAddList()
  AddGadgetItem(0,-1,"DNS  Server  IP  address  #" + Str(i+1)+#LF$+LANInfo\DNSIPAddList())
Next
AddGadgetItem(0,-1,"Node  type"+#LF$+LANInfo\nod)
AddGadgetItem(0,-1,"Scope  ID"+#LF$+LANInfo\ScopeID)
AddGadgetItem(0,-1,"WINS  Proxy  Enabled"+#LF$+LANInfo\ProxyE)
AddGadgetItem(0,-1,"IP  Routing  Enabled"+#LF$+LANInfo\RoutE)
AddGadgetItem(0,-1,""+#LF$+"")
i = 0
ForEach LANInfo\AdapterList()
  AddGadgetItem(0,-1,"Connection  #"+Str(i+1)+#LF$+"")
  SetGadgetItemColor(0,CountGadgetItems(0)-1,#PB_Gadget_FrontColor,$906000,0)
  AddGadgetItem(0,-1,"Adapter  name"+#LF$+LANInfo\AdapterList()\AdapterName)
  AddGadgetItem(0,-1,"Type"+#LF$+LANInfo\AdapterList()\Type)
  AddGadgetItem(0,-1,"Speed"+#LF$+LANInfo\AdapterList()\Speed)
  AddGadgetItem(0,-1,"Maximum Transfer Unit Size (MTU)"+#LF$+LANInfo\AdapterList()\sMTU)
  AddGadgetItem(0,-1,"Packets sent"+#LF$+LANInfo\AdapterList()\packsS)
  AddGadgetItem(0,-1,"Bytes sent"+#LF$+LANInfo\AdapterList()\bytesS)
  AddGadgetItem(0,-1,"Packets received"+#LF$+LANInfo\AdapterList()\packsR)
  AddGadgetItem(0,-1,"Bytes received"+#LF$+LANInfo\AdapterList()\bytesR)
  AddGadgetItem(0,-1,"Status"+#LF$+LANInfo\AdapterList()\status)
  AddGadgetItem(0,-1,"IP"+#LF$+LANInfo\AdapterList()\IPAddr)
  AddGadgetItem(0,-1,"SubMask"+#LF$+LANInfo\AdapterList()\SubMask)
  AddGadgetItem(0,-1,"Address"+#LF$+LANInfo\AdapterList()\Addr)
  AddGadgetItem(0,-1,"Index"+#LF$+LANInfo\AdapterList()\Indx)
  AddGadgetItem(0,-1,"DHCP enabled"+#LF$+LANInfo\AdapterList()\DHCPE)
  AddGadgetItem(0,-1,"DCHP IP address"+#LF$+LANInfo\AdapterList()\DHCPIPAddr)
  AddGadgetItem(0,-1,"DCHP IP mask"+#LF$+LANInfo\AdapterList()\DHCPIPMask)
  AddGadgetItem(0,-1,"DHCP lease obtained"+#LF$+LANInfo\AdapterList()\DHCPLObt)
  AddGadgetItem(0,-1,"DHCP lease expires"+#LF$+LANInfo\AdapterList()\DHCPLExp)
  AddGadgetItem(0,-1,"Gateway IP address"+#LF$+LANInfo\AdapterList()\GateIPAddress)
  AddGadgetItem(0,-1,"Gateway IP mask"+#LF$+LANInfo\AdapterList()\GateIPMask)
  AddGadgetItem(0,-1,"Have  WINS"+#LF$+LANInfo\AdapterList()\HaveWINS)
  If LANInfo\AdapterList()\HaveWINS = "Yes"
    AddGadgetItem(0,-1,"Primary WINS Server IP address"+#LF$+LANInfo\AdapterList()\PWINSIPAddress)
    AddGadgetItem(0,-1,"Primary WINS Server IP mask"+#LF$+LANInfo\AdapterList()\PWINSIPMask)
    AddGadgetItem(0,-1,"Secondary WINS Server IP address"+#LF$+LANInfo\AdapterList()\SWINSIPAddress)
    AddGadgetItem(0,-1,"Secondary WINS Server IP Mask"+#LF$+LANInfo\AdapterList()\SWINSIPMask)
  EndIf
  i + 1
Next

;-MainLoop
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Bernd
User avatar
doctorized
Addict
Addict
Posts: 856
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: LAN info - Windows only

Post by doctorized »

infratec wrote:Now it has 'no limits'
I made some changes, I didn't post the new code yet but we have a strange problem with both my code and your code.
If adapter's description contains non-english characters (greek in a computer that I tested the code) then:
1) GetAdaptersInfo_() returns "AdapterName" but it doesn't return "Description" which is the card's name.
2) GetIfTable_() in "bDescr" of "table" returns the card's name but the greek characters are not those who should be.
What I mean with this? Card's name is "Ελεγκτής δικτύου NVIDIA nForce".
The chars for "Ελεγκτής δικτύου" (=Network controller in greek) are: C5 EB E5 E3 EA F4 DE F2 for the first word and: E4 E9 EA F4 DF EF F5 for the second.
GetIfTable_() returns: 84 A2 9C 9A A1 AB E3 AA and 9B A0 A1 AB E7 A6 AC.
I thought that I could add something to get the real chars but the difference is not the same everywhere. For example, in the second word every "distance" from the char taken to the real char is $49 except DF to E7.
Last edited by doctorized on Fri Aug 22, 2014 2:25 pm, edited 1 time in total.
infratec
Always Here
Always Here
Posts: 6874
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: LAN info - Windows only

Post by infratec »

Hi,

the only string which is unicode is:

wszName

all other strings are in ASCII.

So wszName should show the text in greek.
Oh...

wszName is not a userfriendly 'name' :cry:

I don't know how greek PCs handle ASCII characters.

Bernd
User avatar
doctorized
Addict
Addict
Posts: 856
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: LAN info - Windows only

Post by doctorized »

infratec wrote: So wszName should show the text in greek.
Oh...

wszName is not a userfriendly 'name'
Yes, it has "\DEVICE\TCPIP_{AD7EDF7C-6017-4E74-AF57-FB4972F1FD6D}" in my case. Not really useful.
infratec
Always Here
Always Here
Posts: 6874
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: LAN info - Windows only

Post by infratec »

One idea:

use an extra buffer
and pokes() and peeks()
maybe it translates the ASCII to unicode.

Bernd
infratec
Always Here
Always Here
Posts: 6874
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: LAN info - Windows only

Post by infratec »

Like this:

Code: Select all

Procedure.s Translate(Ascii$)
  
  Protected Translate$
  
  
  Translate$ = Space(StringByteLength(Ascii$) * 2)
  
  PokeS(@Translate$, Ascii$, -1, #PB_Unicode)
  
  ProcedureReturn PeekS(@Translate$, -1, #PB_Ascii)
  
EndProcedure
User avatar
doctorized
Addict
Addict
Posts: 856
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: LAN info - Windows only

Post by doctorized »

infratec wrote:Like this:

Code: Select all

Procedure.s Translate(Ascii$)
  
  Protected Translate$
  
  
  Translate$ = Space(StringByteLength(Ascii$) * 2)
  
  PokeS(@Translate$, Ascii$, -1, #PB_Unicode)
  
  ProcedureReturn PeekS(@Translate$, -1, #PB_Ascii)
  
EndProcedure
I used your procedure like this:

Code: Select all

Debug Translate(PeekS(@MIB_IFTABLE\table[ii]\bDescr,-1,#PB_Ascii))
Nothing changed.
infratec
Always Here
Always Here
Posts: 6874
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: LAN info - Windows only

Post by infratec »

I changed something in the code,
maybe you have not used the latest version.

Or try to use #PB_Unicode instead of #PB_Ascii.

Since I have no access to such a PC, I can test nothing for you. :cry:

Bernd
infratec
Always Here
Always Here
Posts: 6874
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: LAN info - Windows only

Post by infratec »

Hi,

a last try:

Code: Select all

Procedure.s TranslateASCII(*Ascii, StringByteLength.i=-1)
  
  ProcedureReturn PeekS(*Ascii, StringByteLength, #PB_Ascii)
  
EndProcedure
Than you can use something like that:

Code: Select all

Debug TranslateASCII(@*MIBIfTable\table[i]\bDescr[0], *MIBIfTable\table[i]\dwDescrLen)
But you have to enable Unicode Executable in compiler options,
else nothing is translated.

Bernd
User avatar
doctorized
Addict
Addict
Posts: 856
Joined: Fri Mar 27, 2009 9:41 am
Location: Athens, Greece

Re: LAN info - Windows only

Post by doctorized »

infratec wrote:a last try:

Code: Select all

Procedure.s TranslateASCII(*Ascii, StringByteLength.i=-1)
  
  ProcedureReturn PeekS(*Ascii, StringByteLength, #PB_Ascii)
  
EndProcedure
It doesn't help.
infratec wrote: But you have to enable Unicode Executable in compiler options,
else nothing is translated.
Unicode is always enabled.

I think this problem must occur also in computers with other OS languages like german, or spanish as many languages like them have "non-english" chars in their alfabet. Users with motherboards that have nForce bridge like MSI NF750 that I have may prove it.
Post Reply