Network list manager info

by Pierre Bellisle

'Network list manager query

#COMPILE EXE '#Win 8.04#
#DIM ALL
#REGISTER NONE
#INCLUDE "Win32Api.inc"
'#RESOURCE ".pbr" 'Add a resource with manifest for better look, see at the end of code for an example.

GLOBAL hDlg AS DWORD

%ButtonRefresh = 101
%Textbox       = 201

$CLSID_NetworkListManager      = GUID$("{DCB00C01-570F-4A9B-8D69-199FDBA5723B}")
$IID_INetworkListManager       = GUID$("{DCB00000-570F-4A9B-8D69-199FDBA5723B}")

%NLM_ENUM_NETWORK_CONNECTED    = 1
%NLM_ENUM_NETWORK_DISCONNECTED = 2
%NLM_ENUM_NETWORK_ALL          = 3

%VT_UNIT                       = 23
%L2_PROFILE_MAX_NAME_LENGTH    = 256
%WLAN_MAX_NAME_LENGTH          = %L2_PROFILE_MAX_NAME_LENGTH

%NLM_ENUM_NETWORK_CONNECTED    = &H1???
%NLM_ENUM_NETWORK_DISCONNECTED = &H2???
%NLM_ENUM_NETWORK_ALL          = &H3???

%CLSCTX_INPROC_SERVER          = &H1???
%CLSCTX_INPROC_HANDLER         = &H2???
%CLSCTX_LOCAL_SERVER           = &H4???
%CLSCTX_REMOTE_SERVER          = &H10???
%CLSCTX_ALL = %CLSCTX_INPROC_SERVER OR %CLSCTX_INPROC_HANDLER OR %CLSCTX_LOCAL_SERVER OR %CLSCTX_REMOTE_SERVER

%NLM_DOMAIN_TYPE_NON_DOMAIN_NETWORK   = 0
%NLM_DOMAIN_TYPE_DOMAIN_NETWORK       = 1
%NLM_DOMAIN_TYPE_DOMAIN_AUTHENTICATED = 2

%NLM_CONNECTIVITY_DISCONNECTED             = &H0000???
%NLM_CONNECTIVITY_IPV4_NOTRAFFIC           = &H0001???
%NLM_CONNECTIVITY_IPV6_NOTRAFFIC           = &H0002???
%NLM_CONNECTIVITY_IPV4_SUBNET              = &H0010???
%NLM_CONNECTIVITY_IPV4_LOCALNETWORK        = &H0020???
%NLM_CONNECTIVITY_IPV4_INTERNET            = &H0040???
%NLM_CONNECTIVITY_IPV6_SUBNET              = &H0100???
%NLM_CONNECTIVITY_IPV6_LOCALNETWORK        = &H0200???
%NLM_CONNECTIVITY_IPV6_INTERNET            = &H0400???
%NLM_NETWORK_CATEGORY_PUBLIC               = 0
%NLM_NETWORK_CATEGORY_PRIVATE              = 1
%NLM_NETWORK_CATEGORY_DOMAIN_AUTHENTICATED = 2
'______________________________________________________________________________

FUNCTION VistaOrNewer() AS LONG 'True if running Vista or newer
 LOCAL OsVersionInf AS OSVERSIONINFO

 OsVersionInf.dwOSVersionInfoSize = SIZEOF(OSVERSIONINFO)
 GetVersionEx(OsVersionInf)
 IF (OsVersionInf.dwMajorVersion >= 6) THEN FUNCTION = %TRUE 'Xp is 5.1, Vista is 6.0

END FUNCTION
'______________________________________________________________________________

FUNCTION nlmCoCreateInstanceErrorSGet(dwError AS DWORD) AS STRING

 SELECT CASE LONG dwError
   CASE %S_OK                  : FUNCTION = "An instance of the specified object class was successfully created."
   CASE %REGDB_E_CLASSNOTREG   : FUNCTION = "A specified class is not registered in the registration database." & _
                                            "Also can indicate that the type of server you requested in the CLSCTX enumeration is not registered or the values for the server types in the registry are corrupt."
   CASE %CLASS_E_NOAGGREGATION : FUNCTION = "This class cannot be created as part of an aggregate."
   CASE %E_NOINTERFACE         : FUNCTION = "No such interface supported. The specified class does not implement the requested interface, or the controlling IUnknown does not expose the requested interface."
   CASE %E_POINTER             : FUNCTION = "Invalid pointer. The ppv parameter is NULL."
   CASE ELSE                   : FUNCTION = "(Unknown" & STR$(dwError) & " 0x" & HEX$(dwError, 8) & ")"
 END SELECT

END FUNCTION
'______________________________________________________________________________

FUNCTION nlmDomainTypeSGet(dwDomainType AS DWORD) AS STRING

 SELECT CASE dwDomainType
   CASE %NLM_DOMAIN_TYPE_NON_DOMAIN_NETWORK   : FUNCTION = "NLM_DOMAIN_TYPE_NON_DOMAIN_NETWORK 0x0"
   CASE %NLM_DOMAIN_TYPE_DOMAIN_NETWORK       : FUNCTION = "NLM_DOMAIN_TYPE_DOMAIN_NETWORK 0x01"
   CASE %NLM_DOMAIN_TYPE_DOMAIN_AUTHENTICATED : FUNCTION = "NLM_DOMAIN_TYPE_DOMAIN_AUTHENTICATED 0x02"
   CASE ELSE                                  : FUNCTION = "(Unknown NLM_DOMAIN_TYPE" & STR$(dwDomainType) & ")"
 END SELECT

