@@ -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-
31443087INT_PTR
31453088CALLBACK
31463089TcpipBasicDlg (
@@ -3621,7 +3564,251 @@ LoadTcpipSettings(
36213564}
36223565
36233566HRESULT
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