From: Uberdaff dagfinn@reiakvam.no
--- dlls/iphlpapi/iphlpapi.spec | 2 +- dlls/iphlpapi/iphlpapi_main.c | 19 +++++++++++++++++ dlls/iphlpapi/tests/iphlpapi.c | 46 ++++++++++++++++++++++++++++++++++++++++++ include/netioapi.h | 1 + 4 files changed, 67 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..8a96236 100644 --- a/dlls/iphlpapi/iphlpapi_main.c +++ b/dlls/iphlpapi/iphlpapi_main.c @@ -3223,6 +3223,25 @@ DWORD WINAPI ConvertInterfaceNameToLuidW(const WCHAR *name, NET_LUID *luid) }
/****************************************************************** + * ConvertLengthToIpv4Mask (IPHLPAPI.@) + */ +DWORD WINAPI ConvertLengthToIpv4Mask(ULONG MaskLength, PULONG Mask) +{ + if(MaskLength > 32) + { + *Mask = INADDR_NONE; + return ERROR_INVALID_PARAMETER; + } + + if(MaskLength == 0) + *Mask = 0; + else + *Mask = 0xffffffff << ( 32 - MaskLength); + + 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..59e9246 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,49 @@ 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 == 0x80000000, + "ConvertLengthToIpv4Mask Mask value %x, expected 0x80000000\n", Mask); + + apiReturn = pConvertLengthToIpv4Mask(31, &Mask); + ok(apiReturn == NO_ERROR, + "ConvertLengthToIpv4Mask returned %d, expected NO_ERROR\n", apiReturn); + ok(Mask == 0xfffffffe, + "ConvertLengthToIpv4Mask Mask value %x, expected 0x00000001\n", Mask); + + apiReturn = pConvertLengthToIpv4Mask(32, &Mask); + ok(apiReturn == NO_ERROR, + "ConvertLengthToIpv4Mask returned %d, expected NO_ERROR\n", apiReturn); + ok(Mask == 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 +2246,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**);
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check? Full results can be found at https://testbot.winehq.org/JobDetails.pl?Key=36844
Your paranoid android.
=== wvistau64 (32 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== wvistau64_zh_CN (32 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== wvistau64_fr (32 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== wvistau64_he (32 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== w2008s64 (32 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== w7u (32 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== w7pro64 (32 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== w8 (32 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== w864 (32 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== w1064 (32 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== wvistau64 (64 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== w2008s64 (64 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== w7pro64 (64 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== w864 (64 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001
=== w1064 (64 bit iphlpapi) === iphlpapi.c:2199: Test failed: ConvertLengthToIpv4Mask Mask value 80, expected 0x80000000 iphlpapi.c:2205: Test failed: ConvertLengthToIpv4Mask Mask value feffffff, expected 0x00000001