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 ******************************************* '______________________________________________________________________________ '