Signed-off-by: Huw Davies huw@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(); } }