END FUNCTION
'______________________________________________________________________________

FUNCTION nlmCategorySGet(Category AS DWORD) AS STRING

 SELECT CASE Category
   CASE %NLM_NETWORK_CATEGORY_PUBLIC               : FUNCTION = "The network is a public (untrusted) network. NLM_NETWORK_CATEGORY_PUBLIC 0x0"
   CASE %NLM_NETWORK_CATEGORY_PRIVATE              : FUNCTION = "The network is a private (trusted) network. NLM_NETWORK_CATEGORY_PRIVATE 0x1"
   CASE %NLM_NETWORK_CATEGORY_DOMAIN_AUTHENTICATED : FUNCTION = "The network is authenticated against an Active Directory domain. NLM_NETWORK_CATEGORY_DOMAIN_AUTHENTICATED 0x2"
   CASE ELSE                                       : FUNCTION = "(Unknown NLM_NETWORK_CATEGORY" & STR$(Category) & ")"
 END SELECT

END FUNCTION
'______________________________________________________________________________

FUNCTION nlmComErrorSGet(dwError AS DWORD) AS STRING

 SELECT CASE LONG dwError
   CASE %S_OK           : FUNCTION = "Success. S_OK  %NOERROR 0x00000000"
   CASE %S_FALSE        : FUNCTION = "Success. S_FALSE  0x00000001"
   CASE %E_UNEXPECTED   : FUNCTION = "Catastrophic failure E_UNEXPECTED 0x8000FFFF"
   CASE %E_NOTIMPL      : FUNCTION = "Not implemented E_NOTIMPL 0x80004001"
   CASE %E_OUTOFMEMORY  : FUNCTION = "Ran out of memory E_OUTOFMEMORY 0x8007000E"
   CASE %E_INVALIDARG   : FUNCTION = "One or more arguments are invalid E_INVALIDARG 0x80070057"
   CASE %E_NOINTERFACE  : FUNCTION = "No such interface supported E_NOINTERFACE 0x80004002"
   CASE %E_POINTER      : FUNCTION = "Invalid pointer E_POINTER 0x80004003"
   CASE %E_HANDLE       : FUNCTION = "Invalid handle E_HANDLE 0x80070006"
   CASE %E_ABORT        : FUNCTION = "Operation aborted E_ABORT 0x80004004"
   CASE %E_FAIL         : FUNCTION = "Unspecified error E_FAIL 0x80004005"
   CASE %E_ACCESSDENIED : FUNCTION = "General access denied error E_ACCESSDENIED 0x80070005"
   CASE %E_PENDING      : FUNCTION = "The data necessary to complete this operation is not yet available. E_PENDING 0x8000000A"
   CASE ELSE            : FUNCTION = "(Unknown" & STR$(dwError) & " 0x" & HEX$(dwError, 8) & ")"
 END SELECT

END FUNCTION
'______________________________________________________________________________

FUNCTION ConnectivitySGet(Connectivity AS DWORD, SpacingChar AS STRING) AS STRING
 LOCAL sBuf AS STRING

 IF (Connectivity AND %NLM_CONNECTIVITY_DISCONNECTED     ) THEN sBuf = sBuf & SpacingChar & "     The underlying network interfaces have no connectivity to any network. NLM_CONNECTIVITY_DISCONNECTED 0x0"                        & $CRLF
 IF (Connectivity AND %NLM_CONNECTIVITY_IPV4_NOTRAFFIC   ) THEN sBuf = sBuf & SpacingChar & "     There is connectivity to a network, but the service cannot detect any IPv4 Network Traffic. NLM_CONNECTIVITY_IPV4_NOTRAFFIC 0x1" & $CRLF
 IF (Connectivity AND %NLM_CONNECTIVITY_IPV6_NOTRAFFIC   ) THEN sBuf = sBuf & SpacingChar & "     There is connectivity to a network, but the service cannot detect any IPv6 Network Traffic. NLM_CONNECTIVITY_IPV6_NOTRAFFIC 0x2" & $CRLF
 IF (Connectivity AND %NLM_CONNECTIVITY_IPV4_SUBNET      ) THEN sBuf = sBuf & SpacingChar & "     There is connectivity to the local subnet using the IPv4 protocol. NLM_CONNECTIVITY_IPV4_SUBNET 0x10"                            & $CRLF
 IF (Connectivity AND %NLM_CONNECTIVITY_IPV4_LOCALNETWORK) THEN sBuf = sBuf & SpacingChar & "     There is connectivity to a routed network using the IPv4 protocol. NLM_CONNECTIVITY_IPV4_LOCALNETWORK 0x20"                      & $CRLF
 IF (Connectivity AND %NLM_CONNECTIVITY_IPV4_INTERNET    ) THEN sBuf = sBuf & SpacingChar & "     There is connectivity to the Internet using the IPv4 protocol. NLM_CONNECTIVITY_IPV4_INTERNET 0x40"                              & $CRLF
 IF (Connectivity AND %NLM_CONNECTIVITY_IPV6_SUBNET      ) THEN sBuf = sBuf & SpacingChar & "     There is connectivity to the local subnet using the IPv6 protocol. NLM_CONNECTIVITY_IPV6_SUBNET 0x100"                           & $CRLF
 IF (Connectivity AND %NLM_CONNECTIVITY_IPV6_LOCALNETWORK) THEN sBuf = sBuf & SpacingChar & "     There is connectivity to a local network using the IPv6 protocol. NLM_CONNECTIVITY_IPV6_LOCALNETWORK 0x200"                      & $CRLF
 IF (Connectivity AND %NLM_CONNECTIVITY_IPV6_INTERNET    ) THEN sBuf = sBuf & SpacingChar & "     There is connectivity to the Internet using the IPv6 protocol. NLM_CONNECTIVITY_IPV6_INTERNET 0x400"                             & $CRLF
 IF LEN(sBuf) THEN
   FUNCTION = LEFT$(sBuf, -2)
 ELSE
   FUNCTION = "(Connectivity error" & STR$(Connectivity) & " 0x" & HEX$(Connectivity, 8) & ")"
 END IF

