diff --git a/PInvoke/IpHlpApi/IfDef.cs b/PInvoke/IpHlpApi/IfDef.cs
index 03c65d5f..cef8b948 100644
--- a/PInvoke/IpHlpApi/IfDef.cs
+++ b/PInvoke/IpHlpApi/IfDef.cs
@@ -318,12 +318,12 @@ namespace Vanara.PInvoke
/// A WCHAR buffer that contains the string. The string does not need to be null-terminated.
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
- public string[] String;
+ public string String;
}
///
[PInvokeData("ifdef.h")]
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct IF_PHYSICAL_ADDRESS
{
/// A USHORT value that contains the length, in bytes, of the string.
@@ -331,7 +331,7 @@ namespace Vanara.PInvoke
///
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
- public string[] Address;
+ public string Address;
}
///
diff --git a/PInvoke/IpHlpApi/IpTypes.cs b/PInvoke/IpHlpApi/IpTypes.cs
index f639ccdb..85dc2003 100644
--- a/PInvoke/IpHlpApi/IpTypes.cs
+++ b/PInvoke/IpHlpApi/IpTypes.cs
@@ -868,7 +868,12 @@ namespace Vanara.PInvoke
// _IP_ADAPTER_ANYCAST_ADDRESS_XP { union { ULONGLONG Alignment; struct { ULONG Length; DWORD Flags; }; }; struct
// _IP_ADAPTER_ANYCAST_ADDRESS_XP *Next; SOCKET_ADDRESS Address; } IP_ADAPTER_ANYCAST_ADDRESS_XP, *PIP_ADAPTER_ANYCAST_ADDRESS_XP;
[PInvokeData("iptypes.h", MSDNShortId = "2626fc86-e29b-4162-8625-207c709d67ed")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential, Pack = 8,
+#if x64
+ Size = 32)]
+#else
+ Size = 24)]
+#endif
public struct IP_ADAPTER_ANYCAST_ADDRESS : ILinkedListElement
{
/// Specifies the length of this structure.
@@ -922,7 +927,12 @@ namespace Vanara.PInvoke
// _IP_ADAPTER_DNS_SERVER_ADDRESS_XP { union { ULONGLONG Alignment; struct { ULONG Length; DWORD Reserved; }; }; struct
// _IP_ADAPTER_DNS_SERVER_ADDRESS_XP *Next; SOCKET_ADDRESS Address; } IP_ADAPTER_DNS_SERVER_ADDRESS_XP, *PIP_ADAPTER_DNS_SERVER_ADDRESS_XP;
[PInvokeData("iptypes.h", MSDNShortId = "96855386-9010-40df-8260-16b43ad6646f")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential, Pack = 8,
+#if x64
+ Size = 32)]
+#else
+ Size = 24)]
+#endif
public struct IP_ADAPTER_DNS_SERVER_ADDRESS : ILinkedListElement
{
/// Specifies the length of this structure.
@@ -1009,7 +1019,12 @@ namespace Vanara.PInvoke
// _IP_ADAPTER_GATEWAY_ADDRESS_LH { union { ULONGLONG Alignment; struct { ULONG Length; DWORD Reserved; }; }; struct
// _IP_ADAPTER_GATEWAY_ADDRESS_LH *Next; SOCKET_ADDRESS Address; } IP_ADAPTER_GATEWAY_ADDRESS_LH, *PIP_ADAPTER_GATEWAY_ADDRESS_LH;
[PInvokeData("iptypes.h", MSDNShortId = "CA38504A-1CC9-4ABA-BD4E-1B2EAD6F588B")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential, Pack = 8,
+#if x64
+ Size = 32)]
+#else
+ Size = 24)]
+#endif
public struct IP_ADAPTER_GATEWAY_ADDRESS : ILinkedListElement
{
/// Specifies the length of this structure.
@@ -1065,7 +1080,7 @@ namespace Vanara.PInvoke
// DhcpServer; BOOL HaveWins; IP_ADDR_STRING PrimaryWinsServer; IP_ADDR_STRING SecondaryWinsServer; time_t LeaseObtained; time_t
// LeaseExpires; } IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
[PInvokeData("iptypes.h", MSDNShortId = "f8035801-ca0c-4d86-bfc5-8e2d746af1b4")]
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct IP_ADAPTER_INFO : ILinkedListElement
{
///
@@ -1233,14 +1248,14 @@ namespace Vanara.PInvoke
/// The time when the current DHCP lease was obtained.
/// This member is only valid when the DhcpEnabled member is nonzero.
///
- public uint LeaseObtained;
+ public time_t LeaseObtained;
///
/// Type: time_t
/// The time when the current DHCP lease expires.
/// This member is only valid when the DhcpEnabled member is nonzero.
///
- public uint LeaseExpires;
+ public time_t LeaseExpires;
/// Gets a sequence of IP_ADDR_STRING values representing IP addresses.
public IEnumerable IpAddresses => IpAddressList.GetLinkedList(s => s.IpAddress != null);
@@ -1281,7 +1296,12 @@ namespace Vanara.PInvoke
// _IP_ADAPTER_MULTICAST_ADDRESS_XP { union { ULONGLONG Alignment; struct { ULONG Length; DWORD Flags; }; }; struct
// _IP_ADAPTER_MULTICAST_ADDRESS_XP *Next; SOCKET_ADDRESS Address; } IP_ADAPTER_MULTICAST_ADDRESS_XP, *PIP_ADAPTER_MULTICAST_ADDRESS_XP;
[PInvokeData("iptypes.h", MSDNShortId = "b85a6e0a-df2c-4608-b07a-191b34440a43")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential, Pack = 8,
+#if x64
+ Size = 32)]
+#else
+ Size = 24)]
+#endif
public struct IP_ADAPTER_MULTICAST_ADDRESS : ILinkedListElement
{
/// Specifies the length of this structure.
@@ -1523,7 +1543,12 @@ namespace Vanara.PInvoke
// _IP_ADAPTER_WINS_SERVER_ADDRESS_LH { union { ULONGLONG Alignment; struct { ULONG Length; DWORD Reserved; }; }; struct
// _IP_ADAPTER_WINS_SERVER_ADDRESS_LH *Next; SOCKET_ADDRESS Address; } IP_ADAPTER_WINS_SERVER_ADDRESS_LH, *PIP_ADAPTER_WINS_SERVER_ADDRESS_LH;
[PInvokeData("iptypes.h", MSDNShortId = "AF9A40C4-63DB-4830-A689-1DFE4DC2CAB7")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential, Pack = 8,
+#if x64
+ Size = 32)]
+#else
+ Size = 24)]
+#endif
public struct IP_ADAPTER_WINS_SERVER_ADDRESS : ILinkedListElement
{
/// Specifies the length of this structure.
@@ -1558,7 +1583,7 @@ namespace Vanara.PInvoke
// https://docs.microsoft.com/en-us/windows/desktop/api/iptypes/ns-iptypes-_ip_addr_string typedef struct _IP_ADDR_STRING { struct
// _IP_ADDR_STRING *Next; IP_ADDRESS_STRING IpAddress; IP_MASK_STRING IpMask; DWORD Context; } IP_ADDR_STRING, *PIP_ADDR_STRING;
[PInvokeData("iptypes.h", MSDNShortId = "783c383d-7fd3-45bc-90f6-2e8ce01db3c3")]
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct IP_ADDR_STRING : ILinkedListElement
{
///
@@ -1696,6 +1721,8 @@ namespace Vanara.PInvoke
///
public IFTYPE MediaType;
+ private byte _ConnectionType;
+
///
/// Type: UCHAR
/// The interface connection type for the adapter.
@@ -1727,8 +1754,9 @@ namespace Vanara.PInvoke
///
///
///
- [MarshalAs(UnmanagedType.U1)]
- public NET_IF_CONNECTION_TYPE ConnectionType;
+ public NET_IF_CONNECTION_TYPE ConnectionType { get => (NET_IF_CONNECTION_TYPE)_ConnectionType; set => _ConnectionType = (byte)value; }
+
+ private byte _AccessType;
///
/// Type: UCHAR
@@ -1771,8 +1799,7 @@ namespace Vanara.PInvoke
///
///
///
- [MarshalAs(UnmanagedType.U1)]
- public NET_IF_ACCESS_TYPE AccessType;
+ public NET_IF_ACCESS_TYPE AccessType { get => (NET_IF_ACCESS_TYPE)_AccessType; set => _AccessType = (byte)value; }
///
/// Type: GUID
diff --git a/PInvoke/IpHlpApi/TcpMib.cs b/PInvoke/IpHlpApi/TcpMib.cs
index cc665da3..405266f1 100644
--- a/PInvoke/IpHlpApi/TcpMib.cs
+++ b/PInvoke/IpHlpApi/TcpMib.cs
@@ -119,7 +119,7 @@ namespace Vanara.PInvoke
// MIB_TCP_STATE State; IN6_ADDR LocalAddr; DWORD dwLocalScopeId; DWORD dwLocalPort; IN6_ADDR RemoteAddr; DWORD dwRemoteScopeId;
// DWORD dwRemotePort; } MIB_TCP6ROW, *PMIB_TCP6ROW;
[PInvokeData("tcpmib.h", MSDNShortId = "b3e9eda5-5e86-4790-8b1b-ca9bae44b502")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct MIB_TCP6ROW
{
///
@@ -682,7 +682,7 @@ namespace Vanara.PInvoke
// LocalAddr; DWORD dwLocalScopeId; DWORD dwLocalPort; IN6_ADDR RemoteAddr; DWORD dwRemoteScopeId; DWORD dwRemotePort; MIB_TCP_STATE
// State; DWORD dwOwningPid; TCP_CONNECTION_OFFLOAD_STATE dwOffloadState; } MIB_TCP6ROW2, *PMIB_TCP6ROW2;
[PInvokeData("tcpmib.h", MSDNShortId = "bbec3397-0317-40f7-926f-2ec48cf5386d")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct MIB_TCP6ROW2
{
///
diff --git a/PInvoke/IpHlpApi/UdpMib.cs b/PInvoke/IpHlpApi/UdpMib.cs
index 6a3f27c0..8506fc96 100644
--- a/PInvoke/IpHlpApi/UdpMib.cs
+++ b/PInvoke/IpHlpApi/UdpMib.cs
@@ -41,7 +41,7 @@ namespace Vanara.PInvoke
// https://docs.microsoft.com/en-us/previous-versions/windows/desktop/api/udpmib/ns-udpmib-_mib_udp6row typedef struct _MIB_UDP6ROW {
// IN6_ADDR dwLocalAddr; DWORD dwLocalScopeId; DWORD dwLocalPort; } MIB_UDP6ROW, *PMIB_UDP6ROW;
[PInvokeData("udpmib.h", MSDNShortId = "c2cc4f77-8557-4206-9e46-aadf065eb8df")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential, Size = 24, Pack = 4)]
public struct MIB_UDP6ROW
{
///
@@ -280,7 +280,7 @@ namespace Vanara.PInvoke
// https://docs.microsoft.com/en-us/previous-versions/windows/desktop/api/udpmib/ns-udpmib-_mib_udprow typedef struct _MIB_UDPROW {
// DWORD dwLocalAddr; DWORD dwLocalPort; } MIB_UDPROW, *PMIB_UDPROW;
[PInvokeData("udpmib.h", MSDNShortId = "db366802-962f-4e83-838e-1e2f51beab92")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct MIB_UDPROW
{
///
@@ -425,7 +425,7 @@ namespace Vanara.PInvoke
// https://docs.microsoft.com/en-us/previous-versions/windows/desktop/api/udpmib/ns-udpmib-_mib_udprow_owner_pid typedef struct
// _MIB_UDPROW_OWNER_PID { DWORD dwLocalAddr; DWORD dwLocalPort; DWORD dwOwningPid; } MIB_UDPROW_OWNER_PID, *PMIB_UDPROW_OWNER_PID;
[PInvokeData("udpmib.h", MSDNShortId = "b914b6eb-adf9-4a61-ae8f-05d3ff90ce90")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct MIB_UDPROW_OWNER_PID
{
///
diff --git a/PInvoke/Ws2_32/ws2def.cs b/PInvoke/Ws2_32/ws2def.cs
index 61b714d6..30267507 100644
--- a/PInvoke/Ws2_32/ws2def.cs
+++ b/PInvoke/Ws2_32/ws2def.cs
@@ -1447,7 +1447,12 @@ namespace Vanara.PInvoke
// https://docs.microsoft.com/en-us/windows/win32/api/ws2def/ns-ws2def-socket_address typedef struct _SOCKET_ADDRESS { LPSOCKADDR
// lpSockaddr; INT iSockaddrLength; } SOCKET_ADDRESS, *PSOCKET_ADDRESS, *LPSOCKET_ADDRESS;
[PInvokeData("ws2def.h", MSDNShortId = "37fbcb96-a859-4eca-8928-8051f95407b9")]
- [StructLayout(LayoutKind.Sequential)]
+ [StructLayout(LayoutKind.Sequential,
+#if x64
+ Size = 16)]
+#else
+ Size = 8)]
+#endif
public struct SOCKET_ADDRESS
{
/// A pointer to a socket address represented as a SOCKADDR structure.
diff --git a/UnitTests/CSharpRunner/TestHelper.cs b/UnitTests/CSharpRunner/TestHelper.cs
index ea2facf9..42f153d2 100644
--- a/UnitTests/CSharpRunner/TestHelper.cs
+++ b/UnitTests/CSharpRunner/TestHelper.cs
@@ -36,7 +36,9 @@ namespace Vanara.PInvoke.Tests
{
System.Reflection.TypeAttributes attr = System.Reflection.TypeAttributes.SequentialLayout | System.Reflection.TypeAttributes.ExplicitLayout;
return types.Where(t => t.IsValueType && !t.IsEnum && !t.IsGenericType && (t.Attributes & attr) != 0 && ((filters?.Length ?? 0) == 0 || filters.Any(s => t.Name.Contains(s)))).
- OrderBy(t => (fullName ? t.FullName : t.Name)).Select(t => $"{(fullName ? t.FullName : t.Name)} = {InteropExtensions.SizeOf(t)}").ToList();
+ OrderBy(t => fullName ? t.FullName : t.Name).Select(t => $"{(fullName ? t.FullName : t.Name)} = {GetTypeSize(t)}").ToList();
+
+ static long GetTypeSize(Type t) { try { return (long)InteropExtensions.SizeOf(t); } catch { return -1; } }
}
public static void RunForEach(Type lib, string name, Func makeParam, Action action = null, Action error = null) where TEnum : Enum =>
diff --git a/UnitTests/PInvoke/IpHlpApi/IpHlpApiTests.cs b/UnitTests/PInvoke/IpHlpApi/IpHlpApiTests.cs
index ae1dd785..92212dd7 100644
--- a/UnitTests/PInvoke/IpHlpApi/IpHlpApiTests.cs
+++ b/UnitTests/PInvoke/IpHlpApi/IpHlpApiTests.cs
@@ -39,6 +39,13 @@ namespace Vanara.PInvoke.Tests
private static SOCKADDR_IN LocalAddrV4 => localv4.sin_family == 0 ? (localv4 = primaryAdapter.UnicastAddresses.Select(r => r.Address.GetSOCKADDR()).First(a => a.si_family == ADDRESS_FAMILY.AF_INET).Ipv4) : localv4;
private static SOCKADDR_IN6 LocalAddrV6 => localv6.sin6_family == 0 ? (localv6 = primaryAdapter.UnicastAddresses.Select(r => r.Address.GetSOCKADDR()).First(a => a.si_family == ADDRESS_FAMILY.AF_INET6).Ipv6) : localv6;
+ [Test]
+ public void _StructSizeTest()
+ {
+ foreach (var s in typeof(Vanara.PInvoke.IpHlpApi).GetNestedStructSizes())
+ TestContext.WriteLine(s);
+ }
+
[Test]
public void AddDeleteIPAddressTest()
{