diff --git a/dll/win32/netcfgx/netcfg_iface.c b/dll/win32/netcfgx/netcfg_iface.c index 37340d2402f..3d0ce2273b3 100644 --- a/dll/win32/netcfgx/netcfg_iface.c +++ b/dll/win32/netcfgx/netcfg_iface.c @@ -255,7 +255,7 @@ EnumClientServiceProtocol(HKEY hKey, const GUID * pGuid, NetCfgComponentItem ** DWORD dwType; WCHAR szName[100]; WCHAR szText[100]; - HKEY hSubKey, hNDIKey; + HKEY hSubKey, hNDIKey, hInterfacesKey; NetCfgComponentItem * pLast = NULL, *pCurrent; *pHead = NULL; @@ -341,6 +341,44 @@ EnumClientServiceProtocol(HKEY hKey, const GUID * pGuid, NetCfgComponentItem ** wcscpy(pCurrent->szBindName, szText); } } + + if (RegOpenKeyExW(hNDIKey, L"Interfaces", 0, KEY_READ, &hInterfacesKey) == ERROR_SUCCESS) + { + /* retrieve LowerRange */ + dwSize = sizeof(szText); + if (RegQueryValueExW(hInterfacesKey, L"LowerRange", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS) + { + if (dwType == REG_SZ) + { + szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; + pCurrent->pszLowerRange = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR)); + if (pCurrent->pszLowerRange) + { + wcscpy(pCurrent->pszLowerRange, szText); + TRACE("LowerRange: %S\n", pCurrent->pszLowerRange); + } + } + } + + /* retrieve UpperRange */ + dwSize = sizeof(szText); + if (RegQueryValueExW(hInterfacesKey, L"UpperRange", NULL, &dwType, (LPBYTE)szText, &dwSize) == ERROR_SUCCESS) + { + if (dwType == REG_SZ) + { + szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; + pCurrent->pszUpperRange = CoTaskMemAlloc((wcslen(szText)+1)* sizeof(WCHAR)); + if (pCurrent->pszUpperRange) + { + wcscpy(pCurrent->pszUpperRange, szText); + TRACE("UpperRange: %S\n", pCurrent->pszUpperRange); + } + } + } + + RegCloseKey(hInterfacesKey); + } + RegCloseKey(hNDIKey); } RegCloseKey(hSubKey); @@ -393,7 +431,7 @@ EnumerateNetworkAdapter(NetCfgComponentItem ** pHead) DWORD dwSize, dwIndex; HDEVINFO hInfo; SP_DEVINFO_DATA DevInfo; - HKEY hKey; + HKEY hKey, hInterfacesKey; WCHAR szNetCfg[50]; WCHAR szAdapterNetCfg[MAX_DEVICE_ID_LEN]; WCHAR szDetail[200] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\"; @@ -463,6 +501,35 @@ EnumerateNetworkAdapter(NetCfgComponentItem ** pHead) wcscpy(pCurrent->szDisplayName, szAdapterNetCfg); } + if (RegOpenKeyExW(hKey, L"NDI\\Interfaces", 0, KEY_READ, &hInterfacesKey) == ERROR_SUCCESS) + { + /* retrieve LowerRange */ + dwSize = sizeof(szAdapterNetCfg); + if (RegQueryValueExW(hInterfacesKey, L"LowerRange", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS) + { + pCurrent->pszLowerRange = CoTaskMemAlloc((wcslen(szAdapterNetCfg) + 1) * sizeof(WCHAR)); + if (pCurrent->pszLowerRange) + { + wcscpy(pCurrent->pszLowerRange, szAdapterNetCfg); + TRACE("LowerRange: %S\n", pCurrent->pszLowerRange); + } + } + + /* retrieve UpperRange */ + dwSize = sizeof(szAdapterNetCfg); + if (RegQueryValueExW(hInterfacesKey, L"UpperRange", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS) + { + pCurrent->pszUpperRange = CoTaskMemAlloc((wcslen(szAdapterNetCfg) + 1) * sizeof(WCHAR)); + if (pCurrent->pszUpperRange) + { + wcscpy(pCurrent->pszUpperRange, szAdapterNetCfg); + TRACE("UpperRange: %S\n", pCurrent->pszUpperRange); + } + } + + RegCloseKey(hInterfacesKey); + } + RegCloseKey(hKey); /* open network connections details */ wcscpy(&szName[80], szNetCfg); @@ -682,6 +749,8 @@ FreeComponentItem(NetCfgComponentItem *pItem) CoTaskMemFree(pItem->szId); CoTaskMemFree(pItem->szBindName); CoTaskMemFree(pItem->szNodeId); + CoTaskMemFree(pItem->pszUpperRange); + CoTaskMemFree(pItem->pszLowerRange); CoTaskMemFree(pItem->pszBinding); CoTaskMemFree(pItem); } diff --git a/dll/win32/netcfgx/precomp.h b/dll/win32/netcfgx/precomp.h index 5dc48127705..c36511eb6d5 100644 --- a/dll/win32/netcfgx/precomp.h +++ b/dll/win32/netcfgx/precomp.h @@ -51,6 +51,8 @@ typedef struct tagNetCfgComponentItem DWORD dwCharacteristics; //Y ULONG Status; //Y BOOL bChanged; //Y + LPWSTR pszUpperRange; + LPWSTR pszLowerRange; LPWSTR pszBinding; INetCfgComponentControl *pControl; INetCfgComponentPropertyUi *pPropertyUi;