Enumerate Network Resources (Windows)

Share your advanced PureBasic knowledge/code with the community.
ABBKlaus
Addict
Addict
Posts: 1143
Joined: Sat Apr 10, 2004 1:20 pm
Location: Germany

Enumerate Network Resources (Windows)

Post by ABBKlaus »

Code updated for 5.20+

Code: Select all

; '==============================================================================
; '  Network Resource List.
; '  Enumerate all of the networks and network resources available to the
; '  current machine.
; ' converted using http://www.powerbasic.com/support/forums/Forum6/HTML/001494.html
; '==============================================================================
#Window_Main = 0
#Gadget_ListIcon = 0

Structure NEWNETRESOURCE
  Scope.s
  Type.s
  DisplayType.s
  Usage.s
  LocalName.s
  RemoteName.s
  Comment.s
  Provider.s
EndStructure

Global NewList ListNETRESOURCE.NEWNETRESOURCE()

Procedure EnumAll(*nr.NETRESOURCE)
  tempnr.NETRESOURCE
  j.l
  x.l
  Entries = -1
  nSize = 16384
  *Buffer=AllocateMemory(nSize)
  ec = WNetOpenEnum_(#RESOURCE_GLOBALNET, #RESOURCETYPE_ANY, #Null, *nr, @hEnum)
  If hEnum
    ec = WNetEnumResource_(hEnum, @Entries, *Buffer, @nSize)
    ;      CreateFile(#1,"test.bin")    ; only for testing purposes
    ;      WriteData(*Buffer,nSize)
    ;      CloseFile(#1)
    For x = 1 To Entries
      j = (x-1) * SizeOf(NETRESOURCE)
      tempnr\dwScope        = PeekL(*Buffer+j+0)
      tempnr\dwType         = PeekL(*Buffer+j+4)
      tempnr\dwDisplayType  = PeekL(*Buffer+j+8)
      tempnr\dwUsage        = PeekL(*Buffer+j+12)
      tempnr\lpLocalName    = PeekL(*Buffer+j+16)
      tempnr\lpRemoteName   = PeekL(*Buffer+j+20)
      tempnr\lpComment      = PeekL(*Buffer+j+24)
      tempnr\lpProvider     = PeekL(*Buffer+j+28)
      AddElement(ListNETRESOURCE())
      Select tempnr\dwScope
        Case #RESOURCE_CONNECTED
          ListNETRESOURCE()\Scope = "#RESOURCE_CONNECTED"
        Case #RESOURCE_GLOBALNET
          ListNETRESOURCE()\Scope = "#RESOURCE_GLOBALNET"
        Case #RESOURCE_REMEMBERED
          ListNETRESOURCE()\Scope = "#RESOURCE_REMEMBERED"
        Default
          ListNETRESOURCE()\Scope = "dwScope unknown"
      EndSelect
      Select tempnr\dwType
        Case #RESOURCETYPE_ANY
          ListNETRESOURCE()\Type = "#RESOURCETYPE_ANY"
        Case #RESOURCETYPE_DISK
          ListNETRESOURCE()\Type = "#RESOURCETYPE_DISK"
        Case #RESOURCETYPE_PRINT
          ListNETRESOURCE()\Type = "#RESOURCETYPE_PRINT"
        Default
          ListNETRESOURCE()\Type = "dwType unknown"
      EndSelect
      Select tempnr\dwDisplayType
        Case #RESOURCEDISPLAYTYPE_DOMAIN
          ListNETRESOURCE()\DisplayType = "#RESOURCEDISPLAYTYPE_DOMAIN"
        Case #RESOURCEDISPLAYTYPE_GENERIC
          ListNETRESOURCE()\DisplayType = "#RESOURCEDISPLAYTYPE_GENERIC"
        Case #RESOURCEDISPLAYTYPE_SERVER
          ListNETRESOURCE()\DisplayType = "#RESOURCEDISPLAYTYPE_SERVER"
        Case #RESOURCEDISPLAYTYPE_SHARE
          ListNETRESOURCE()\DisplayType = "#RESOURCEDISPLAYTYPE_SHARE"
        Default
          ListNETRESOURCE()\DisplayType = "dwDisplayType unknown"
      EndSelect
      Select tempnr\dwUsage
        Case #RESOURCEUSAGE_CONNECTABLE
          ListNETRESOURCE()\Usage = "#RESOURCEUSAGE_CONNECTABLE"
        Case #RESOURCEUSAGE_CONTAINER
          ListNETRESOURCE()\Usage = "#RESOURCEUSAGE_CONTAINER"
        Default
          ListNETRESOURCE()\Usage = "dwUsage unknown"
      EndSelect
      If tempnr\lpLocalName
        ListNETRESOURCE()\LocalName = PeekS(tempnr\lpLocalName)
      Else
        ListNETRESOURCE()\LocalName = ""
      EndIf
      If tempnr\lpRemoteName
        ListNETRESOURCE()\RemoteName = PeekS(tempnr\lpRemoteName)
      Else
        ListNETRESOURCE()\RemoteName = ""
      EndIf
      If tempnr\lpComment
        ListNETRESOURCE()\Comment = PeekS(tempnr\lpComment)
      Else
        ListNETRESOURCE()\Comment = ""
      EndIf
      If tempnr\lpProvider
        ListNETRESOURCE()\Provider = PeekS(tempnr\lpProvider)
      Else
        ListNETRESOURCE()\Provider = ""
      EndIf
      If (tempnr\dwUsage And #RESOURCEUSAGE_CONTAINER)
        EnumAll (tempnr)
      EndIf
    Next
    WNetCloseEnum_(hEnum)
    FreeMemory(*Buffer)
  EndIf
EndProcedure

;
; Main starts here
;
EnumAll(#Null)

Quit = #False
WindowXSize = 800
WindowYSize = 320
If OpenWindow(#Window_Main, 0, 0, WindowXSize, WindowYSize, "MyWindow", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  AddKeyboardShortcut(0, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
    SetGadgetFont(#PB_Default, LoadFont(0, "Verdana", 7))
    ListIconGadget(#Gadget_ListIcon, 10, 10, WindowXSize - 20, WindowYSize - 20, "Local name", 120, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
    AddGadgetColumn(#Gadget_ListIcon, 1, "Remote name", 120)
    AddGadgetColumn(#Gadget_ListIcon, 2, "Scope", 120)
    AddGadgetColumn(#Gadget_ListIcon, 3, "Type", 120)
    AddGadgetColumn(#Gadget_ListIcon, 4, "Display type", 120)
    AddGadgetColumn(#Gadget_ListIcon, 5, "Usage", 120)
    AddGadgetColumn(#Gadget_ListIcon, 7, "Comment", 120)
    AddGadgetColumn(#Gadget_ListIcon, 8, "Provider", 120)
    FirstElement(ListNETRESOURCE())
    Repeat
      s.s = ListNETRESOURCE()\Scope + Chr(10)
      s   + ListNETRESOURCE()\Type + Chr(10)
      s   + ListNETRESOURCE()\DisplayType + Chr(10)
      s   + ListNETRESOURCE()\Usage + Chr(10)
      s   + ListNETRESOURCE()\LocalName + Chr(10)
      s   + ListNETRESOURCE()\RemoteName + Chr(10)
      s   + ListNETRESOURCE()\Comment + Chr(10)
      s   + ListNETRESOURCE()\Provider + Chr(10)
      AddGadgetItem(#Gadget_ListIcon,-1,s)
    Until NextElement(ListNETRESOURCE())=0

  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = #True
      Case #PB_Event_Menu
        Select EventMenu()
          Case #PB_Shortcut_Escape
            Quit = #True
        EndSelect
      Case #PB_Event_Gadget
        Select EventGadget()
        EndSelect
      Case #WM_SIZE
        WindowXsize = WindowWidth(#Window_Main)
        WindowYSize = WindowHeight(#Window_Main)
        ResizeGadget(#Gadget_ListIcon, 10, 10, WindowXSize - 20, WindowYSize - 20)
      Default
    EndSelect
  Until Quit
EndIf
End
just moved this from previous topic Enumerate Com-Ports:
viewtopic.php?t=10300