The RASEnumDevices function returns a list of all RAS capable devices installed on the computer, giving you their name and their type.  The returned names and device types are stored in a RASDEVINFO structure.

typedef struct tagRASDEVINFO {
  DWORD    dwSize;
  TCHAR    szDeviceType[ RAS_MaxDeviceType + 1 ];
  TCHAR    szDeviceName[ RAS_MaxDeviceName + 1 ];

Unfortunately the size of this structure is different depending on the windows platform. The constants RAS_MaxDeviceType is equal to 16 for all platforms, while RAS_MaxDeviceName is 128 for 95/98 and NT4 or later, and 32 for earlier versions of NT.

The following sample function returns a long value equal to the number of devices, and populates a dynamic array of VBRASDEVINFO  structures with the device name(s), and device type(s) .

You can call on the function like so: 

Dim rtn As Long

rtn = VBRasEnumDevices(clsVBRasDevInfo)

For j = 0 To rtn - 1
    Debug.Print clsVBRasDevInfo(j).DeviceName
    Debug.Print clsVBRasDevInfo(j).DeviceType
Next j


   DeviceType As String
   DeviceName As String
End Type

Public Declare Function RasEnumDevices _
   Lib "rasapi32.dll" Alias "RasEnumDevicesA" ( _
        lpRasDevInfo As Any, _
        lpCb As Long, _
        lpCDevices As Long _
) As Long

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
         (Destination As Any, Source As Any, ByVal Length As Long)
Function VBRasEnumDevices(clsVBRasDevInfo() As VBRASDEVINFO) As Long
   Dim rtn As Long, i As Long
   Dim lpCb As Long, lpCDevices As Long
   Dim b() As Byte
   Dim dwSize As Long
   rtn = RasEnumDevices(ByVal 0&, lpCb, lpCDevices)

   If lpCDevices = 0 Then Exit Function
   dwSize = lpCb \ lpCDevices
   ReDim b(lpCb - 1)
   CopyMemory b(0), dwSize, 4
   rtn = RasEnumDevices(b(0), lpCb, lpCDevices)
   If lpCDevices = 0 Then Exit Function
   ReDim clsVBRasDevInfo(lpCDevices - 1)
   For i = 0 To lpCDevices - 1
     CopyByteToTrimmedString clsVBRasDevInfo(i).DeviceType, _
                                    b((i * dwSize) + 4), 17
     CopyByteToTrimmedString clsVBRasDevInfo(i).DeviceName, _
                           b((i * dwSize) + 21), dwSize - 21
   Next i
   VBRasEnumDevices = lpCDevices

End Function
Sub CopyByteToTrimmedString(strToCopyTo As String, _
                              bPos As Byte, lngMaxLen As Long)
   Dim strTemp As String, lngLen As Long
   strTemp = String(lngMaxLen + 1, 0)
   CopyMemory ByVal strTemp, bPos, lngMaxLen
   lngLen = InStr(strTemp, Chr$(0)) - 1
   strToCopyTo = Left$(strTemp, lngLen)
End Sub


See Also: Contents, Introduction, RasEntry, RasGetEntryProperties, RasSetEntryProperties, RasCountryInfo, RasErrorHandler.