File: n_adapter.sru
Size: 6446
Date: Mon, 10 Jan 2022 15:12:28 +0100
$PBExportHeader$n_adapter.sru
forward
global type n_adapter from nonvisualobject
end type
type ip_addr_string from structure within n_adapter
end type
type ip_adapter_info from structure within n_adapter
end type
end forward

type ip_addr_string from structure
   long     nextptr
   byte     ipaddress[16]
   byte     ipmask[16]
   long     context
end type

type ip_adapter_info from structure
   long     nextptr
   unsignedlong      comboindex
   character      adaptername[260]
   character      description[132]
   unsignedlong      addresslength
   byte     address[8]
   unsignedlong      index
   unsignedinteger      adaptertype
   unsignedinteger      dhcpenabled
   long     currentipaddress
   unsignedlong      reserved1
   ip_addr_string    ipaddresslist
   ip_addr_string    gatewaylist
   ip_addr_string    dhcpserver
   boolean     havewins
   unsignedinteger      reserved2
   ip_addr_string    primarywinsserver
   ip_addr_string    secondarywinsserver
   long     leaseobtained
   long     leaseexpires
end type

global type n_adapter from nonvisualobject autoinstantiate
end type

type prototypes
Function ulong GetLastError( &
   ) Library "kernel32.dll"

Function ulong FormatMessage( &
   ulong dwFlags, &
   ulong lpSource, &
   ulong dwMessageId, &
   ulong dwLanguageId, &
   Ref string lpBuffer, &
   ulong nSize, &
   ulong Arguments &
   ) Library "kernel32.dll" Alias For "FormatMessageW"

Function ulong GetAdaptersInfo ( &
   Ref IP_ADAPTER_INFO pAdapterInfo[], &
   Ref ulong pOutBufLen &
   ) Library "iphlpapi.dll" Alias For "GetAdaptersInfo;Ansi"

end prototypes

forward prototypes
public function string of_getlasterror ()
public function string of_nbr2hex (unsignedlong aul_number, integer ai_digit)
public function boolean of_getadaptersinfo (ref string as_macaddress[], ref string as_description[], ref string as_adaptername[], ref string as_ipaddress[])
end prototypes

public function string of_getlasterror ();// -----------------------------------------------------------------------------
// SCRIPT:     n_adapters.of_GetLastError
//
// PURPOSE:    This function returns the last Windows API error.
//
// RETURN:     Error message text
//
// DATE        CHANGED BY  DESCRIPTION OF CHANGE / REASON
// ----------  ----------  -----------------------------------------------------
// 12/23/2010  RolandS     Initial creation
// -----------------------------------------------------------------------------

Constant ULong FORMAT_MESSAGE_FROM_SYSTEM = 4096
Constant ULong LANG_NEUTRAL = 0
String ls_buffer, ls_errmsg
ULong lul_error

lul_error = GetLastError()

ls_buffer = Space(255)

FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, &
      lul_error, LANG_NEUTRAL, ls_buffer, 255, 0)

ls_errmsg = "Error# " + String(lul_error) + "~r~n~r~n" + ls_buffer

Return ls_errmsg

end function

public function string of_nbr2hex (unsignedlong aul_number, integer ai_digit);// -----------------------------------------------------------------------------
// SCRIPT:     n_adapters.of_Nbr2Hex
//
// PURPOSE:    This function converts a number to a hex string.
//
// ARGUMENTS:  aul_number  - A number to convert
//             ai_digit    - The number of hex digits expected
//
// RETURN:     Hex string
//
// DATE        CHANGED BY  DESCRIPTION OF CHANGE / REASON
// ----------  ----------  -----------------------------------------------------
// 12/23/2010  RolandS     Initial creation
// -----------------------------------------------------------------------------

ULong lul_temp0, lul_temp1
Char lc_ret

If ai_digit > 0 Then
   lul_temp0 = Abs(aul_number / (16 ^ (ai_digit - 1)))
   lul_temp1 = lul_temp0 * (16 ^ (ai_digit - 1))
   If lul_temp0 > 9 Then
      lc_ret = Char(lul_temp0 + 55)
   Else
      lc_ret = Char(lul_temp0 + 48)
   End If
   Return lc_ret + of_Nbr2Hex(aul_number - lul_temp1, ai_digit - 1)
End If

Return ""

end function

public function boolean of_getadaptersinfo (ref string as_macaddress[], ref string as_description[], ref string as_adaptername[], ref string as_ipaddress[]);// -----------------------------------------------------------------------------
// SCRIPT:     n_adapters.of_GetAdaptersInfo
//
// PURPOSE:    This function returns information about network adapters.
//
// ARGUMENTS:  as_macaddress  - Array of MAC addresses
//             as_description - Array of Descriptions
//             as_adaptername - Array of Adapter names
//             as_ipaddress   - Array of IP addresses
//
// DATE        PROG/ID     DESCRIPTION OF CHANGE / REASON
// ----------  --------    -----------------------------------------------------
// 12/23/2010  RolandS     Initial creation
// 01/10/2022  RolandS     MAC Address wasn't picking up 00 parts
// -----------------------------------------------------------------------------

Constant ULong ERROR_SUCCESS = 0
Constant ULong ERROR_BUFFER_OVERFLOW = 111
IP_ADAPTER_INFO lstr_Adapter[]
ULong lul_OutBufLen
Integer li_idx, li_max, li_subidx, li_submax, li_char
Blob lblob_address

// call function to get buffer size
If GetAdaptersInfo(lstr_Adapter, lul_OutBufLen) = ERROR_BUFFER_OVERFLOW Then
   // how many adapters?
   li_max = lul_OutBufLen / 640
   // allocate structure
   lstr_Adapter[li_max].NextPtr = 0
   // call function to get data
   If GetAdaptersInfo(lstr_Adapter, lul_OutBufLen) = ERROR_SUCCESS Then
      For li_idx = 1 To li_max
         // get adapter information
         as_adaptername[li_idx] = String(lstr_Adapter[li_idx].AdapterName)
         as_description[li_idx] = String(lstr_Adapter[li_idx].Description)
         // get IP Address
         as_ipaddress[li_idx]  = ""
         li_submax = UpperBound(lstr_Adapter[li_idx].IpAddressList.IpAddress)
         For li_subidx = 1 To li_submax
            li_char = lstr_Adapter[li_idx].IpAddressList.IpAddress[li_subidx]
            If li_char = 0 Then
               Exit
            Else
               as_ipaddress[li_idx] += String(Char(li_char))
            End If
         Next
         // get MAC address
         as_macaddress[li_idx] = ""
         li_submax = UpperBound(lstr_Adapter[li_idx].Address)
         For li_subidx = 1 To li_submax
            If li_subidx > 6 Then Exit
            li_char = lstr_Adapter[li_idx].Address[li_subidx]
            If li_subidx > 1 Then
               as_macaddress[li_idx] += "-"
            End If
            as_macaddress[li_idx] += of_Nbr2Hex(li_char, 2)
         Next
      Next
      Return True
   End If
End If

Return False

end function

on n_adapter.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_adapter.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on