END FUNCTION
'______________________________________________________________________________

FUNCTION VariantTypeSGet(vType AS DWORD) AS STRING
 LOCAL sBuf AS STRING

 SELECT CASE (vType AND &H0FFF)
   CASE (%VT_EMPTY           ) : sBuf = "%VT_EMPTY           00 0 or Empty string"   & $CRLF
   CASE (%VT_NULL            ) : sBuf = "%VT_NULL            01 Null string"         & $CRLF
   CASE (%VT_I2              ) : sBuf = "%VT_I2              02 Integer"             & $CRLF
   CASE (%VT_I4              ) : sBuf = "%VT_I4              03 Long-Integer"        & $CRLF
   CASE (%VT_R4              ) : sBuf = "%VT_R4              04 Single"              & $CRLF
   CASE (%VT_R8              ) : sBuf = "%VT_R8              05 Double"              & $CRLF
   CASE (%VT_CY              ) : sBuf = "%VT_CY              06 Currency"            & $CRLF
   CASE (%VT_DATE            ) : sBuf = "%VT_DATE            07 Date"                & $CRLF
   CASE (%VT_BSTR            ) : sBuf = "%VT_BSTR            08 Dynamic String"      & $CRLF
   CASE (%VT_DISPATCH        ) : sBuf = "%VT_DISPATCH        09 Interface reference" & $CRLF
   CASE (%VT_ERROR           ) : sBuf = "%VT_ERROR           10 Error Code"          & $CRLF
   CASE (%VT_BOOL            ) : sBuf = "%VT_BOOL            11 Boolean"             & $CRLF
   CASE (%VT_VARIANT         ) : sBuf = "%VT_VARIANT         12 Variant"             & $CRLF
   CASE (%VT_UNKNOWN         ) : sBuf = "%VT_UNKNOWN         13 VT_UNKNOWN"          & $CRLF
   CASE (%VT_I1              ) : sBuf = "%VT_I1              16 Byte"                & $CRLF
   CASE (%VT_UI1             ) : sBuf = "%VT_UI1             17 Byte"                & $CRLF
   CASE (%VT_UI2             ) : sBuf = "%VT_UI2             18 Word"                & $CRLF
   CASE (%VT_UI4             ) : sBuf = "%VT_UI4             19 DWORD"               & $CRLF
   CASE (%VT_I8              ) : sBuf = "%VT_I8              20 Quad (signed)"       & $CRLF
   CASE (%VT_UI8             ) : sBuf = "%VT_UI8             21 Quad (unsigned)"     & $CRLF
   CASE (%VT_INT             ) : sBuf = "%VT_INT             22 Integer"             & $CRLF
   CASE (%VT_UNIT            ) : sBuf = "%VT_UNIT            23 Word"                & $CRLF
   CASE (%VT_VOID            ) : sBuf = "%VT_VOID            24 VT_VOID"             & $CRLF
   CASE (%VT_HRESULT         ) : sBuf = "%VT_HRESULT         25 COM result code"     & $CRLF
   CASE (%VT_PTR             ) : sBuf = "%VT_PTR             26 Pointer"             & $CRLF
   CASE (%VT_SAFEARRAY       ) : sBuf = "%VT_SAFEARRAY       27 VB Array"            & $CRLF
   CASE (%VT_CARRAY          ) : sBuf = "%VT_CARRAY          28 VT_CARRAY"           & $CRLF
   CASE (%VT_USERDEFINED     ) : sBuf = "%VT_USERDEFINED     29 VT_USERDEFINED"      & $CRLF
   CASE (%VT_LPSTR           ) : sBuf = "%VT_LPSTR           30 ANSI string"         & $CRLF
   CASE (%VT_LPWSTR          ) : sBuf = "%VT_LPWSTR          31 Unicode string"      & $CRLF
   CASE (%VT_FILETIME        ) : sBuf = "%VT_FILETIME        64 VT_FILETIME"         & $CRLF
   CASE (%VT_BLOB            ) : sBuf = "%VT_BLOB            65 VT_BLOB"             & $CRLF
   CASE (%VT_STREAM          ) : sBuf = "%VT_STREAM          66 VT_STREAM"           & $CRLF
   CASE (%VT_STORAGE         ) : sBuf = "%VT_STORAGE         67 VT_STORAGE"          & $CRLF
   CASE (%VT_STREAMED_OBJECT ) : sBuf = "%VT_STREAMED_OBJECT 68 VT_STREAMED_OBJECT"  & $CRLF
   CASE (%VT_STORED_OBJECT   ) : sBuf = "%VT_STORED_OBJECT   69 VT_STORED_OBJECT"    & $CRLF
   CASE (%VT_BLOB_OBJECT     ) : sBuf = "%VT_BLOB_OBJECT     70 VT_BLOB_OBJECT"      & $CRLF
   CASE (%VT_CF              ) : sBuf = "%VT_CF              71 VT_CF"               & $CRLF
   CASE (%VT_CLSID           ) : sBuf = "%VT_CLSID           72 Class ID"            & $CRLF
  CASE ELSE                    : sBuf = "(Unknown" & STR$(vType AND &H0FFF) & " 0x" & HEX$(vType AND &H0FFF, 8) & ")" & $CRLF
 END SELECT

 IF (vType AND %VT_VECTOR) THEN sBuf = sBuf & "%VT_VECTOR 0x1000 Vector"  & $CRLF
 IF (vType AND %VT_ARRAY)  THEN sBuf = sBuf & "%VT_ARRAY  0x2000 Array"   & $CRLF
 IF (vType AND %VT_BYREF)  THEN sBuf = sBuf & "%VT_BYREF  0x4000 Byref"   & $CRLF
 FUNCTION = sBuf

