|
|
#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; }
|