windows-nt/Source/XPSP1/NT/net/config/netcfg/engine/file.cpp

248 lines
6.7 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "pch.h"
#pragma hdrstop
#include "file.h"
#include "ncsetup.h"
//+---------------------------------------------------------------------------
//
// Parse the specified INF section which corresponds to a component's
// defintion. Return the upper-range and lower-range that the component
// can bind over.
// e.g. a section like:
// [Tcpip]
// UpperRange = "tdi"
// LowerRange = "ndis5,ndis4,ndisatm,ndiswanip,ndis5_ip"
//
// Arguments:
// inf [in]
// pszSection [in]
// pstrUpperRange [out]
// pstrLowerRange [out]
//
// Returns: S_OK or an error code.
//
// Author: shaunco 25 Oct 1998
//
// Notes:
//
HRESULT
HrParseComponentSection (
IN HINF inf,
IN PCWSTR pszSection,
OUT tstring* pstrUpperRange,
OUT tstring* pstrLowerRange)
{
HRESULT hr;
// Initialize the output parameters.
//
pstrUpperRange->erase();
pstrLowerRange->erase();
// Get the UpperRange string. It is a set of comma-separated sub-strings.
//
hr = HrSetupGetFirstString (
inf,
pszSection,
L"UpperRange",
pstrUpperRange);
if (S_OK == hr)
{
if (0 == _wcsicmp (L"noupper", pstrUpperRange->c_str()))
{
pstrUpperRange->erase();
}
}
else if (SPAPI_E_LINE_NOT_FOUND != hr)
{
goto finished;
}
// Get the LowerRange string. It is a set of comma-separated sub-strings.
//
hr = HrSetupGetFirstString (
inf,
pszSection,
L"LowerRange",
pstrLowerRange);
if (S_OK == hr)
{
if (0 == _wcsicmp (L"nolower", pstrLowerRange->c_str()))
{
pstrLowerRange->erase();
}
}
else if (SPAPI_E_LINE_NOT_FOUND == hr)
{
hr = S_OK;
}
finished:
TraceHr (ttidError, FAL, hr, FALSE, "HrParseComponentSection");
return hr;
}
//+---------------------------------------------------------------------------
//
// Initialize a CNetConfig instance by reading information from an
// INF-style file.
//
// Arguments:
// pszFilepath [in]
// pNetConfig [out]
//
// Returns: S_OK or an error code.
//
// Author: shaunco 25 Oct 1998
//
// Notes:
//
HRESULT
HrLoadNetworkConfigurationFromFile (
IN PCTSTR pszFilepath,
OUT CNetConfig* pNetConfig)
{
CSetupInfFile inf;
UINT unErrorLine;
HRESULT hr;
INFCONTEXT ctx;
// Open the answer file. It will close itself in it's destructor.
//
hr = inf.HrOpen (
pszFilepath, NULL,
INF_STYLE_OLDNT | INF_STYLE_WIN4,
&unErrorLine);
if (S_OK == hr)
{
tstring strInfId;
tstring strPnpId;
tstring strUpperRange;
tstring strLowerRange;
BASIC_COMPONENT_DATA Data;
CComponent* pComponent;
// Find the [Components] section. This is a list of all of
// the components involved.
//
hr = HrSetupFindFirstLine (inf.Hinf(),
L"Components",
NULL,
&ctx);
// Process each line in this section by creating a CComponent instance
// for it and inserting it into the list of components owned by
// the CNetConfig instance we are initializing.
//
while (S_OK == hr)
{
ZeroMemory (&Data, sizeof(Data));
// Get each string field into a local variable and create
// a new CComponent instance if all succeed.
//
//hr = HrSetupGetStringField (ctx, 0, &strInstanceId);
//if (S_OK != hr) goto finished;
CoCreateGuid(&Data.InstanceGuid);
hr = HrSetupGetStringField (ctx, 1, &strInfId);
if (S_OK != hr) goto finished;
Data.pszInfId = strInfId.c_str();
hr = HrSetupGetIntField (ctx, 2, (INT*)&Data.Class);
if (S_OK != hr) goto finished;
hr = HrSetupGetIntField (ctx, 3, (INT*)&Data.dwCharacter);
if (S_OK != hr) goto finished;
hr = HrSetupGetStringField (ctx, 4, &strPnpId);
if (S_OK != hr) goto finished;
Data.pszPnpId = strPnpId.c_str();
hr = HrParseComponentSection (inf.Hinf(), strInfId.c_str(),
&strUpperRange, &strLowerRange);
if (S_OK != hr) goto finished;
//Data.pszUpperRange = strUpperRange.c_str();
//Data.pszLowerRange = strLowerRange.c_str();
hr = CComponent::HrCreateInstance(
&Data,
CCI_DEFAULT,
NULL,
&pComponent);
if (S_OK == hr)
{
hr = pNetConfig->Core.Components.HrInsertComponent (
pComponent, INS_NON_SORTED);
}
// S_FALSE returned if there is no next line.
//
hr = HrSetupFindNextMatchLine (ctx, NULL, &ctx);
}
}
if (SUCCEEDED(hr))
{
CComponentList* pComponents = &pNetConfig->Core.Components;
ULONG ulUpperIndex;
ULONG ulLowerIndex;
CStackEntry StackEntry;
// Find the [StackTable] section. This is a list of how the
// components are "stacked" on each other.
//
hr = HrSetupFindFirstLine (inf.Hinf(),
L"StackTable",
NULL,
&ctx);
// Process each line in this section by initialzing a CStackEntry
// structure and inserting a copy of it into the stack table
// maintained by the CNetConfig instance we are initializing.
//
while (S_OK == hr)
{
hr = HrSetupGetIntField (ctx, 0, (INT*)&ulUpperIndex);
if (S_OK != hr) goto finished;
hr = HrSetupGetIntField (ctx, 1, (INT*)&ulLowerIndex);
if (S_OK != hr) goto finished;
StackEntry.pUpper = pComponents->PGetComponentAtIndex (
ulUpperIndex);
StackEntry.pLower = pComponents->PGetComponentAtIndex (
ulLowerIndex);
hr = pNetConfig->Core.StackTable.HrInsertStackEntry (
&StackEntry, INS_SORTED);
if (S_OK != hr) goto finished;
// S_FALSE returned if there is no next line.
//
hr = HrSetupFindNextMatchLine (ctx, NULL, &ctx);
}
}
if (S_FALSE == hr)
{
hr = S_OK;
}
if (S_OK == hr)
{
pNetConfig->Core.DbgVerifyData();
}
finished:
TraceHr (ttidError, FAL, hr, FALSE, "HrLoadNetworkConfigurationFromFile");
return hr;
}