END FUNCTION
'______________________________________________________________________________

FUNCTION pUnicodeToAnsi(BYVAL pUnicode AS DWORD)AS STRING
 LOCAL CharCount AS DWORD
 LOCAL sAnsi     AS STRING

 CharCount = Lstrlenw(BYVAL pUnicode)
 sAnsi = NUL$(CharCount)
 WideCharToMultiByte(%CP_ACP, %NULL, BYVAL pUnicode, CharCount, _
                     BYVAL STRPTR(sAnsi), CharCount, BYVAL %NULL, BYVAL %NULL)
 FUNCTION = sAnsi

END FUNCTION
'______________________________________________________________________________

FUNCTION FileTimeToInternationalTime(File_Time AS FILETIME) AS STRING
 LOCAL Sys_Time AS SYSTEMTIME

 FileTimeToSystemTime(File_Time, Sys_Time)

 FUNCTION = _
   FORMAT$(Sys_Time.wyear, "0000") & "-" & FORMAT$(Sys_Time.wMonth,  "00") & "-" & _
   FORMAT$(Sys_Time.wDay,    "00") & " " & FORMAT$(Sys_Time.wHour,   "00") & ":" & _
   FORMAT$(Sys_Time.wMinute, "00") & ":" & FORMAT$(Sys_Time.wSecond, "00") & " " & _
   "(" & FORMAT$(Sys_Time.wMilliSeconds, "000") & " milliseconds) " & _
   CHOOSE$(Sys_Time.wDayOfWeek + 1, "Sunday", "Monday", "Tuesday", "Wednesday", _
                                    "Thursday", "Friday", "Saturday")

END FUNCTION
'______________________________________________________________________________

FUNCTION M_CALLs(BYVAL ObjectPtr AS DWORD, BYVAL MethodName AS DWORD, BYVAL vCount AS DWORD, OPTIONAL BYVAL v1 AS DWORD, _
                 BYVAL v2 AS DWORD, BYVAL v3 AS DWORD, BYVAL v4 AS DWORD, BYVAL v5 AS DWORD) AS LONG

 !cmp vCount, 5
 !je V5Valid
 !cmp vCount, 4
 !je V4Valid
 !cmp vCount, 3
 !je V3Valid
 !cmp vCount, 2
 !je V2Valid
 !cmp vCount, 1
 !je V1Valid
 !jmp Done

 V5Valid:
 ! push v5
 V4Valid:
 ! push v4
 V3Valid:
 ! push v3
 V2Valid:
 ! push v2
 V1Valid:
 ! push v1
 Done:                        'Thank you José...
 ! mov eax, ObjectPtr         'Move pointer to COM object into eax
 ! mov ecx, MethodName        'Move method to execute into ecx
 ! push eax
 ! mov eax, [eax]             'Move pointer to eax into eax
 ! CALL DWORD PTR [eax + ecx] 'Call method offset
 ! mov FUNCTION, eax          'Move return value into function

END FUNCTION
'______________________________________________________________________________

