diff --git a/dll/win32/iphlpapi/iphlpapi.spec b/dll/win32/iphlpapi/iphlpapi.spec index 4e91c10569c..094bdef963e 100644 --- a/dll/win32/iphlpapi/iphlpapi.spec +++ b/dll/win32/iphlpapi/iphlpapi.spec @@ -133,7 +133,7 @@ @ stub IsLocalAddress @ stub NTPTimeToNTFileTime @ stub NTTimeToNTPTime -@ stub NhGetGuidFromInterfaceName +@ stdcall NhGetGuidFromInterfaceName(wstr ptr long long) @ stdcall NhGetInterfaceNameFromDeviceGuid(ptr ptr ptr long long) @ stdcall NhGetInterfaceNameFromGuid(ptr ptr ptr long long) @ stdcall NhpAllocateAndGetInterfaceInfoFromStack(ptr ptr long ptr long) diff --git a/dll/win32/iphlpapi/iphlpapi_main.c b/dll/win32/iphlpapi/iphlpapi_main.c index 97392ce9cd8..3fa8553762b 100644 --- a/dll/win32/iphlpapi/iphlpapi_main.c +++ b/dll/win32/iphlpapi/iphlpapi_main.c @@ -3342,3 +3342,80 @@ NhGetInterfaceNameFromGuid(_In_ const GUID * pInterfaceGUID, return result; } + +DWORD WINAPI +NhGetGuidFromInterfaceName(_In_ PWCHAR pInterfaceName, + _Out_ GUID *pInterfaceGUID, + DWORD dwUnknown3, + DWORD dwUnknown4) +{ + WCHAR szGuidBuffer[45]; + UNICODE_STRING GuidString; + HKEY hAdaptersKey = NULL, hAdapterKey = NULL, hConnectionKey = NULL; + PWSTR pszNameBuffer = NULL; + DWORD i, dwNameSize, dwValueSize; + BOOL bFound = FALSE; + DWORD result = ERROR_SUCCESS; + + result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}", 0, KEY_READ, &hAdaptersKey); + if (result != ERROR_SUCCESS) + { + // failed to find adapter entry + return ERROR_NOT_FOUND; + } + + for (i = 0; ; i++) + { + dwNameSize = ARRAYSIZE(szGuidBuffer); + result = RegEnumKeyExW(hAdaptersKey, + i, + szGuidBuffer, + &dwNameSize, + NULL, + NULL, + NULL, + NULL); + if (result != ERROR_SUCCESS) + break; + + TRACE("Guid %S\n", szGuidBuffer); + + result = RegOpenKeyExW(hAdaptersKey, szGuidBuffer, 0, KEY_READ, &hAdapterKey); + if (result == ERROR_SUCCESS) + { + result = RegOpenKeyExW(hAdapterKey, L"Connection", 0, KEY_READ, &hConnectionKey); + if (result == ERROR_SUCCESS) + { + RegQueryValueExW(hConnectionKey, L"Name", NULL, NULL, NULL, &dwValueSize); + pszNameBuffer = HeapAlloc(GetProcessHeap(), 0, dwValueSize); + if (pszNameBuffer) + { + RegQueryValueExW(hConnectionKey, L"Name", NULL, NULL, (PBYTE)pszNameBuffer, &dwValueSize); + + TRACE("%S -- %S\n", pInterfaceName, pszNameBuffer); + if (_wcsnicmp(pInterfaceName, pszNameBuffer, wcslen(pszNameBuffer)) == 0) + { + TRACE("Found it!\n"); + RtlInitUnicodeString(&GuidString, szGuidBuffer); + RtlGUIDFromString(&GuidString, pInterfaceGUID); + + bFound = TRUE; + } + + HeapFree(GetProcessHeap(), 0, pszNameBuffer); + } + + RegCloseKey(hConnectionKey); + } + + RegCloseKey(hAdapterKey); + } + + if (bFound == TRUE) + break; + } + + RegCloseKey(hAdaptersKey); + + return bFound ? ERROR_SUCCESS : ERROR_NOT_FOUND; +} diff --git a/sdk/include/reactos/iphlpapi_undoc.h b/sdk/include/reactos/iphlpapi_undoc.h index 6e6334f1f4b..2555735e7b2 100644 --- a/sdk/include/reactos/iphlpapi_undoc.h +++ b/sdk/include/reactos/iphlpapi_undoc.h @@ -1,6 +1,14 @@ #ifndef __IPHLPAPI_UNDOC_H__ #define __IPHLPAPI_UNDOC_H__ +DWORD +WINAPI +NhGetGuidFromInterfaceName( + _In_ PWCHAR pInterfaceName, + _Out_ GUID *pInterfaceGUID, + DWORD dwUnknown3, + DWORD dwUnknown4); + DWORD WINAPI NhGetInterfaceNameFromDeviceGuid(