[PATCH v2] iphlpapi: Add support for ConvertLengthToIpv4Mask()

Dagfinn Reiakvam dagfinn at reiakvam.no
Sun Mar 18 04:01:57 CDT 2018


On 17. mars 2018 19:30, Dagfinn Reiakvam wrote:
> From: Uberdaff <dagfinn at reiakvam.no>
>
> ---
>   dlls/iphlpapi/iphlpapi.spec    |  2 +-
>   dlls/iphlpapi/iphlpapi_main.c  | 23 +++++++++++++++
>   dlls/iphlpapi/tests/iphlpapi.c | 64 ++++++++++++++++++++++++++++++++++++++++++
>   include/netioapi.h             |  1 +
>   4 files changed, 89 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..e7461ce 100644
> --- a/dlls/iphlpapi/iphlpapi_main.c
> +++ b/dlls/iphlpapi/iphlpapi_main.c
> @@ -3223,6 +3223,29 @@ 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
> +    {
> +        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 );
> +    }
> +
> +    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..681cfc4 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 == 0x00000080,
> +   "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 == 0x000000ff,
> +   "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 == 0x0000ffff,
> +   "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 == 0x00ffffff,
> +   "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 == 0xfeffffff,
> +   "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 == 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**);

This patch fixes bug:
https://bugs.winehq.org/show_bug.cgi?id=44742

Signed-off-by: <dagfinn at reiakvam.no>




More information about the wine-devel mailing list