FUNCTION NetworkListManager()AS STRING
 LOCAL DateTimeCreated               AS FILETIME
 LOCAL DateTimeConnected             AS FILETIME
 LOCAL CLSID_NetworkListManager      AS GUID
 LOCAL IID_INetworkListManager       AS GUID
 LOCAL NetworkGuid                   AS GUID
 LOCAL AdapterId                     AS GUID
 LOCAL AdapterConnectionId           AS GUID
 LOCAL sBuffer                       AS STRING
 LOCAL sQuery                        AS STRING
 LOCAL pINetwork                     AS DWORD POINTER
 LOCAL pBuffer                       AS DWORD POINTER
 LOCAL ppINetworkListManager         AS DWORD POINTER
 LOCAL pIEnumNetworks                AS DWORD POINTER
 LOCAL pcelFetched                   AS DWORD POINTER
 LOCAL prgeltNetworkConnections      AS DWORD POINTER
 LOCAL pcelFetchedNetworkConnections AS DWORD POINTER
 LOCAL pNetworkConnections           AS DWORD POINTER
 LOCAL INetwork                      AS DWORD
 LOCAL IEnumNetworks                 AS DWORD
 LOCAL IsConnectedToInternet         AS DWORD
 LOCAL IsConnected                   AS DWORD
 LOCAL celt                          AS DWORD
 LOCAL celFetched                    AS DWORD
 LOCAL DomainType                    AS DWORD
 LOCAL Connectivity                  AS DWORD
 LOCAL Category                      AS DWORD
 LOCAL AdapterDomainType             AS DWORD
 LOCAL AdapterConnectivity           AS DWORD
 LOCAL AdapterIsConnectedToInternet  AS DWORD
 LOCAL AdapterIsConnected            AS DWORD
 LOCAL celtNetworkConnections        AS DWORD
 LOCAL rgeltNetworkConnections       AS DWORD
 LOCAL celFetchedNetworkConnections  AS DWORD
 LOCAL NetworkConnections            AS DWORD
 LOCAL AdapterCount                  AS LONG
