Option Explicit On 
Option Strict Off

Imports System.runtime.InteropServices

Public Class clsNetwork

    <StructLayout(LayoutKind.Sequential)> _
    Public Structure SERVER_INFO_100
        Dim sv100_platform_id As Integer
        Dim sv100_name As Integer
    End Structure

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
    Public Structure SERVER_INFO_101
        Dim dwPlatformID As Integer
        Dim lpszServerName As String
        Dim dwVersionMajor As Integer
        Dim dwVersionMinor As Integer
        Dim dwType As Integer
        Dim lpszComment As String
    End Structure

    Public Const SV_TYPE_WORKSTATION As Integer = &H1S
    Public Const SV_TYPE_SERVER As Integer = &H2S
    Public Const SV_TYPE_SQLSERVER As Integer = &H4S
    Public Const SV_TYPE_DOMAIN_CTRL As Integer = &H8S
    Public Const SV_TYPE_DOMAIN_BAKCTRL As Integer = &H10S
    Public Const SV_TYPE_TIME_SOURCE As Integer = &H20S
    Public Const SV_TYPE_AFP As Integer = &H40S
    Public Const SV_TYPE_NOVELL As Integer = &H80S
    Public Const SV_TYPE_DOMAIN_MEMBER As Integer = &H100S
    Public Const SV_TYPE_PRINTQ_SERVER As Integer = &H200S
    Public Const SV_TYPE_DIALIN_SERVER As Integer = &H400S
    Public Const SV_TYPE_XENIX_SERVER As Integer = &H800S
    Public Const SV_TYPE_SERVER_UNIX As Integer = SV_TYPE_XENIX_SERVER
    Public Const SV_TYPE_NT As Integer = &H1000S
    Public Const SV_TYPE_WFW As Integer = &H2000S
    Public Const SV_TYPE_SERVER_MFPN As Integer = &H4000S
    Public Const SV_TYPE_SERVER_NT As Integer = &H8000S
    Public Const SV_TYPE_POTENTIAL_BROWSER As Integer = &H10000
    Public Const SV_TYPE_BACKUP_BROWSER As Integer = &H20000
    Public Const SV_TYPE_MASTER_BROWSER As Integer = &H40000
    Public Const SV_TYPE_DOMAIN_MASTER As Integer = &H80000
    Public Const SV_TYPE_SERVER_OSF As Integer = &H100000
    Public Const SV_TYPE_SERVER_VMS As Integer = &H200000
    Public Const SV_TYPE_WINDOWS As Integer = &H400000 'Windows95 and above 
    Public Const SV_TYPE_DFS As Integer = &H800000 'Root of a DFS tree 
    Public Const SV_TYPE_CLUSTER_NT As Integer = &H1000000 'NT Cluster 
    Public Const SV_TYPE_TERMINALSERVER As Integer = &H2000000 'TerminalServer 
    Public Const SV_TYPE_DCE As Integer = &H10000000 'IBM DSS 
    Public Const SV_TYPE_ALTERNATE_XPORT As Integer = &H20000000 'rtnalternate transport 
    Public Const SV_TYPE_LOCAL_LIST_ONLY As Integer = &H40000000 'rtn localonly 
    Public Const SV_TYPE_DOMAIN_ENUM As Integer = &H80000000
    Public Const SV_TYPE_ALL As Integer = &HFFFFFFFF
    Public Const SV_PLATFORM_ID_OS2 As Integer = 400
    Public Const SV_PLATFORM_ID_NT As Integer = 500

    Public Const MAJOR_VERSION_MASK As Integer = &HFS

    Public Const MAX_PREFERRED_LENGTH As Integer = -1
    Public Const NERR_SUCCESS As Integer = 0&
    Public Const ERROR_REQ_NOT_ACCEP As Integer = 71&
    Public Const ERROR_MORE_DATA As Integer = 234&
    Public Const NERR_BASE As Integer = 2100
    Public Const NERR_InvalidComputer = (NERR_BASE + 251)
    '<MarshalAs(UnmanagedType.LPStr)> _
    'Public Const LMCSTR As Int32 = LPCSTR
    '<MarshalAs(UnmanagedType.LPStr)> _
    'Public Const LPCSTR As Int32 = UnmanagedType.LPStr

    Private Declare Function NetApiBufferFree Lib "netapi32" (ByVal BufPtr As IntPtr) As Integer

    Private Declare Unicode Function NetServerEnum Lib "netapi32" (ByVal Servername As IntPtr, ByVal Level As Integer, _
    ByRef bufptr As IntPtr, ByVal PrefMaxLen As Integer, ByRef entriesread As Integer, ByRef TotalEntries As Integer, _
    ByVal serverType As Integer, ByVal Domain As IntPtr, ByVal ResumeHandle As Integer) As Integer

    Public Function GetServers(ByVal sDomain As String, ByVal sType As Integer) As ArrayList

        Dim se101 As SERVER_INFO_101 = New SERVER_INFO_101
        Dim bufptr As IntPtr
        Dim dwEntriesread As Integer
        Dim dwTotalentries As Integer
        Dim dwResumehandle As Integer
        Dim success As Integer
        Dim nStructSize As Integer
        Dim Cnt As Integer

        nStructSize = Marshal.SizeOf(se101)
        success = NetServerEnum(IntPtr.Zero, 101, bufptr, MAX_PREFERRED_LENGTH, dwEntriesread, dwTotalentries, sType, IntPtr.Zero, dwResumehandle)
        'success = 71 'NO ACTIVE 'DOMAIN'
        Dim compNames As New ArrayList
        If success = NERR_SUCCESS And success <> ERROR_MORE_DATA Then
            For Cnt = 0 To dwEntriesread - 1
                se101 = DirectCast(Marshal.PtrToStructure(New IntPtr(bufptr.ToInt32 + (nStructSize * Cnt)), GetType(SERVER_INFO_101)), SERVER_INFO_101)
                compNames.Add(se101.lpszServerName)
                Application.DoEvents()
            Next
        End If
        Call NetApiBufferFree(bufptr)
        Return compNames

    End Function

End Class
