VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "DMNetwork"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

Private Const SV_TYPE_DOMAIN_ENUM = &H80000000
Private Const SV_TYPE_ALL = &HFFFFFFFF

Private Type SERVER_INFO_101
  dw_platform_id As Long
  ptr_name As Long
  dw_ver_major As Long
  dw_ver_minor As Long
  dw_type As Long
  ptr_comment As Long
End Type

Private Declare Function NetServerEnum Lib "Netapi32.dll" (vServername As Any, ByVal lLevel As Long, vBufptr As Any, lPrefmaxlen As Long, lEntriesRead As Long, lTotalEntries As Long, vServerType As Any, ByVal sDomain As String, vResumeHandle As Any) As Long
Private Declare Sub RtlMoveMemory Lib "Kernel32" (dest As Any, vSrc As Any, ByVal lSize&)
Private Declare Sub lstrcpyW Lib "Kernel32" (vDest As Any, ByVal sSrc As Any)
Private Declare Function NetApiBufferFree Lib "Netapi32.dll" (ByVal lpBuffer As Long) As Long

Public Function Domains() As Collection
Dim lReturn As Long
Dim Server_Info As Long
Dim lEntries As Long
Dim lTotal As Long
Dim lMax As Long
Dim vResume As Variant
Dim tServer_info_101 As SERVER_INFO_101
Dim sServer As String
Dim sDomain As String
Dim lServerInfo101StructPtr As Long
Dim X As Long, i As Long
Dim bBuffer(512) As Byte

  Set Domains = New Collection
  
  lReturn = NetServerEnum(ByVal 0&, 101, Server_Info, lMax, lEntries, lTotal, ByVal SV_TYPE_DOMAIN_ENUM, sDomain, vResume)
  If lReturn <> 0 Then Exit Function
  
  X = 1
  lServerInfo101StructPtr = Server_Info
  Do While X <= lTotal
    RtlMoveMemory tServer_info_101, ByVal lServerInfo101StructPtr, Len(tServer_info_101)
    lstrcpyW bBuffer(0), tServer_info_101.ptr_name
    i = 0
    Do While bBuffer(i) <> 0
      sServer = sServer & Chr$(bBuffer(i))
      i = i + 2
    Loop
    Domains.Add sServer
    X = X + 1
    sServer = ""
    lServerInfo101StructPtr = lServerInfo101StructPtr + Len(tServer_info_101)
  Loop

  lReturn = NetApiBufferFree(Server_Info)

End Function

Public Function Servers(Domain As String) As Collection
Dim lReturn As Long
Dim Server_Info As Long
Dim lEntries As Long
Dim lTotal As Long
Dim lMax As Long
Dim vResume As Variant
Dim tServer_info_101 As SERVER_INFO_101
Dim sServer As String
Dim sDomain As String
Dim lServerInfo101StructPtr As Long
Dim X As Long, i As Long
Dim bBuffer(512) As Byte

  Set Servers = New Collection
  
  sDomain = StrConv(Domain, vbUnicode)

  lReturn = NetServerEnum(ByVal 0&, 101, Server_Info, lMax, lEntries, lTotal, ByVal SV_TYPE_ALL, sDomain, vResume)
  If lReturn <> 0 Then Exit Function

  X = 1
  lServerInfo101StructPtr = Server_Info
  Do While X <= lTotal
    RtlMoveMemory tServer_info_101, ByVal lServerInfo101StructPtr, Len(tServer_info_101)
    lstrcpyW bBuffer(0), tServer_info_101.ptr_name
    i = 0
    Do While bBuffer(i) <> 0
      sServer = sServer & Chr$(bBuffer(i))
      i = i + 2
    Loop
    Servers.Add sServer
    X = X + 1
    sServer = ""
    lServerInfo101StructPtr = lServerInfo101StructPtr + Len(tServer_info_101)
  Loop

  lReturn = NetApiBufferFree(Server_Info)


End Function

