[DllImport("coredll.dll", CharSet = CharSet.Unicode)]
internal static extern UInt32 RasEnumConnections([In, Out] _RASCONN[] lprasconn, ref UInt32 lpcb, ref UInt32 lpcConnections);
const int RAS_MaxEntryName = 20;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct _RASCONN
{
private UInt32 m_size;
private IntPtr m_hrasconn;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = RAS_MaxEntryName + 1)]
private char[] m_entryName;
public IntPtr ConnectionHandle { get { return m_hrasconn; } }
public string EntryName { get { return new string(m_entryName).TrimEnd(new char[] { '\0' }); } }
public static _RASCONN CreateStruct()
{
_RASCONN obj = new _RASCONN();
obj.m_size = System.Convert.ToUInt32(Marshal.SizeOf(typeof(_RASCONN)));
obj.m_hrasconn = IntPtr.Zero;
obj.m_entryName = new char[RAS_MaxEntryName + 1];
return obj;
}
}
public static _RASCONN[] EnumerateConnections()
{
_RASCONN[] rasconn;
UInt32 size = 0, noelements = 0;
size = System.Convert.ToUInt32(Marshal.SizeOf((rasconn = new _RASCONN[1])[0] = _RASCONN.CreateStruct()));
if (RasEnumConnections(rasconn, ref size, ref noelements) != 0x00)
{
size = System.Convert.ToUInt32(Marshal.SizeOf((rasconn = new _RASCONN[size / Marshal.SizeOf(typeof(_RASCONN))])[0] = _RASCONN.CreateStruct()) * rasconn.Length);
if (RasEnumConnections(rasconn, ref size, ref noelements) != 0x00) { rasconn = null; }
}
return rasconn;
}