[PATCH v3] iphlpapi: Add support for ConvertLengthToIpv4Mask()
Dagfinn Reiakvam
dagfinn at reiakvam.no
Sun Mar 18 15:40:46 CDT 2018
From: Uberdaff <dagfinn at reiakvam.no>
This patch fixes bug:
https://bugs.winehq.org/show_bug.cgi?id=44742
Signed-off-by: Dagfinn Reiakvam <dagfinn at reiakvam.no>
---
dlls/iphlpapi/iphlpapi.spec | 2 +-
dlls/iphlpapi/iphlpapi_main.c | 24 ++++++++++++++++
dlls/iphlpapi/tests/iphlpapi.c | 64 ++++++++++++++++++++++++++++++++++++++++++
include/netioapi.h | 1 +
4 files changed, 90 insertions(+), 1 deletion(-)
diff --git a/dlls/iphlpapi/iphlpapi.spec b/dlls/iphlpapi/iphlpapi.spec
index b6c9aef..bbd1ed8 100644
--- a/dlls/iphlpapi/iphlpapi.spec
+++ b/dlls/iphlpapi/iphlpapi.spec
@@ -23,7 +23,7 @@
@ stdcall ConvertInterfaceNameToLuidW( wstr ptr )
#@ stub ConvertInterfacePhysicalAddressToLuid
#@ stub ConvertIpv4MaskToLength
-#@ stub ConvertLengthToIpv4Mask
+@ stdcall ConvertLengthToIpv4Mask( long ptr )
#@ stub ConvertRemoteInterfaceAliasToLuid
#@ stub ConvertRemoteInterfaceGuidToLuid
#@ stub ConvertRemoteInterfaceIndexToLuid
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 97284ed..62437e0 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -3223,6 +3223,30 @@ DWORD WINAPI ConvertInterfaceNameToLuidW(const WCHAR *name, NET_LUID *luid)
}
/******************************************************************
+ * ConvertLengthToIpv4Mask (IPHLPAPI.@)
+ */
+DWORD WINAPI ConvertLengthToIpv4Mask(ULONG mask_len, PULONG mask)
+{
+ if(mask_len > 32)
+ {
+ *mask = INADDR_NONE;
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ if(mask_len == 0)
+ *mask = 0;
+ else
+ {
+ //IN_ADDR temp;
+ //temp.S_un.S_addr = 0xffffffff << ( 32 - MaskLength);
+ //*Mask = temp.S_un.S_un_b.s_b4 + ( temp.S_un.S_un_b.s_b3 <-< 8 ) + ( temp.S_un.S_un_b.s_b2 << 16 ) + ( temp.S_un.S_un_b.s_b1 << 24 );
+ *mask = htonl(~0u << (32 - mask_len));
+ }
+
+ return NO_ERROR;
+}
+
+/******************************************************************
* if_nametoindex (IPHLPAPI.@)
*/
IF_INDEX WINAPI IPHLP_if_nametoindex(const char *name)
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index 873612d..039d503 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -96,6 +96,7 @@ static DWORD (WINAPI *pConvertInterfaceLuidToNameW)(const NET_LUID*,WCHAR*,SIZE_
static DWORD (WINAPI *pConvertInterfaceLuidToNameA)(const NET_LUID*,char*,SIZE_T);
static DWORD (WINAPI *pConvertInterfaceNameToLuidA)(const char*,NET_LUID*);
static DWORD (WINAPI *pConvertInterfaceNameToLuidW)(const WCHAR*,NET_LUID*);
+static DWORD (WINAPI *pConvertLengthToIpv4Mask)(ULONG,PULONG);
static PCHAR (WINAPI *pif_indextoname)(NET_IFINDEX,PCHAR);
static NET_IFINDEX (WINAPI *pif_nametoindex)(const char*);
@@ -149,6 +150,7 @@ static void loadIPHlpApi(void)
pConvertInterfaceLuidToNameW = (void *)GetProcAddress(hLibrary, "ConvertInterfaceLuidToNameW");
pConvertInterfaceNameToLuidA = (void *)GetProcAddress(hLibrary, "ConvertInterfaceNameToLuidA");
pConvertInterfaceNameToLuidW = (void *)GetProcAddress(hLibrary, "ConvertInterfaceNameToLuidW");
+ pConvertLengthToIpv4Mask = (void *)GetProcAddress(hLibrary, "ConvertLengthToIpv4Mask");
pif_indextoname = (void *)GetProcAddress(hLibrary, "if_indextoname");
pif_nametoindex = (void *)GetProcAddress(hLibrary, "if_nametoindex");
}
@@ -2174,6 +2176,67 @@ static void test_GetUnicastIpAddressTable(void)
pFreeMibTable(table);
}
+static void test_ConvertLengthToIpv4Mask(void)
+{
+ DWORD apiReturn;
+ ULONG mask;
+
+ if (!pConvertLengthToIpv4Mask)
+ {
+ win_skip( "ConvertLengthToIpv4Mask not available\n" );
+ return;
+ }
+
+ apiReturn = pConvertLengthToIpv4Mask(0, &mask);
+ ok(apiReturn == NO_ERROR,
+ "ConvertLengthToIpv4Mask returned %d, expected NO_ERROR\n", apiReturn);
+ ok(mask == 0,
+ "ConvertLengthToIpv4Mask Mask value %x, expected 0x00000000\n", mask);
+
+ apiReturn = pConvertLengthToIpv4Mask(1, &mask);
+ ok(apiReturn == NO_ERROR,
+ "ConvertLengthToIpv4Mask returned %d, expected NO_ERROR\n", apiReturn);
+ ok(mask == htonl(0x80000000),
+ "ConvertLengthToIpv4Mask Mask value %x, expected 0x00000080\n", mask);
+
+ apiReturn = pConvertLengthToIpv4Mask(8, &mask);
+ ok(apiReturn == NO_ERROR,
+ "ConvertLengthToIpv4Mask returned %d, expected NO_ERROR\n", apiReturn);
+ ok(mask == htonl(0xff000000),
+ "ConvertLengthToIpv4Mask Mask value %x, expected 0x000000ff\n", mask);
+
+ apiReturn = pConvertLengthToIpv4Mask(16, &mask);
+ ok(apiReturn == NO_ERROR,
+ "ConvertLengthToIpv4Mask returned %d, expected NO_ERROR\n", apiReturn);
+ ok(mask == htonl(0xffff0000),
+ "ConvertLengthToIpv4Mask Mask value %x, expected 0x0000ffff\n", mask);
+
+ apiReturn = pConvertLengthToIpv4Mask(24, &mask);
+ ok(apiReturn == NO_ERROR,
+ "ConvertLengthToIpv4Mask returned %d, expected NO_ERROR\n", apiReturn);
+ ok(mask == htonl(0xffffff00),
+ "ConvertLengthToIpv4Mask Mask value %x, expected 0x00ffffff\n", mask);
+
+ apiReturn = pConvertLengthToIpv4Mask(31, &mask);
+ ok(apiReturn == NO_ERROR,
+ "ConvertLengthToIpv4Mask returned %d, expected NO_ERROR\n", apiReturn);
+ ok(mask == htonl(0xfffffffe),
+ "ConvertLengthToIpv4Mask Mask value %x, expected 0xfeffffff\n", mask);
+
+ apiReturn = pConvertLengthToIpv4Mask(32, &mask);
+ ok(apiReturn == NO_ERROR,
+ "ConvertLengthToIpv4Mask returned %d, expected NO_ERROR\n", apiReturn);
+ ok(mask == htonl(0xffffffff),
+ "ConvertLengthToIpv4Mask Mask value %x, expected 0xffffffff\n", mask);
+
+ apiReturn = pConvertLengthToIpv4Mask(33, &mask);
+ ok(apiReturn == ERROR_INVALID_PARAMETER,
+ "ConvertLengthToIpv4Mask(32, &Mask) returned %d, expected ERROR_INVALID_PARAMETER\n",
+ apiReturn);
+ ok(mask == INADDR_NONE,
+ "ConvertLengthToIpv4Mask Mask value %x, expected INADDR_NONE\n", mask);
+}
+
START_TEST(iphlpapi)
{
@@ -2201,6 +2264,7 @@ START_TEST(iphlpapi)
test_GetIfTable2Ex();
test_GetUnicastIpAddressEntry();
test_GetUnicastIpAddressTable();
+ test_ConvertLengthToIpv4Mask();
freeIPHlpApi();
}
}
diff --git a/include/netioapi.h b/include/netioapi.h
index 1095888..beb93d2 100644
--- a/include/netioapi.h
+++ b/include/netioapi.h
@@ -170,6 +170,7 @@ DWORD WINAPI ConvertInterfaceLuidToNameA(const NET_LUID*,char*,SIZE_T);
DWORD WINAPI ConvertInterfaceLuidToNameW(const NET_LUID*,WCHAR*,SIZE_T);
DWORD WINAPI ConvertInterfaceNameToLuidA(const char*,NET_LUID*);
DWORD WINAPI ConvertInterfaceNameToLuidW(const WCHAR*,NET_LUID*);
+DWORD WINAPI ConvertLengthToIpv4Mask(ULONG MaskLength, PULONG Mask);
void WINAPI FreeMibTable(void*);
DWORD WINAPI GetIfEntry2(MIB_IF_ROW2*);
DWORD WINAPI GetIfTable2(MIB_IF_TABLE2**);
--
2.7.4
More information about the wine-devel
mailing list