From 38afa1a48fb08a376c05dc1c346d74f2514ed0cb Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 16 Oct 2025 14:19:11 +0200 Subject: [PATCH] [NETSH][REACTOS] Implement and export NsGetFriendlyNameFromIfName Running the 'interface ip show address' command on XPs ifmon.dll now fails in netcfgx.dll. --- .../applications/network/netsh/CMakeLists.txt | 2 +- base/applications/network/netsh/netsh.c | 37 +++++++++++++++++++ base/applications/network/netsh/netsh.spec | 2 +- base/applications/network/netsh/precomp.h | 4 ++ sdk/include/reactos/netsh_undoc.h | 12 ++++++ 5 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 sdk/include/reactos/netsh_undoc.h diff --git a/base/applications/network/netsh/CMakeLists.txt b/base/applications/network/netsh/CMakeLists.txt index 16459a9829d..0dd79839141 100644 --- a/base/applications/network/netsh/CMakeLists.txt +++ b/base/applications/network/netsh/CMakeLists.txt @@ -20,7 +20,7 @@ set_target_properties(netsh set_module_type(netsh win32cui UNICODE) target_link_libraries(netsh conutils ${PSEH_LIB}) -add_importlibs(netsh advapi32 msvcrt user32 kernel32 ntdll) +add_importlibs(netsh iphlpapi advapi32 msvcrt user32 kernel32 ntdll) add_pch(netsh precomp.h SOURCE) add_cd_file(TARGET netsh DESTINATION reactos/system32 FOR all) diff --git a/base/applications/network/netsh/netsh.c b/base/applications/network/netsh/netsh.c index b53b266bd4f..6e88499ba8f 100644 --- a/base/applications/network/netsh/netsh.c +++ b/base/applications/network/netsh/netsh.c @@ -237,6 +237,43 @@ MatchToken( return (_wcsnicmp(pwszUserToken, pwszCmdToken, wcslen(pwszUserToken)) == 0) ? TRUE : FALSE; } +DWORD +WINAPI +NsGetFriendlyNameFromIfName( + _In_ DWORD dwUnknown1, + _In_ PWSTR pszIfName, + _Inout_ PWSTR pszFriendlyName, + _Inout_ PDWORD pdwFriendlyName) +{ + UNICODE_STRING UnicodeIfName; + GUID InterfaceGuid; + NTSTATUS Status; + DWORD ret; + + DPRINT("NsGetFriendlyNameFromIfName(%lx %S %p %p)\n", + dwUnknown1, pszIfName, pszFriendlyName, pdwFriendlyName); + + RtlInitUnicodeString(&UnicodeIfName, pszIfName); + Status = RtlGUIDFromString(&UnicodeIfName, + &InterfaceGuid); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlGUIDFromString failed 0x%08lx\n", Status); + return RtlNtStatusToDosError(Status); + } + + ret = NhGetInterfaceNameFromDeviceGuid(&InterfaceGuid, + pszFriendlyName, + pdwFriendlyName, + 0, 0); + if (ret != ERROR_SUCCESS) + { + DPRINT1("NhGetInterfaceNameFromDeviceGuid() failed %lu\n", ret); + } + + return ret; +} + DWORD WINAPI PreprocessCommand( diff --git a/base/applications/network/netsh/netsh.spec b/base/applications/network/netsh/netsh.spec index 4fd05411b23..ea2d57ce410 100644 --- a/base/applications/network/netsh/netsh.spec +++ b/base/applications/network/netsh/netsh.spec @@ -14,7 +14,7 @@ @ stdcall MatchEnumTag(ptr wstr long ptr ptr) @ stub MatchTagsInCmdLine @ stdcall MatchToken(wstr wstr) -@ stub NsGetFriendlyNameFromIfName +@ stdcall NsGetFriendlyNameFromIfName(long wstr ptr ptr) @ stub NsGetIfNameFromFriendlyName @ stdcall PreprocessCommand(ptr ptr long long ptr long long long ptr) @ varargs PrintError(ptr long) diff --git a/base/applications/network/netsh/precomp.h b/base/applications/network/netsh/precomp.h index c0969e15cfb..429781851ff 100644 --- a/base/applications/network/netsh/precomp.h +++ b/base/applications/network/netsh/precomp.h @@ -14,17 +14,21 @@ #include #include +#include + #define WIN32_NO_STATUS #include #include #include #include #include +#include #include #include #include +#include #include "resource.h" diff --git a/sdk/include/reactos/netsh_undoc.h b/sdk/include/reactos/netsh_undoc.h new file mode 100644 index 00000000000..2562cdf9516 --- /dev/null +++ b/sdk/include/reactos/netsh_undoc.h @@ -0,0 +1,12 @@ +#ifndef __NETSH_UNDOC_H__ +#define __NETSH_UNDOC_H__ + +DWORD +WINAPI +NsGetFriendlyNameFromIfName( + _In_ DWORD dwParam1, + _In_ PWSTR pszIfName, + _Inout_ PWSTR pszFriendlyName, + _Inout_ PDWORD pdwFriendlyName); + +#endif /* __NETSH_UNDOC_H__ */