'LOCAL hr                            AS LONG

 CLSID_NetworkListManager = $CLSID_NetworkListManager
 IID_INetworkListManager  = $IID_INetworkListManager

 CoInitialize(BYVAL %NULL)
 IF CoCreateInstance(CLSID_NetworkListManager, BYVAL %NULL, %CLSCTX_ALL, IID_INetworkListManager, ppINetworkListManager) = %S_OK THEN

   pIEnumNetworks = VARPTR(IEnumNetworks)

   '>>>INetworkListManager METHOD GetNetworks AS IEnumNetworks ------------------------------------
   IF M_CALLs(ppINetworkListManager, 28, 2, BYVAL %NLM_ENUM_NETWORK_ALL, VARPTR(IEnumNetworks)) = %S_OK THEN
     '%NLM_ENUM_NETWORK_CONNECTED %NLM_ENUM_NETWORK_DISCONNECTED %NLM_ENUM_NETWORK_ALL
     sQuery = sQuery & IIF$(IEnumNetworks, "GetNetworks ok", "GetNetworks failed") & $CRLF 'ppEnumNetwork
     'sQuery = sQuery & $CRLF

     pINetwork = VARPTR(INetwork)
     '>>>IEnumNetworks PROPERTY GET NewEnum as INetwork -------------------------------------------
     IF M_CALLs(@pIEnumNetworks, 28, 1, pINetwork) = %S_OK THEN
       'pINetwork Contains the new instance of the implemented interface.
       'celt         [in]  Number of elements requested in the enumeration.
       'rgelt        [out] Pointer to the enumerated list of pointers returned by INetwork.
       'pceltFetched [out] Pointer to the number of elements supplied. This parameter is set to NULL if celt has the value of 1.
       celt        = 1
       pcelFetched = VARPTR(celFetched)
       DO 'For each network
         sQuery = sQuery & STRING$(160, "-") & $CRLF
         '>>>IEnumNetworks METHOD NEXT ------------------------------------------------------------
         IF M_CALLs(@pIEnumNetworks, 32, 3, celt, pINetwork, pcelFetched) = %S_OK THEN

           sBuffer = NUL$(%WLAN_MAX_NAME_LENGTH * 2)
           pBuffer = STRPTR(sBuffer)

           '>>>INetwork METHOD GetDescription AS STRING -------------------------------------------
           IF M_CALLs(@pINetwork, 36, 1, pBuffer) = %S_OK THEN
             sQuery = sQuery & "Network description: <" & pUnicodeToAnsi(@pBuffer) & ">" & $CRLF
           ELSE
             sQuery = sQuery & "INetwork METHOD Description AS STRING failed" & $CRLF
           END IF

           '>>>INetwork METHOD GetName AS STRING --------------------------------------------------
           IF M_CALLs(@pINetwork, 28, 1, pBuffer) = %S_OK THEN
             sQuery = sQuery & "Network name: <" & pUnicodeToAnsi(@pBuffer) & ">" & $CRLF
           ELSE
             sQuery = sQuery & "INetwork METHOD GetName AS STRING failed" & $CRLF
           END IF

           '>>>INetwork METHOD GetNetworkId AS GUID -----------------------------------------------
           IF M_CALLs(@pINetwork, 44, 1, VARPTR(NetworkGuid)) = %S_OK THEN
             sQuery = sQuery & "Network GUID: " & GUIDTXT$(NetworkGuid) & $CRLF
           ELSE
             sQuery = sQuery & "INetwork METHOD NetworkId AS GUID failed" & $CRLF
           END IF

           '>>>INetwork METHOD GetDomainType AS DWORD ---------------------------------------------
           IF M_CALLs(@pINetwork, 48, 1, VARPTR(DomainType)) = %S_OK THEN
             sQuery = sQuery & "Domain type: " & nlmDomainTypeSGet(DomainType) & $CRLF
           ELSE
             sQuery = sQuery & "DomainType METHOD NetworkId AS DWORD failed" & $CRLF
           END IF

           '>>>INetwork METHOD GetTimeCreatedAndConnected VOID ------------------------------------
           IF M_CALLs(@pINetwork, 56, 4, VARPTR(DateTimeCreated.dwLowDateTime), _
                                         VARPTR(DateTimeCreated.dwHighDateTime), _
                                         VARPTR(DateTimeConnected.dwLowDateTime), _
                                         VARPTR(DateTimeConnected.dwHighDateTime)) = %S_OK THEN
             sQuery = sQuery & "Time created:   " & $TAB & FileTimeToInternationalTime(DateTimeCreated) & $CRLF
             sQuery = sQuery & "Time connected: " & $TAB & FileTimeToInternationalTime(DateTimeConnected) & $CRLF
           ELSE
             sQuery = sQuery & "DomainType METHOD NetworkId AS DWORD failed" & $CRLF
           END IF

           '>>>INetwork PROPERTY GetConnectivity AS DWORD -----------------------------------------
           IF M_CALLs(@pINetwork, 68, 1, VARPTR(Connectivity)) = %S_OK THEN
             sQuery = sQuery & "Connectivity: " & $CRLF & ConnectivitySGet(Connectivity, "") & $CRLF
           ELSE
             sQuery = sQuery & "INetwork METHOD GetConnectivity AS DWORD failed" & $CRLF
           END IF

           '>>>INetwork PROPERTY GetCategory AS DWORD ---------------------------------------------
           IF M_CALLs(@pINetwork, 72, 1, VARPTR(Category)) = %S_OK THEN
             sQuery = sQuery & "Category: " & nlmCategorySGet(Category) & $CRLF
           ELSE
             sQuery = sQuery & "INetwork METHOD GetCategory AS DWORD failed" & $CRLF
           END IF

           '>>>INetwork PROPERTY IsConnectedToInternet AS INTEGER ---------------------------------
           IF M_CALLs(@pINetwork, 60, 1, VARPTR(IsConnectedToInternet)) = %S_OK THEN
             sQuery = sQuery & "Internet is connected: " & IIF$(IsConnectedToInternet, "Yes", "No") & $CRLF
           ELSE
             sQuery = sQuery & "INetwork METHOD IsConnectedToInternet AS INTEGER failed" & $CRLF
           END IF

           '>>>INetwork PROPERTY IsConnected AS INTEGER -------------------------------------------
           IF M_CALLs(@pINetwork, 64, 1, VARPTR(IsConnected)) = %S_OK THEN
             sQuery = sQuery & "Network is connected: " & IIF$(IsConnected, "Yes", "No") & $CRLF
           ELSE
             sQuery = sQuery & "INetwork METHOD IsConnected AS INTEGER failed" & $CRLF
           END IF

           '***************************************************************************************

           IF IsConnected THEN

             pNetworkConnections = VARPTR(NetworkConnections)

             '>>>INetwork PROPERTY GetNetworkConnections AS DWORD ---------------------------------
             IF M_CALLs(@pINetwork, 52, 1, pNetworkConnections) = %S_OK THEN

               'celtNetworkConnections  [in]  Number of elements requested in the enumeration.
               'rgeltNetworkConnections [out] Pointer to the enumerated list of pointers returned by INetwork.
               'pceltFetchedConn        [out] Pointer to the number of elements supplied. This parameter is set to NULL if celt has the value of 1.
               celtNetworkConnections        = 1
               prgeltNetworkConnections      = VARPTR(rgeltNetworkConnections)
               pcelFetchedNetworkConnections = VARPTR(celFetchedNetworkConnections)

               AdapterCount = 0
               DO 'For each network adaptor connection

                 '>>>IEnumNetworkConnections METHOD NEXT ------------------------------------------
                 IF M_CALLs(@pNetworkConnections, 32, 3, celtNetworkConnections, prgeltNetworkConnections, pcelFetchedNetworkConnections) = %S_OK THEN

                   IF AdapterCount THEN sQuery = sQuery & $CRLF
                   sQuery = sQuery & $TAB & "Adapter info..." & $CRLF

                   '>>>INetworkConnection PROPERTY IsConnected AS INTEGER ------------------------
                   IF M_CALLs(@prgeltNetworkConnections, 36, 1, VARPTR(AdapterIsConnected)) = %S_OK THEN
                     sQuery = sQuery & $TAB & "Network adapter connected: " & IIF$(AdapterIsConnected, "Yes", "No") & $CRLF
                   ELSE
                     sQuery = sQuery & $TAB & "INetwork METHOD IsConnected AS INTEGER failed" & $CRLF
                   END IF

                   '>>>INetworkConnection PROPERTY IsConnectedToInternet AS INTEGER ---------------
                   IF M_CALLs(@prgeltNetworkConnections, 32, 1, VARPTR(AdapterIsConnectedToInternet)) = %S_OK THEN
                     sQuery = sQuery & $TAB & "Network adapter connected to internet: " & IIF$(AdapterIsConnectedToInternet, "Yes", "No") & $CRLF
                   ELSE
                     sQuery = sQuery & $TAB & "INetwork METHOD IsConnected AS INTEGER failed" & $CRLF
                   END IF

                   '>>>INetworkConnection PROPERTY GetConnectivity AS DWORD -----------------------
                   IF M_CALLs(@prgeltNetworkConnections, 40, 1, VARPTR(AdapterConnectivity)) = %S_OK THEN
                     sQuery = sQuery & $TAB & "Connectivity: " & $CRLF & ConnectivitySGet(AdapterConnectivity, $TAB) & $CRLF
                   ELSE
                     sQuery = sQuery & $TAB & "INetwork METHOD GetConnectivity AS DWORD failed" & $CRLF
                   END IF

                   '>>>INetworkConnection METHOD GetConnectionId AS GUID --------------------------
                   IF M_CALLs(@prgeltNetworkConnections, 44, 1, VARPTR(AdapterConnectionId)) = %S_OK THEN
                     sQuery = sQuery & $TAB & "Connection GUID: " & $TAB & GUIDTXT$(AdapterConnectionId) & $CRLF
                   ELSE
                     sQuery = sQuery & $TAB & "INetwork METHOD GetConnection AS GUID failed" & $CRLF
                   END IF

                   '>>>INetworkConnection METHOD GetAdapterId AS GUID -----------------------------
                   IF M_CALLs(@prgeltNetworkConnections, 48, 1, VARPTR(AdapterId)) = %S_OK THEN
                     sQuery = sQuery & $TAB & "Adapter GUID:    " & $TAB & GUIDTXT$(AdapterId) & $CRLF
                   ELSE
                     sQuery = sQuery & $TAB & "INetwork METHOD GetAdeptorId AS GUID failed" & $CRLF
                   END IF

                   '>>>INetworkConnection METHOD GetDomainType AS DWORD ---------------------------
                   IF M_CALLs(@prgeltNetworkConnections, 52, 1, VARPTR(AdapterDomainType)) = %S_OK THEN
                     sQuery = sQuery & $TAB & "DomainType: " & nlmDomainTypeSGet(AdapterDomainType) & $CRLF
                   ELSE
                     sQuery = sQuery & $TAB & "DomainType METHOD NetworkId AS DWORD failed" & $CRLF
                   END IF

                 ELSE
                   EXIT LOOP
                 END IF
                 INCR AdapterCount
               LOOP 'For each network adaptor connection
             ELSE
               sQuery = sQuery & $TAB & "IEnumNetworkConnections METHOD GetNetworkConnections AS IEnumNetworkConnections failed" & $CRLF
             END IF
           END IF

           '***************************************************************************************

         ELSE
           EXIT DO
         END IF

       LOOP 'For each network
     END IF
   ELSE
     sQuery = sQuery & "No network found!" & $CRLF
   END IF

   M_CALLs(ppINetworkListManager, 8, 0) 'INetworkListManager PROPERTY SET Release
   CoUninitialize
 END IF

 FUNCTION = sQuery

