[PATCH 4/6] iphlpapi: Implement ConvertGuidToString[AW]().

Huw Davies huw at codeweavers.com
Thu Jul 8 03:00:00 CDT 2021


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/iphlpapi/iphlpapi.spec    |  4 ++--
 dlls/iphlpapi/iphlpapi_main.c  | 28 ++++++++++++++++++++++++++--
 dlls/iphlpapi/tests/iphlpapi.c | 24 ++++++++++++++++++++++++
 3 files changed, 52 insertions(+), 4 deletions(-)

diff --git a/dlls/iphlpapi/iphlpapi.spec b/dlls/iphlpapi/iphlpapi.spec
index 4299af36660..480b26c9315 100644
--- a/dlls/iphlpapi/iphlpapi.spec
+++ b/dlls/iphlpapi/iphlpapi.spec
@@ -10,8 +10,8 @@
 @ stdcall AllocateAndGetUdpTableFromStack( ptr long long long )
 @ stdcall CancelIPChangeNotify( ptr )
 @ stdcall CancelMibChangeNotify2( ptr )
-#@ stub ConvertGuidToStringA
-#@ stub ConvertGuidToStringW
+@ stdcall ConvertGuidToStringA( ptr ptr long )
+@ stdcall ConvertGuidToStringW( ptr ptr long )
 @ stdcall ConvertInterfaceAliasToLuid( ptr ptr )
 @ stdcall ConvertInterfaceGuidToLuid( ptr ptr )
 @ stdcall ConvertInterfaceIndexToLuid( long ptr )
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index d8696f62ab7..ffd0028ff42 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -73,6 +73,30 @@ WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
 #define INADDR_NONE ~0UL
 #endif
 
+#define CHARS_IN_GUID 39
+
+DWORD WINAPI ConvertGuidToStringA( const GUID *guid, char *str, DWORD len )
+{
+    if (len < CHARS_IN_GUID) return ERROR_INSUFFICIENT_BUFFER;
+    sprintf( str, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
+             guid->Data1, guid->Data2, guid->Data3, guid->Data4[0], guid->Data4[1], guid->Data4[2],
+             guid->Data4[3], guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
+    return ERROR_SUCCESS;
+}
+
+DWORD WINAPI ConvertGuidToStringW( const GUID *guid, WCHAR *str, DWORD len )
+{
+    static const WCHAR fmt[] = { '{','%','0','8','X','-','%','0','4','X','-','%','0','4','X','-',
+                                 '%','0','2','X','%','0','2','X','-','%','0','2','X','%','0','2','X',
+                                 '%','0','2','X','%','0','2','X','%','0','2','X','%','0','2','X','}',0 };
+
+    if (len < CHARS_IN_GUID) return ERROR_INSUFFICIENT_BUFFER;
+    sprintfW( str, fmt,
+              guid->Data1, guid->Data2, guid->Data3, guid->Data4[0], guid->Data4[1], guid->Data4[2],
+              guid->Data4[3], guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
+    return ERROR_SUCCESS;
+}
+
 /******************************************************************
  *    AddIPAddress (IPHLPAPI.@)
  *
@@ -989,7 +1013,7 @@ static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index
     }
 
     total_size = sizeof(IP_ADAPTER_ADDRESSES);
-    total_size += 39; /* "{00000000-0000-0000-0000-000000000000}" */
+    total_size += CHARS_IN_GUID;
     total_size += IF_NAMESIZE * sizeof(WCHAR);
     if (!(flags & GAA_FLAG_SKIP_FRIENDLY_NAME))
         total_size += IF_NAMESIZE * sizeof(WCHAR);
@@ -1030,7 +1054,7 @@ static ULONG adapterAddressesFromIndex(ULONG family, ULONG flags, IF_INDEX index
                 guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5],
                 guid.Data4[6], guid.Data4[7]);
         aa->AdapterName = ptr;
-        ptr += 39;
+        ptr += CHARS_IN_GUID;
 
         getInterfaceNameByIndex(index, name);
         if (!(flags & GAA_FLAG_SKIP_FRIENDLY_NAME))
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index bbd3ac2cc9e..daf3fec0a98 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -67,6 +67,9 @@ static DWORD (WINAPI *pNotifyUnicastIpAddressChange)(ADDRESS_FAMILY, PUNICAST_IP
                                                 PVOID, BOOLEAN, HANDLE *);
 static DWORD (WINAPI *pCancelMibChangeNotify2)(HANDLE);
 
+DWORD WINAPI ConvertGuidToStringA( const GUID *, char *, DWORD );
+DWORD WINAPI ConvertGuidToStringW( const GUID *, WCHAR *, DWORD );
+
 static void loadIPHlpApi(void)
 {
   hLibrary = LoadLibraryA("iphlpapi.dll");
@@ -2331,6 +2334,26 @@ static void test_NotifyUnicastIpAddressChange(void)
     ok(!CloseHandle(handle), "CloseHandle() succeeded.\n");
 }
 
+static void test_ConvertGuidToString( void )
+{
+    DWORD err;
+    char bufA[39];
+    WCHAR bufW[39];
+    GUID guid = { 0xa, 0xb, 0xc, { 0xd, 0, 0xe, 0xf } };
+
+    err = ConvertGuidToStringA( &guid, bufA, 38 );
+    ok( err, "got %d\n", err );
+    err = ConvertGuidToStringA( &guid, bufA, 39 );
+    ok( !err, "got %d\n", err );
+    ok( !strcmp( bufA, "{0000000A-000B-000C-0D00-0E0F00000000}" ), "got %s\n", bufA );
+
+    err = ConvertGuidToStringW( &guid, bufW, 38 );
+    ok( err, "got %d\n", err );
+    err = ConvertGuidToStringW( &guid, bufW, 39 );
+    ok( !err, "got %d\n", err );
+    ok( !wcscmp( bufW, L"{0000000A-000B-000C-0D00-0E0F00000000}" ), "got %s\n", debugstr_w( bufW ) );
+}
+
 START_TEST(iphlpapi)
 {
 
@@ -2363,6 +2386,7 @@ START_TEST(iphlpapi)
     test_GetUdp6Table();
     test_ParseNetworkString();
     test_NotifyUnicastIpAddressChange();
+    test_ConvertGuidToString();
     freeIPHlpApi();
   }
 }
-- 
2.23.0




More information about the wine-devel mailing list