248 lines
6.7 KiB
C++
248 lines
6.7 KiB
C++
#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;
|
|
}
|