END FUNCTION
'______________________________________________________________________________

CALLBACK FUNCTION DlgProc
 STATIC zClass        AS ASCIIZ * 50
 LOCAL  CursorPos     AS POINTAPI
 LOCAL  DuRect        AS RECT
 STATIC PixToDuX      AS SINGLE
 STATIC PixToDuY      AS SINGLE
 LOCAL  WindowClicked AS DWORD
 LOCAL  hControl      AS DWORD
 STATIC hTextbox      AS DWORD
 STATIC hFocusBak     AS DWORD
 STATIC SelStart      AS LONG
 STATIC SelEnd        AS LONG
 LOCAL  ClientWidth   AS LONG
 LOCAL  ClientHeight  AS LONG

 SELECT CASE CBMSG

   CASE %WM_INITDIALOG
     DuRect.nRight  = 1000 : DuRect.nBottom = 1000
     MapDialogRect(hDlg, DuRect)
     PixToDuX = DuRect.nRight / 1000 : PixToDuY = DuRect.nBottom / 1000

     hTextbox = GetDlgItem(CBHNDL, %Textbox)
     SendMessage(hTextbox, %EM_SETSEL, SendMessage(hTextbox, %WM_GETTEXTLENGTH, 0, 0), -1)
     SetFocus(hTextbox)
     CONTROL SET TEXT hDlg, %Textbox, NetworkListManager

   CASE %WM_COMMAND
     SELECT CASE LOWRD(CBWPARAM)
       CASE %ButtonRefresh
         IF (CBCTLMSG = %BN_CLICKED) OR (CBCTLMSG = 1) THEN
           CONTROL SET TEXT hDlg, %Textbox, ""
           CONTROL REDRAW hDlg, %Textbox
           SLEEP 100
           CONTROL SET TEXT hDlg, %Textbox, NetworkListManager
         END IF
     END SELECT

   CASE %WM_NCACTIVATE
     IF CBWPARAM = 0 THEN 'Application loose focus
       hFocusBak = GetFocus()
     ELSEIF hFocusBak THEN
       GetCursorPos(CursorPos)
       WindowClicked = WindowFromPoint(CursorPos.x, CursorPos.y)
       'SetWindowText(hDlg, HEX$(hFocusBak) & "  " & HEX$(GetFocus) & "  " & HEX$(WindowClicked))
       IF WindowClicked = hDlg THEN 'Click on nonClientArea or outside any control.
         SendMessage(hDlg, %WM_NEXTDLGCTL, hFocusBak, %TRUE) 'Set focus to control that have it before lost focus
       ELSE 'Clicked on a control
         GetClassName(WindowClicked, BYVAL VARPTR(zClass), SIZEOF(zClass))
         IF (zClass = "RichEdit20A") OR (zClass = "RICHEDIT") OR (zClass = "RichEdit50W") OR (zClass = "Edit") THEN 'Clicked in a RichEdit/Edit
           SendMessage(WindowClicked, %WM_LBUTTONDOWN, 0, 0) 'Yééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé
         END IF
       END IF
       hFocusBak = 0
     END IF

   CASE %WM_SIZE
     IF CBWPARAM <> %SIZE_MINIMIZED THEN
       ClientWidth  = LOWRD(CBLPARAM) / PixToDuX
       ClientHeight = HIWRD(CBLPARAM) / PixToDuY

       hControl = GetDlgItem(hDlg, %ButtonRefresh)
       MoveWindow(hControl, 5 * PixToDuX, 2 * PixToDuY, 24 * PixToDuX, 20 * PixToDuY, %TRUE)
       MoveWindow(hTextbox, 5 * PixToDuX, 25 * PixToDuY, (ClientWidth - 10) * PixToDuX, (ClientHeight - 30) * PixToDuY, %TRUE)
     END IF

  END SELECT

