Results 1 to 7 of 7

Thread: How to access structure pointer returned by Windows API

  1. #1
    Stanley Guest

    How to access structure pointer returned by Windows API

    Dear all,

    I'm trying to get MAC Address by calling Windows API (GetAdaptersInfo).

    Which return all adapters information in a linked list style. Each structure
    consist information of

    one adapter and there is a pointer 'Next' which is a pointer to next
    structure.

    I declare this 'Next' pointer as LONG in VBA.

    Now I can access the 1st structure only. Can anyone tell me how to use the
    'Next' pointer to access other structures?

    Thanks for help.

  2. #2
    Danny P. Guest
    This also isn't specifically what you asked for, but it might help.
    There are links to other methods of obtaining the mac address as well.

    http://vbnet.mvps.org/code/network/macaddressremote.htm

    Hope that helps,
    Danny Polkinhorn
    WATG
    Honolulu

    bcoward wrote:
    Stanley,

    See the VBA code in the attached spreadsheet for an example of obtaining MAC Address. Not what you've asked for but works.

    Good luck,

    Bob Coward
    CADS, Inc

    800-366-0946
    bcoward@mindspring.com

  3. #3
    Stanley Guest
    Dear All,

    Thanks for help.

  4. #4
    Stanley Guest
    Hi Bob,

    Thanks for your help. I've tried the attached spreadsheet program. It works
    fine if the connection is in active state.

    But if the network cable is disconnected the program returns all zeros.
    Because of this I need to use the API 'GetAdaptersInfo'.

    Which returns all adapters information even the network cable is
    disconnected.

    Anyway thanks for your comment.

  5. #5
    bcoward Guest
    Stanley,

    Understood, sorry about the spreadsheet, one of those had-n-grab code examples. Try this snippet then for GetAdaptersInfo API specific. I believe this addresses your original question iterating through the structure.

    Public Const MAX_HOSTNAME_LEN = 132
    Public Const MAX_DOMAIN_NAME_LEN = 132
    Public Const MAX_SCOPE_ID_LEN = 260
    Public Const MAX_ADAPTER_NAME_LENGTH = 260
    Public Const MAX_ADAPTER_ADDRESS_LENGTH = 8
    Public Const MAX_ADAPTER_DESCRIPTION_LENGTH = 132
    Public Const ERROR_BUFFER_OVERFLOW = 111
    Public Const MIB_IF_TYPE_ETHERNET = 1
    Public Const MIB_IF_TYPE_TOKENRING = 2
    Public Const MIB_IF_TYPE_FDDI = 3
    Public Const MIB_IF_TYPE_PPP = 4
    Public Const MIB_IF_TYPE_LOOPBACK = 5
    Public Const MIB_IF_TYPE_SLIP = 6

    Type IP_ADDR_STRING
    Next As Long
    IpAddress As String * 16
    IpMask As String * 16
    Context As Long
    End Type

    Type IP_ADAPTER_INFO
    Next As Long
    ComboIndex As Long
    AdapterName As String * MAX_ADAPTER_NAME_LENGTH
    Description As String * MAX_ADAPTER_DESCRIPTION_LENGTH
    AddressLength As Long
    Address(MAX_ADAPTER_ADDRESS_LENGTH - 1) As Byte
    Index As Long
    Type As Long
    DhcpEnabled As Long
    CurrentIpAddress As Long
    IpAddressList As IP_ADDR_STRING
    GatewayList As IP_ADDR_STRING
    DhcpServer As IP_ADDR_STRING
    HaveWins As Boolean
    PrimaryWinsServer As IP_ADDR_STRING
    SecondaryWinsServer As IP_ADDR_STRING
    LeaseObtained As Long
    LeaseExpires As Long
    End Type

    Type FIXED_INFO
    HostName As String * MAX_HOSTNAME_LEN
    DomainName As String * MAX_DOMAIN_NAME_LEN
    CurrentDnsServer As Long
    DnsServerList As IP_ADDR_STRING
    NodeType As Long
    ScopeId As String * MAX_SCOPE_ID_LEN
    EnableRouting As Long
    EnableProxy As Long
    EnableDns As Long
    End Type

    Public Declare Function GetNetworkParams Lib "IPHlpApi" (FixedInfo As Any, pOutBufLen As Long) As Long
    Public Declare Function GetAdaptersInfo Lib "IPHlpApi" (IpAdapterInfo As Any, pOutBufLen As Long) As Long
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Sub main()
    Dim error As Long
    Dim FixedInfoSize As Long
    Dim AdapterInfoSize As Long
    Dim i As Integer
    Dim PhysicalAddress As String
    Dim NewTime As Date
    Dim AdapterInfo As IP_ADAPTER_INFO
    Dim Adapt As IP_ADAPTER_INFO
    Dim AddrStr As IP_ADDR_STRING
    Dim FixedInfo As FIXED_INFO
    Dim Buffer As IP_ADDR_STRING
    Dim pAddrStr As Long
    Dim pAdapt As Long
    Dim Buffer2 As IP_ADAPTER_INFO
    Dim FixedInfoBuffer() As Byte
    Dim AdapterInfoBuffer() As Byte

    'Get the main IP configuration information for this machine using a FIXED_INFO structure
    FixedInfoSize = 0
    error = GetNetworkParams(ByVal 0&, FixedInfoSize)
    If error <> 0 Then
    If error <> ERROR_BUFFER_OVERFLOW Then
    MsgBox "GetNetworkParams sizing failed with error " & error
    Exit Sub
    End If
    End If
    ReDim FixedInfoBuffer(FixedInfoSize - 1)

    error = GetNetworkParams(FixedInfoBuffer(0), FixedInfoSize)
    If error = 0 Then
    CopyMemory FixedInfo, FixedInfoBuffer(0), Len(FixedInfo)
    MsgBox "Host Name: " & FixedInfo.HostName 'host name
    MsgBox "DNS Servers: " & FixedInfo.DnsServerList.IpAddress 'dns server IP
    pAddrStr = FixedInfo.DnsServerList.Next
    Do While pAddrStr <> 0
    CopyMemory Buffer, ByVal pAddrStr, Len(Buffer)
    MsgBox "DNS Servers: " & Buffer.IpAddress 'dns server IP
    pAddrStr = Buffer.Next
    Loop

    Select Case FixedInfo.NodeType 'node type
    Case 1
    MsgBox "Node type: Broadcast"
    Case 2
    MsgBox "Node type: Peer to peer"
    Case 4
    MsgBox "Node type: Mixed"
    Case 8
    MsgBox "Node type: Hybrid"
    Case Else
    MsgBox "Unknown node type"
    End Select

    MsgBox "NetBIOS Scope ID: " & FixedInfo.ScopeId 'scope ID
    'routing
    If FixedInfo.EnableRouting Then
    MsgBox "IP Routing Enabled "
    Else
    MsgBox "IP Routing not enabled"
    End If
    ' proxy
    If FixedInfo.EnableProxy Then
    MsgBox "WINS Proxy Enabled "
    Else
    MsgBox "WINS Proxy not Enabled "
    End If
    ' netbios
    If FixedInfo.EnableDns Then
    MsgBox "NetBIOS Resolution Uses DNS "
    Else
    MsgBox "NetBIOS Resolution Does not use DNS "
    End If
    Else
    MsgBox "GetNetworkParams failed with error " & error
    Exit Sub
    End If

    'Enumerate all of the adapter specific information using the IP_ADAPTER_INFO structure.
    'Note: IP_ADAPTER_INFO contains a linked list of adapter entries.

    AdapterInfoSize = 0
    error = GetAdaptersInfo(ByVal 0&, AdapterInfoSize)
    If error <> 0 Then
    If error <> ERROR_BUFFER_OVERFLOW Then
    MsgBox "GetAdaptersInfo sizing failed with error " & error
    Exit Sub
    End If
    End If
    ReDim AdapterInfoBuffer(AdapterInfoSize - 1)

    ' Get actual adapter information
    error = GetAdaptersInfo(AdapterInfoBuffer(0), AdapterInfoSize)
    If error <> 0 Then
    MsgBox "GetAdaptersInfo failed with error " & error
    Exit Sub
    End If
    CopyMemory AdapterInfo, AdapterInfoBuffer(0), Len(AdapterInfo)
    pAdapt = AdapterInfo.Next

    Do While pAdapt <> 0
    CopyMemory Buffer2, AdapterInfo, Len(Buffer2)
    Select Case Buffer2.Type
    Case MIB_IF_TYPE_ETHERNET
    MsgBox "Ethernet adapter "
    Case MIB_IF_TYPE_TOKENRING
    MsgBox "Token Ring adapter "
    Case MIB_IF_TYPE_FDDI
    MsgBox "FDDI adapter "
    Case MIB_IF_TYPE_PPP
    MsgBox "PPP adapter"
    Case MIB_IF_TYPE_LOOPBACK
    MsgBox "Loopback adapter "
    Case MIB_IF_TYPE_SLIP
    MsgBox "Slip adapter "
    Case Else
    MsgBox "Other adapter "
    End Select
    MsgBox " AdapterName: " & Buffer2.AdapterName
    MsgBox "AdapterDescription: " & Buffer2.Description 'adatpter name

    For i = 0 To Buffer2.AddressLength - 1
    PhysicalAddress = PhysicalAddress & Hex(Buffer2.Address(i))
    If i < Buffer2.AddressLength - 1 Then
    PhysicalAddress = PhysicalAddress & "-"
    End If

    Next
    MsgBox "Physical Address: " & PhysicalAddress 'mac address
    If Buffer2.DhcpEnabled Then
    MsgBox "DHCP Enabled "
    Else
    MsgBox "DHCP disabled"
    End If

    pAddrStr = Buffer2.IpAddressList.Next
    Do While pAddrStr <> 0
    CopyMemory Buffer, Buffer2.IpAddressList, LenB(Buffer)
    MsgBox "IP Address: " & Buffer.IpAddress
    MsgBox "Subnet Mask: " & Buffer.IpMask
    pAddrStr = Buffer.Next
    If pAddrStr <> 0 Then
    CopyMemory Buffer2.IpAddressList, ByVal pAddrStr, Len(Buffer2.IpAddressList)
    End If
    Loop
    MsgBox "Default Gateway: " & Buffer2.GatewayList.IpAddress
    pAddrStr = Buffer2.GatewayList.Next
    Do While pAddrStr <> 0
    CopyMemory Buffer, Buffer2.GatewayList, Len(Buffer)
    MsgBox "IP Address: " & Buffer.IpAddress
    pAddrStr = Buffer.Next
    If pAddrStr <> 0 Then
    CopyMemory Buffer2.GatewayList, ByVal pAddrStr, Len(Buffer2.GatewayList)
    End If
    Loop

    MsgBox "DHCP Server: " & Buffer2.DhcpServer.IpAddress
    MsgBox "Primary WINS Server: " & Buffer2.PrimaryWinsServer.IpAddress
    MsgBox "Secondary WINS Server: " & Buffer2.SecondaryWinsServer.IpAddress

    ' Display time
    NewTime = CDate(Adapt.LeaseObtained)
    MsgBox "Lease Obtained: " & CStr(NewTime)

    NewTime = CDate(Adapt.LeaseExpires)
    MsgBox "Lease Expires : " & CStr(NewTime)
    pAdapt = Buffer2.Next
    If pAdapt <> 0 Then
    CopyMemory AdapterInfo, ByVal pAdapt, Len(AdapterInfo)
    End If

    Loop

    End Sub


    Regards and good luck,

    Bob Coward
    CADS, Inc

    800-366-0946
    bcoward@mindspring.com

  6. #6
    Stanley Guest
    Dear Bob,

    Thank you. I've learn so much from you.

    Best regards.

    Stanley.

  7. #7
    bcoward Guest
    And a Merry Christmas to you too...Happy holidays all

Similar Threads

  1. PDM: vault's structure
    By John23 in forum SolidWorks
    Replies: 1
    Last Post: 06-09-2005, 03:54 PM
  2. sec file folder pointer?
    By piearesquared2@yahoo.com in forum Pro/Engineer
    Replies: 3
    Last Post: 05-12-2005, 08:33 PM
  3. Null Pointer Problem
    By R. Hayden in forum Printing
    Replies: 0
    Last Post: 03-03-2005, 06:51 PM
  4. PC3 "unexpected null pointer"
    By jdrm in forum Printing
    Replies: 2
    Last Post: 02-03-2005, 09:43 PM
  5. windows last-access time
    By wkiernan in forum Customization
    Replies: 0
    Last Post: 12-30-2004, 03:41 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Other forums: Access Forum - Microsoft Office Forum - Exchange Server Forum