https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7b970c67a8fe271a755f7…
commit 7b970c67a8fe271a755f786d6c8130efb17685a6
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sun May 30 21:12:58 2021 +0200
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Sun May 30 21:12:58 2021 +0200
[NETCFGX] Create unique network connection names
---
dll/win32/netcfgx/installer.c | 83 ++++++++++++++++++++++++++++++++++++++-----
1 file changed, 74 insertions(+), 9 deletions(-)
diff --git a/dll/win32/netcfgx/installer.c b/dll/win32/netcfgx/installer.c
index a9eb0a710ba..067ff12320f 100644
--- a/dll/win32/netcfgx/installer.c
+++ b/dll/win32/netcfgx/installer.c
@@ -4,10 +4,11 @@
* FILE: dll/win32/netcfgx/installer.c
* PURPOSE: Network devices installer
*
- * PROGRAMMERS: Herv� Poussineau (hpoussin(a)reactos.org)
+ * PROGRAMMERS: Hervé Poussineau (hpoussin(a)reactos.org)
*/
#include "precomp.h"
+#include <strsafe.h>
/* Append a REG_SZ to an existing REG_MULTI_SZ string in the registry.
@@ -89,6 +90,59 @@ cleanup:
return rc;
}
+static
+DWORD
+GetUniqueConnectionName(
+ _In_ HKEY hNetworkKey,
+ _Out_ PWSTR *ppszNameBuffer)
+{
+ int Length = 0;
+ PWSTR pszDefaultName = NULL;
+ PWSTR pszNameBuffer = NULL;
+ DWORD dwSubKeys = 0;
+ DWORD dwError;
+
+ TRACE("GetNewConnectionName()\n");
+
+ Length = LoadStringW(netcfgx_hInstance, IDS_NET_CONNECT, (LPWSTR)&pszDefaultName,
0);
+ if (Length == 0)
+ {
+ pszDefaultName = L"Network Connection";
+ Length = wcslen(pszDefaultName);
+ }
+
+ TRACE("Length %d\n", Length);
+
+ dwError = RegQueryInfoKeyW(hNetworkKey,
+ NULL, NULL, NULL, &dwSubKeys,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ if (dwError != ERROR_SUCCESS)
+ {
+ ERR("RegQueryInfoKeyW: Error %lu\n", dwError);
+ return dwError;
+ }
+
+ TRACE("Adapter Count: %lu\n", dwSubKeys);
+
+ pszNameBuffer = HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ (Length + ((dwSubKeys != 0) ? 6 : 1)) * sizeof(WCHAR));
+ if (pszNameBuffer == NULL)
+ {
+ return ERROR_OUTOFMEMORY;
+ }
+
+ if (dwSubKeys != 0)
+ StringCchPrintfW(pszNameBuffer, Length + 6, L"%.*s %lu", Length,
pszDefaultName, dwSubKeys + 1);
+ else
+ StringCchPrintfW(pszNameBuffer, Length + 1, L"%.*s", Length,
pszDefaultName);
+
+ TRACE("Adapter Name: %S\n", pszNameBuffer);
+
+ *ppszNameBuffer = pszNameBuffer;
+
+ return ERROR_SUCCESS;
+}
static
DWORD
@@ -110,7 +164,7 @@ InstallNetDevice(
HKEY hLinkageKey = NULL;
HKEY hConnectionKey = NULL;
DWORD dwShowIcon, dwLength, dwValue;
- WCHAR szBuffer[300];
+ PWSTR pszNameBuffer = NULL;
PWSTR ptr;
DeviceInstallParams.cbSize = sizeof(DeviceInstallParams);
@@ -336,13 +390,28 @@ InstallNetDevice(
hKey = NULL;
/* Write connection information in network subkey */
- rc = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY, NULL, &hNetworkKey, NULL);
+ rc = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
+
L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}",
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_CREATE_SUB_KEY | KEY_QUERY_VALUE,
+ NULL,
+ &hNetworkKey,
+ NULL);
if (rc != ERROR_SUCCESS)
{
ERR("RegCreateKeyExW() failed with error 0x%lx\n", rc);
goto cleanup;
}
+ rc = GetUniqueConnectionName(hNetworkKey, &pszNameBuffer);
+ if (rc != ERROR_SUCCESS)
+ {
+ ERR("GetUniqueConnectionName() failed with error 0x%lx\n", rc);
+ goto cleanup;
+ }
+
rc = RegCreateKeyExW(hNetworkKey, UuidString, 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_CREATE_SUB_KEY, NULL, &hKey, NULL);
if (rc != ERROR_SUCCESS)
{
@@ -359,12 +428,7 @@ InstallNetDevice(
goto cleanup;
}
- if (!LoadStringW(netcfgx_hInstance, IDS_NET_CONNECT, szBuffer,
sizeof(szBuffer)/sizeof(WCHAR)))
- {
- wcscpy(szBuffer, L"Network Connection");
- }
-
- rc = RegSetValueExW(hConnectionKey, L"Name", 0, REG_SZ, (const
BYTE*)szBuffer, (wcslen(szBuffer) + 1) * sizeof(WCHAR));
+ rc = RegSetValueExW(hConnectionKey, L"Name", 0, REG_SZ, (const
BYTE*)pszNameBuffer, (wcslen(pszNameBuffer) + 1) * sizeof(WCHAR));
if (rc != ERROR_SUCCESS)
{
ERR("RegSetValueExW() failed with error 0x%lx\n", rc);
@@ -423,6 +487,7 @@ InstallNetDevice(
rc = ERROR_SUCCESS;
cleanup:
+ HeapFree(GetProcessHeap(), 0, pszNameBuffer);
HeapFree(GetProcessHeap(), 0, InstanceId);
HeapFree(GetProcessHeap(), 0, ComponentId);
HeapFree(GetProcessHeap(), 0, DeviceName);