END FUNCTION
'______________________________________________________________________________

FUNCTION PBMAIN()
 LOCAL hIconDialog AS DWORD
 LOCAL hIconButton AS DWORD

 IF VistaOrNewer THEN

   DIALOG FONT "Segoe UI", 9
   DIALOG NEW %HWND_DESKTOP, "Network list manager", , , 485, 420, _
   %WS_CAPTION OR %WS_MINIMIZEBOX OR %WS_MAXIMIZEBOX OR %WS_SYSMENU OR %WS_THICKFRAME, 0 TO hDlg

   hIconDialog = ExtractIcon(GetModuleHandle(""), "WLanMM.dll", 9)
   SetClassLong(hDlg, %GCL_HICON, hIconDialog) 'Set an icon
   SendMessage(hDlg, %WM_SETICON, %ICON_SMALL, hIconDialog) 'Need to add if DIALOG NEW PIXELS

   hIconButton = ExtractIcon(GetModuleHandle(""), "Van.dll", 5)
   CONTROL ADD IMGBUTTONX, hDlg, %ButtonRefresh, "", 5, 2, 24, 20
   CONTROL SEND hDlg, %ButtonRefresh, %BM_SETIMAGE, %IMAGE_ICON, hIconButton

   CONTROL ADD TEXTBOX, hDlg, %Textbox, "", 5, 25, 340, 210, %WS_CHILD OR %WS_VISIBLE OR _
   %WS_TABSTOP OR %WS_HSCROLL OR %WS_VSCROLL OR %ES_LEFT OR %ES_MULTILINE OR _
   %ES_READONLY OR %ES_AUTOHSCROLL OR %ES_AUTOVSCROLL OR %ES_NOHIDESEL OR %ES_WANTRETURN, _
   %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR

   DIALOG SHOW MODAL hDlg CALL DlgProc

   DestroyIcon(hIconDialog)
   DestroyIcon(hIconButton)

 ELSE

   MessageBox(%HWND_DESKTOP, "Need Windows Vista or newer", "Network list manager", %MB_ICONINFORMATION OR %MB_OK)

 END IF

END FUNCTION
'______________________________________________________________________________

' Save following resource code as <NetworkListManager.rc>
' Compile it, the result will be <NetworkListManager.pbr>
' In code above change <'#RESOURCE ".pbr"> for <#RESOURCE "NetworkListManager.pbr>
' and compile program.

'*** RESOURCE START AFTER This line *******************************************
'#include "resource.h"

'#define IDR_MANIFEST 1 // 1 for a EXE, 2 for a DLL
'#define RT_MANIFEST 24

'IDR_MANIFEST RT_MANIFEST MOVEABLE PURE
'{
'    "<assembly xmlns=""urn:schemas-microsoft-com:asm.v1"" manifestVersion=""1.0"">
'       <assemblyIdentity
'         name=""Microsoft.Windows.Shell.shell32""
'         processorArchitecture=""x86""
'         version=""1.50.00.01""
'         type=""win32""/>
'       <description>Windows Shell</description>
'       <dependency>
'         <dependentAssembly>
'           <assemblyIdentity
'             type=""win32""
'             name=""Microsoft.Windows.Common-Controls""
'             version=""6.0.0.0""
'             processorArchitecture=""x86""
'             publicKeyToken=""6595b64144ccf1df""
'             language=""*""
'           />
'         </dependentAssembly>
'       </dependency>
'       <asmv3:trustInfo xmlns:asmv3=""urn:schemas-microsoft-com:asm.v3"">
'         <asmv3:security>
'           <asmv3:requestedPrivileges>
'             <asmv3:requestedExecutionLevel
'               level=""asInvoker""
'               uiAccess=""false"" />
'           </asmv3:requestedPrivileges>
'         </asmv3:security>
'       </asmv3:trustInfo>
'     </assembly>"
'}
'*** Line above is the resource end *******************************************
'______________________________________________________________________________
'