Skip to content

Commit 4369126

Browse files
committed
[NETCFGX] Read IpAddress, SubnetMask, DefaultGateway and DefaultGatewayMetric from the registry
1 parent 546297f commit 4369126

1 file changed

Lines changed: 258 additions & 65 deletions

File tree

‎dll/win32/netcfgx/tcpipconf_notify.c‎

Lines changed: 258 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ ExtractParameterValue(
536536
PWSTR pToken, pStart, pEnd, pBuffer;
537537
INT length = 0;
538538

539-
ERR("ExtractParameterValue(%S, %S)\n", pszParameters, pszParameter);
539+
TRACE("ExtractParameterValue(%S, %S)\n", pszParameters, pszParameter);
540540

541541
pToken = wcsstr(pszParameters, pszParameter);
542542
if (pToken == NULL)
@@ -3084,63 +3084,6 @@ InitializeTcpipBasicDlgCtrls(
30843084
return S_OK;
30853085
}
30863086

3087-
HRESULT
3088-
CopyIpAddrString(
3089-
IP_ADDR_STRING * pSrc,
3090-
IP_ADDR ** pTarget,
3091-
COPY_TYPE Type,
3092-
LPWSTR szMetric)
3093-
{
3094-
IP_ADDR_STRING * pCurrent;
3095-
IP_ADDR *pNew, *pLast;
3096-
3097-
pCurrent = pSrc;
3098-
pLast = NULL;
3099-
3100-
while(pCurrent)
3101-
{
3102-
pNew = CoTaskMemAlloc(sizeof(IP_ADDR));
3103-
if (!pNew)
3104-
{
3105-
break;
3106-
}
3107-
ZeroMemory(pNew, sizeof(IP_ADDR));
3108-
pNew->IpAddress = GetIpAddressFromStringA(pCurrent->IpAddress.String);
3109-
if (!pNew->IpAddress)
3110-
{
3111-
CoTaskMemFree(pNew);
3112-
return E_FAIL;
3113-
}
3114-
3115-
if (Type == SUBMASK)
3116-
{
3117-
pNew->u.SubnetMask = GetIpAddressFromStringA(pCurrent->IpMask.String);
3118-
pNew->NTEContext = pCurrent->Context;
3119-
}
3120-
else if (Type == METRIC)
3121-
{
3122-
if (szMetric && szMetric[0] != L'\0')
3123-
{
3124-
pNew->u.Metric = _wtoi(szMetric);
3125-
szMetric += wcslen(szMetric) + 1;
3126-
}
3127-
}
3128-
3129-
if (!pLast)
3130-
*pTarget = pNew;
3131-
else
3132-
pLast->Next = pNew;
3133-
3134-
pLast = pNew;
3135-
pCurrent = pCurrent->Next;
3136-
3137-
}
3138-
pLast->Next = NULL;
3139-
return S_OK;
3140-
}
3141-
3142-
3143-
31443087
INT_PTR
31453088
CALLBACK
31463089
TcpipBasicDlg(
@@ -3621,7 +3564,251 @@ LoadTcpipSettings(
36213564
}
36223565

36233566
HRESULT
3624-
ParseNameServer(
3567+
LoadAddressSetings(
3568+
HKEY hAdapterKey,
3569+
AdapterSettings *pAdapter)
3570+
{
3571+
PWSTR pszBuffer1 = NULL, pszBuffer2 = NULL, pStart1, pStart2, pEnd1, pEnd2;
3572+
DWORD dwSize;
3573+
IN_ADDR Address, SubnetMask;
3574+
IP_ADDR *pNewAddrEntry, *pOldAddrEntry, *pNewLast = NULL, *pOldLast = NULL;
3575+
HRESULT hr = S_OK;
3576+
NTSTATUS Status;
3577+
3578+
TRACE("LoadAddressSettings()\n");
3579+
3580+
dwSize = 0;
3581+
RegQueryValueExW(hAdapterKey, L"IpAddress", NULL, NULL, NULL, &dwSize);
3582+
if (dwSize == 0)
3583+
return S_OK;
3584+
3585+
pszBuffer1 = CoTaskMemAlloc(dwSize);
3586+
if (pszBuffer1 == NULL)
3587+
{
3588+
hr = E_OUTOFMEMORY;
3589+
goto done;
3590+
}
3591+
3592+
if (RegQueryValueExW(hAdapterKey, L"IpAddress", NULL, NULL, (PBYTE)pszBuffer1, &dwSize) != ERROR_SUCCESS)
3593+
{
3594+
hr = E_FAIL;
3595+
goto done;
3596+
}
3597+
3598+
dwSize = 0;
3599+
RegQueryValueExW(hAdapterKey, L"SubnetMask", NULL, NULL, NULL, &dwSize);
3600+
if (dwSize == 0)
3601+
return S_OK;
3602+
3603+
pszBuffer2 = CoTaskMemAlloc(dwSize);
3604+
if (pszBuffer2 == NULL)
3605+
{
3606+
hr = E_OUTOFMEMORY;
3607+
goto done;
3608+
}
3609+
3610+
if (RegQueryValueExW(hAdapterKey, L"SubnetMask", NULL, NULL, (PBYTE)pszBuffer2, &dwSize) != ERROR_SUCCESS)
3611+
{
3612+
hr = E_FAIL;
3613+
goto done;
3614+
}
3615+
3616+
pStart1 = pszBuffer1;
3617+
pStart2 = pszBuffer2;
3618+
for (;;)
3619+
{
3620+
TRACE("Start1: %S\n", pStart1);
3621+
TRACE("Start2: %S\n", pStart2);
3622+
Status = RtlIpv4StringToAddressW(pStart1, TRUE, (LPCWSTR *)&pEnd1, &Address);
3623+
if (Status != 0)
3624+
{
3625+
ERR("RtlIpv4StringToAddressW Status 0x%08lx\n", Status);
3626+
hr = E_FAIL;
3627+
break;
3628+
}
3629+
3630+
TRACE("Adress: %lx\n", Address.S_un.S_addr);
3631+
3632+
Status = RtlIpv4StringToAddressW(pStart2, TRUE, (LPCWSTR *)&pEnd2, &SubnetMask);
3633+
if (Status != 0)
3634+
{
3635+
ERR("RtlIpv4StringToAddressW Status 0x%08lx\n", Status);
3636+
hr = E_FAIL;
3637+
break;
3638+
}
3639+
3640+
TRACE("SubnetMask: %lx\n", SubnetMask.S_un.S_addr);
3641+
3642+
pNewAddrEntry = CoTaskMemAlloc(sizeof(IP_ADDR));
3643+
if (pNewAddrEntry)
3644+
{
3645+
ZeroMemory(pNewAddrEntry, sizeof(IP_ADDR));
3646+
pNewAddrEntry->IpAddress = ntohl(Address.S_un.S_addr);
3647+
pNewAddrEntry->u.SubnetMask = ntohl(SubnetMask.S_un.S_addr);;
3648+
3649+
if (!pNewLast)
3650+
pAdapter->NewIp = pNewAddrEntry;
3651+
else
3652+
pNewLast->Next = pNewAddrEntry;
3653+
3654+
pNewLast = pNewAddrEntry;
3655+
}
3656+
3657+
pOldAddrEntry = CoTaskMemAlloc(sizeof(IP_ADDR));
3658+
if (pOldAddrEntry)
3659+
{
3660+
ZeroMemory(pOldAddrEntry, sizeof(IP_ADDR));
3661+
pOldAddrEntry->IpAddress = ntohl(Address.S_un.S_addr);
3662+
pOldAddrEntry->u.SubnetMask = ntohl(SubnetMask.S_un.S_addr);;
3663+
3664+
if (!pOldLast)
3665+
pAdapter->OldIp = pOldAddrEntry;
3666+
else
3667+
pOldLast->Next = pOldAddrEntry;
3668+
3669+
pOldLast = pOldAddrEntry;
3670+
}
3671+
3672+
pStart1 = pEnd1 + 1;
3673+
pStart2 = pEnd2 + 1;
3674+
3675+
if ((*pStart1 == UNICODE_NULL) || (*pStart2 == UNICODE_NULL))
3676+
break;
3677+
}
3678+
3679+
done:
3680+
if (pszBuffer1)
3681+
CoTaskMemFree(pszBuffer1);
3682+
3683+
if (pszBuffer2)
3684+
CoTaskMemFree(pszBuffer2);
3685+
3686+
return hr;
3687+
}
3688+
3689+
3690+
HRESULT
3691+
LoadGatewaySettings(
3692+
HKEY hAdapterKey,
3693+
AdapterSettings *pAdapter)
3694+
{
3695+
PWSTR pszBuffer1 = NULL, pszBuffer2 = NULL, pStart1, pStart2, pEnd1, pEnd2;
3696+
DWORD dwSize, dwMetric;
3697+
IN_ADDR Address;
3698+
IP_ADDR *pNewAddrEntry, *pOldAddrEntry, *pNewLast = NULL, *pOldLast = NULL;
3699+
HRESULT hr = S_OK;
3700+
NTSTATUS Status;
3701+
3702+
TRACE("LoadGatewaySettings()\n");
3703+
3704+
dwSize = 0;
3705+
RegQueryValueExW(hAdapterKey, L"DefaultGateway", NULL, NULL, NULL, &dwSize);
3706+
if (dwSize == 0)
3707+
return S_OK;
3708+
3709+
pszBuffer1 = CoTaskMemAlloc(dwSize);
3710+
if (pszBuffer1 == NULL)
3711+
{
3712+
hr = E_OUTOFMEMORY;
3713+
goto done;
3714+
}
3715+
3716+
if (RegQueryValueExW(hAdapterKey, L"DefaultGateway", NULL, NULL, (PBYTE)pszBuffer1, &dwSize) != ERROR_SUCCESS)
3717+
{
3718+
hr = E_FAIL;
3719+
goto done;
3720+
}
3721+
3722+
dwSize = 0;
3723+
RegQueryValueExW(hAdapterKey, L"DefaultGatewayMetric", NULL, NULL, NULL, &dwSize);
3724+
if (dwSize == 0)
3725+
return S_OK;
3726+
3727+
pszBuffer2 = CoTaskMemAlloc(dwSize);
3728+
if (pszBuffer2 == NULL)
3729+
{
3730+
hr = E_OUTOFMEMORY;
3731+
goto done;
3732+
}
3733+
3734+
if (RegQueryValueExW(hAdapterKey, L"DefaultGatewayMetric", NULL, NULL, (PBYTE)pszBuffer2, &dwSize) != ERROR_SUCCESS)
3735+
{
3736+
hr = E_FAIL;
3737+
goto done;
3738+
}
3739+
3740+
pStart1 = pszBuffer1;
3741+
pStart2 = pszBuffer2;
3742+
for (;;)
3743+
{
3744+
TRACE("Start1: %S\n", pStart1);
3745+
TRACE("Start2: %S\n", pStart2);
3746+
Status = RtlIpv4StringToAddressW(pStart1, TRUE, (LPCWSTR *)&pEnd1, &Address);
3747+
if (Status != 0)
3748+
{
3749+
ERR("RtlIpv4StringToAddressW Status 0x%08lx\n", Status);
3750+
hr = E_FAIL;
3751+
break;
3752+
}
3753+
3754+
TRACE("Adress: %lx\n", Address.S_un.S_addr);
3755+
3756+
dwMetric = wcstoul(pStart2, &pEnd2, 10);
3757+
if (dwMetric > 9999)
3758+
dwMetric = 9999;
3759+
3760+
TRACE("Metric: %lu\n", dwMetric);
3761+
3762+
pNewAddrEntry = CoTaskMemAlloc(sizeof(IP_ADDR));
3763+
if (pNewAddrEntry)
3764+
{
3765+
ZeroMemory(pNewAddrEntry, sizeof(IP_ADDR));
3766+
pNewAddrEntry->IpAddress = ntohl(Address.S_un.S_addr);
3767+
pNewAddrEntry->u.Metric = (USHORT)dwMetric;
3768+
3769+
if (!pNewLast)
3770+
pAdapter->NewGw = pNewAddrEntry;
3771+
else
3772+
pNewLast->Next = pNewAddrEntry;
3773+
3774+
pNewLast = pNewAddrEntry;
3775+
}
3776+
3777+
pOldAddrEntry = CoTaskMemAlloc(sizeof(IP_ADDR));
3778+
if (pOldAddrEntry)
3779+
{
3780+
ZeroMemory(pOldAddrEntry, sizeof(IP_ADDR));
3781+
pOldAddrEntry->IpAddress = ntohl(Address.S_un.S_addr);
3782+
pOldAddrEntry->u.Metric = (USHORT)dwMetric;
3783+
3784+
if (!pOldLast)
3785+
pAdapter->OldGw = pOldAddrEntry;
3786+
else
3787+
pOldLast->Next = pOldAddrEntry;
3788+
3789+
pOldLast = pOldAddrEntry;
3790+
}
3791+
3792+
pStart1 = pEnd1 + 1;
3793+
pStart2 = pEnd2 + 1;
3794+
3795+
if ((*pStart1 == UNICODE_NULL) || (*pStart2 == UNICODE_NULL))
3796+
break;
3797+
}
3798+
3799+
done:
3800+
if (pszBuffer1)
3801+
CoTaskMemFree(pszBuffer1);
3802+
3803+
if (pszBuffer2)
3804+
CoTaskMemFree(pszBuffer2);
3805+
3806+
return hr;
3807+
}
3808+
3809+
3810+
HRESULT
3811+
LoadNameServerSettings(
36253812
HKEY hAdapterKey,
36263813
AdapterSettings *pAdapter)
36273814
{
@@ -3654,9 +3841,9 @@ ParseNameServer(
36543841
for (;;)
36553842
{
36563843
Status = RtlIpv4StringToAddressW(pStart, TRUE, (LPCWSTR *)&pEnd, &Address);
3657-
TRACE("RtlIpv4StringToAddressW Status 0x%08lx\n", Status);
36583844
if (Status != 0)
36593845
{
3846+
ERR("RtlIpv4StringToAddressW Status 0x%08lx\n", Status);
36603847
hr = E_FAIL;
36613848
break;
36623849
}
@@ -3716,6 +3903,8 @@ LoadAdapterSettings(
37163903
DWORD dwSize;
37173904
HRESULT hr = S_OK;
37183905

3906+
TRACE("LoadAdapterSettings()\n");
3907+
37193908
pAdapter = (AdapterSettings*)CoTaskMemAlloc(sizeof(AdapterSettings));
37203909
if (!pAdapter)
37213910
return E_FAIL;
@@ -3738,14 +3927,18 @@ LoadAdapterSettings(
37383927

37393928
if (!pAdapterInfo->DhcpEnabled)
37403929
{
3741-
CopyIpAddrString(&pAdapterInfo->IpAddressList, &pAdapter->NewIp, SUBMASK, NULL);
3742-
CopyIpAddrString(&pAdapterInfo->IpAddressList, &pAdapter->OldIp, SUBMASK, NULL);
3930+
hr = LoadAddressSetings(hAdapterKey, pAdapter);
3931+
if (FAILED(hr))
3932+
goto done;
37433933
}
37443934

3745-
CopyIpAddrString(&pAdapterInfo->GatewayList, &pAdapter->NewGw, METRIC, NULL);
3746-
CopyIpAddrString(&pAdapterInfo->GatewayList, &pAdapter->OldGw, METRIC, NULL);
3935+
hr = LoadGatewaySettings(hAdapterKey, pAdapter);
3936+
if (FAILED(hr))
3937+
goto done;
37473938

3748-
ParseNameServer(hAdapterKey, pAdapter);
3939+
hr = LoadNameServerSettings(hAdapterKey, pAdapter);
3940+
if (FAILED(hr))
3941+
goto done;
37493942

37503943
pAdapter->DnsDhcpEnabled = (pAdapter->NewDhcpEnabled && (pAdapter->NewNs == NULL));
37513944

0 commit comments

Comments
 (0)