peterb
Code: Select all
;- Author : Petr Vavrin (peterb)
;- Location : Czech Republic
;- Email : pb.pb@centrum.cz
#TCP_TABLE_OWNER_PID_ALL = 5
#UDP_TABLE_OWNER_PID = 1
#AF_INET = 2
Structure MIB_TCPROW
dwStats.l
dwLocalAddr.l
dwLocalPort.l
dwRemoteAddr.l
dwRemotePort.l
EndStructure
Structure MIB_TCPTABLE
dwNumEntries.l
table.MIB_TCPROW[2048]
EndStructure
Structure MIB_UDPROW
dwLocalAddr.l
dwLocalPort.l
EndStructure
Structure MIB_UDPTABLE
dwNumEntries.l
table.MIB_UDPROW[2048]
EndStructure
Structure MIB_TCPTABLE_OWNER_PID
dwStats.l
dwLocalAddr.l
dwLocalPort.l
dwRemoteAddr.l
dwRemotePort.l
dwOwningPid.l
EndStructure
Structure MIB_TCPTABLE_EX
dwNumEntries.l
table.MIB_TCPTABLE_OWNER_PID[2048]
EndStructure
Structure MIB_UDPTABLE_OWNER_PID
dwLocalAddr.l
dwLocalPort.l
dwOwningPid.l
EndStructure
Structure MIB_UDPTABLE_EX
dwNumEntries.l
table.MIB_UDPTABLE_OWNER_PID[2048]
EndStructure
Structure TCPUDPTABLE
Type.b
LocalAddr.l
LocalPort.l
RemoteAddr.l
RemotePort.l
PID.l
Stats.l
SystemTime.SYSTEMTIME
EndStructure
Enumeration
#iphlpapi
EndEnumeration
Define tcpTableEx.MIB_TCPTABLE_EX
Define udpTableEx.MIB_UDPTABLE_EX
Define tcpTable.MIB_TCPTABLE
Define udpTable.MIB_UDPTABLE
Global NewList tcp_udp.TCPUDPTABLE()
Global NewList last_tcp_udp.TCPUDPTABLE()
Global iphlpapi_loaded.l = #False
Global iphlpapi_loaded.l = #False
Global enable_TCP.l = #True
Global enable_UDP.l = #True
Global compare_size.l = SizeOf ( TCPUDPTABLE ) - SizeOf ( TCPUDPTABLE\Stats ) - SizeOf ( TCPUDPTABLE\SystemTime )
Procedure Open_IPHLPAPI ()
If OpenLibrary ( #iphlpapi, "iphlpapi.dll" )
iphlpapi_loaded = #True
EndIf
EndProcedure
Procedure Close_IPHLPAPI ()
If iphlpapi_loaded
CloseLibrary ( #iphlpapi )
EndIf
EndProcedure
Procedure Is_IPHLPAPI_loaded ()
ProcedureReturn iphlpapi_loaded
EndProcedure
Procedure GetTcpAndUdpTable ()
Shared tcpTableEx, udpTableEx
Shared tcpTable, udpTable
ClearList ( tcp_udp() )
If GetFunction ( #iphlpapi, "GetExtendedTcpTable" )
If enable_TCP
dwSize = $0
If CallFunction ( #iphlpapi, "GetExtendedTcpTable", @tcpTableEx, @dwSize, #True, #AF_INET, #TCP_TABLE_OWNER_PID_ALL, 0)
If CallFunction ( #iphlpapi, "GetExtendedTcpTable", @tcpTableEx, @dwSize, #True, #AF_INET, #TCP_TABLE_OWNER_PID_ALL, 0) = #NO_ERROR
GetLocalTime_ ( @SystemTime.SYSTEMTIME )
For cnt = 0 To tcpTableEx\dwNumEntries - 1
AddElement ( tcp_udp() )
tcp_udp()\Type = 1
tcp_udp()\Stats = tcpTableEx\table[cnt]\dwStats
tcp_udp()\LocalAddr = tcpTableEx\table[cnt]\dwLocalAddr
tcp_udp()\LocalPort = htons_(tcpTableEx\table[cnt]\dwLocalPort)
tcp_udp()\RemoteAddr = tcpTableEx\table[cnt]\dwRemoteAddr
tcp_udp()\RemotePort = htons_(tcpTableEx\table[cnt]\dwRemotePort)
tcp_udp()\PID = tcpTableEx\table[cnt]\dwOwningPid
CopyMemory ( @SystemTime, @tcp_udp()\SystemTime, SizeOf ( SYSTEMTIME ) )
Next
EndIf
EndIf
EndIf
If enable_UDP
dwSize = $0
If CallFunction ( #iphlpapi,"GetExtendedUdpTable", @udpTableEx, @dwSize, #True, #AF_INET, #UDP_TABLE_OWNER_PID,0)
If CallFunction ( #iphlpapi,"GetExtendedUdpTable", @udpTableEx, @dwSize, #True, #AF_INET, #UDP_TABLE_OWNER_PID,0) = #NO_ERROR
GetLocalTime_ ( @SystemTime.SYSTEMTIME )
For cnt = 0 To udpTableEx\dwNumEntries - 1
AddElement ( tcp_udp() )
tcp_udp()\Type = 2
tcp_udp()\LocalAddr = udpTableEx\table[cnt]\dwLocalAddr
tcp_udp()\LocalPort = htons_(udpTableEx\table[cnt]\dwLocalPort)
tcp_udp()\PID = udpTableEx\table[cnt]\dwOwningPid
CopyMemory ( @SystemTime, @tcp_udp()\SystemTime, SizeOf ( SYSTEMTIME ) )
Next
EndIf
EndIf
EndIf
Else
If enable_TCP
dwSize = $0
If CallFunction ( #iphlpapi, "GetTcpTable", @tcpTable, @dwSize, #True)
If CallFunction ( #iphlpapi, "GetTcpTable", @tcpTable, @dwSize, #True) = #NO_ERROR
GetLocalTime_ ( @SystemTime.SYSTEMTIME )
For cnt = 0 To tcpTable\dwNumEntries - 1
AddElement ( tcp_udp() )
tcp_udp()\Type = 1
tcp_udp()\Stats = tcpTable\table[cnt]\dwStats
tcp_udp()\LocalAddr = tcpTable\table[cnt]\dwLocalAddr
tcp_udp()\LocalPort = htons_(tcpTable\table[cnt]\dwLocalPort)
tcp_udp()\RemoteAddr = tcpTable\table[cnt]\dwRemoteAddr
tcp_udp()\RemotePort = htons_(tcpTable\table[cnt]\dwRemotePort)
CopyMemory ( @SystemTime, @tcp_udp()\SystemTime, SizeOf ( SYSTEMTIME ) )
Next
EndIf
EndIf
EndIf
If enable_UDP
dwSize = $0
If CallFunction ( #iphlpapi, "GetUdpTable", @udpTable, @dwSize, #True)
If CallFunction ( #iphlpapi, "GetUdpTable", @udpTable, @dwSize, #True) = #NO_ERROR
GetLocalTime_ ( @SystemTime.SYSTEMTIME )
For cnt = 0 To udpTable\dwNumEntries - 1
AddElement ( tcp_udp() )
tcp_udp()\Type = 2
tcp_udp()\LocalAddr = udpTable\table[cnt]\dwLocalAddr
tcp_udp()\LocalPort = htons_(udpTable\table[cnt]\dwLocalPort)
CopyMemory ( @SystemTime, @tcp_udp()\SystemTime, SizeOf ( SYSTEMTIME ) )
Next
EndIf
EndIf
EndIf
EndIf
EndProcedure
Procedure CheckTable()
; add connection or modify connection
ResetList ( tcp_udp() )
While NextElement ( tcp_udp() )
found = #False
ResetList ( last_tcp_udp() )
While NextElement ( last_tcp_udp() )
If CompareMemory ( @tcp_udp(), @last_tcp_udp(), compare_size )
found = #True
If Not last_tcp_udp()\Stats = tcp_udp()\Stats
last_tcp_udp()\Stats = tcp_udp()\Stats
Debug "modify - " + IPString (tcp_udp()\LocalAddr) + " - " + IPString (tcp_udp()\RemoteAddr)
EndIf
Break
EndIf
Wend
If found = #False
Debug "add - " + IPString (tcp_udp()\LocalAddr) + " - " + IPString (tcp_udp()\RemoteAddr)
AddElement ( last_tcp_udp() )
CopyMemory ( @tcp_udp(), @last_tcp_udp(), SizeOf ( TCPUDPTABLE ) )
found = #True
EndIf
Wend
; remove connection
ResetList( last_tcp_udp() )
While NextElement ( last_tcp_udp() )
found = #False
ResetList( tcp_udp() )
While NextElement ( tcp_udp() )
If CompareMemory ( @last_tcp_udp(), @tcp_udp(), compare_size )
found = #True
Break
EndIf
Wend
If found = #False
Debug "remove - " + IPString (last_tcp_udp()\LocalAddr) + " - " + IPString (last_tcp_udp()\RemoteAddr)
DeleteElement ( last_tcp_udp() )
found = #True
EndIf
Wend
EndProcedure
Open_IPHLPAPI ()
loop = 1
Repeat
GetTcpAndUdpTable ( )
CheckTable ( )
Delay ( 100 )
loop + 1
Until loop = 400