windows-nt/Source/XPSP1/NT/net/config/netcfg/netcomm/netobj.cpp
2020-09-26 16:20:57 +08:00

247 lines
6.4 KiB
C++

#include "pch.h"
#pragma hdrstop
#include "advanced.h"
#include "hwres.h"
#include "ncreg.h"
#include "ncsetup.h"
#include "netcomm.h"
#include "netsetup.h"
HRESULT
HrDoOemUpgradeProcessing(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid,
PCWSTR pszAnswerFile, PCWSTR pszAnswerSections)
{
// Open the driver key
//
HKEY hkey;
HRESULT hr = HrSetupDiOpenDevRegKey(hdi, pdeid,
DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_ALL_ACCESS,
&hkey);
if (S_OK == hr)
{
TraceTag(ttidNetComm, "Calling OEM Upgrade Code");
hr = HrOemUpgrade (hkey, pszAnswerFile, pszAnswerSections);
RegCloseKey(hkey);
}
TraceError("HrDoOemUpgradeProcessing", hr);
return hr;
}
VOID
UpdateAdvancedParametersIfNeeded(HDEVINFO hdi, PSP_DEVINFO_DATA pdeid)
{
Assert(IsValidHandle(hdi));
Assert(pdeid);
CAdvancedParams Advanced;
// initialize advanced params class. This will load parameters and check
// if current values exist. For each parameter with no current value,
// a modifed flag is set which will cause the default to be written
// as the current value on FSave.
//
if (SUCCEEDED(Advanced.HrInit(hdi, pdeid)))
{
// Save any modified values.
(void) Advanced.FSave();
}
}
BOOL
ProcessAnswerFile(
PCWSTR pszAnswerFile,
PCWSTR pszAnswerSections,
HDEVINFO hdi,
PSP_DEVINFO_DATA pdeid)
{
Assert(IsValidHandle(hdi));
Assert(pdeid);
CAdvancedParams Advanced;
BOOL fAdvanced = FALSE;
BOOL fResources = FALSE;
BOOL fModified = FALSE;
if (pszAnswerFile && pszAnswerSections)
{
CHwRes Resources;
HRESULT hr = Resources.HrInit(pdeid->DevInst);
// Only continue to use the HwRes class if S_OK is returned.
//
if (S_OK == hr)
{
Resources.UseAnswerFile(pszAnswerFile, pszAnswerSections);
fResources = TRUE;
}
else
{
hr = S_OK;
}
// initialize
if (SUCCEEDED(Advanced.HrInit(hdi, pdeid)))
{
// We need the advanced params class.
fAdvanced = TRUE;
}
// If the device has advanced paramters, have the advanced class
// read the parameters from the answerfile.
if (fAdvanced)
{
Advanced.UseAnswerFile(pszAnswerFile, pszAnswerSections);
}
hr = HrDoOemUpgradeProcessing(hdi, pdeid, pszAnswerFile,
pszAnswerSections);
if (S_OK == hr)
{
fModified = TRUE;
}
if (fResources)
{
// Validate answerfile params for pResources (hardware resources)
// and apply if validated.
hr = Resources.HrValidateAnswerfileSettings(FALSE);
if (S_OK == hr)
{
Resources.FCommitAnswerfileSettings();
fModified = TRUE;
}
#ifdef ENABLETRACE
else
{
TraceTag(ttidNetComm, "Error in answerfile concerning "
"hardware resources. Base section %S",
pszAnswerSections);
}
#endif
}
// Validate the advanced parameters from the answerfile
// This will attempt to correct bad params. Even though an
// error status is returned, it shouldn't stop us and we should
// still apply changes.
//
if (fAdvanced)
{
(void) Advanced.FValidateAllParams(FALSE, NULL);
// Save any advanced params
fModified = Advanced.FSave();
}
TraceError("Netcomm::HrUpdateAdapterParameters",
(S_FALSE == hr) ? S_OK : hr);
}
return fModified;
}
BOOL
FUpdateAdapterParameters(PCWSTR pszAnswerFile,
PCWSTR pszAnswerSection,
HDEVINFO hdi,
PSP_DEVINFO_DATA pdeid)
{
Assert(IsValidHandle(hdi));
Assert(pdeid);
CAdvancedParams Advanced;
BOOL fAdvanced = FALSE;
BOOL fResources = FALSE;
// initialize
if (SUCCEEDED(Advanced.HrInit(hdi, pdeid)))
{
// We need the advanced params class
fAdvanced = TRUE;
}
if (pszAnswerFile && pszAnswerSection)
{
CHwRes Resources;
HRESULT hr = Resources.HrInit(pdeid->DevInst);
// Only continue to use the HwRes class if S_OK is returned,
// otherwise set a flag to ignore the class (Note: ignore the
// class on S_FALSE as well)
if (S_OK == hr)
{
Resources.UseAnswerFile(pszAnswerFile, pszAnswerSection);
fResources = TRUE;
}
else
{
hr = S_OK;
}
// If the device has advanced paramters, have the advanced class
// read the parameters from the answerfile
if (fAdvanced)
{
Advanced.UseAnswerFile(pszAnswerFile, pszAnswerSection);
}
hr = HrDoOemUpgradeProcessing(hdi, pdeid, pszAnswerFile,
pszAnswerSection);
if (fResources)
{
// Validate answerfile params for pResources (hardware resources)
// and apply if validated
hr = Resources.HrValidateAnswerfileSettings(FALSE);
if (S_OK == hr)
{
Resources.FCommitAnswerfileSettings();
}
#ifdef ENABLETRACE
else
{
TraceTag(ttidNetComm, "Error in answerfile concerning "
"hardware resources. Base section %S",
pszAnswerSection);
}
#endif
}
// Validate the advanced parameters from the answerfile
// This will attempt to correct bad params. Even though an
// error status is returned, it shouldn't stop us and we should
// still apply changes
//
if (fAdvanced)
{
(void) Advanced.FValidateAllParams(FALSE, NULL);
}
TraceError("Netcomm::HrUpdateAdapterParameters",
(S_FALSE == hr) ? S_OK : hr);
}
// Save any advanced params
// Note: we have to do this even if there was no answerfile
// Since the parameters might have defaults
if (fAdvanced)
{
Advanced.FSave();
}
// return TRUE if we had advanced parameters or resources updated
return (fAdvanced || fResources);
}