Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

232 lines
5.8 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1999.
//
// File: C O M P . H
//
// Contents: The basic datatype for a network component.
//
// Notes:
//
// Author: shaunco 15 Jan 1999
//
//----------------------------------------------------------------------------
#pragma once
#include "compdefs.h"
#include "comprefs.h"
#include "ecomp.h"
#include "ncstring.h"
#include "netcfgx.h"
#include "notify.h"
// Flags used when creating a CComponent instance.
//
enum CCI_FLAGS
{
CCI_DEFAULT = 0x00000000,
CCI_ENSURE_EXTERNAL_DATA_LOADED = 0x00000001,
};
class CComponent
{
friend class CExternalComponentData;
friend class CImplINetCfgComponent;
public:
// The instance guid of the component. Assigned by the class installer
// when the component is installed. The instance guid of a component
// can NEVER change once it is installed.
//
GUID m_InstanceGuid;
private:
// The class of the component. It is private so that folks are forced
// to use the Class() access method which asserts that the value is
// in an allowable range. The class for a component can NEVER change
// once it is installed.
//
NETCLASS m_Class;
// Member to store the handle to the inf file of this component.
// This is used to avoid the expense of opening the inf file more than
// once over the lifetime of the component.
//
mutable HINF m_hinf;
public:
// The characteristics of the component. A combination of NCF_
// flags defined in netcfgx.idl. The characteristics of a component
// can NEVER change once it is installed.
//
DWORD m_dwCharacter;
// The INF ID of the component. e.g. ms_tcpip. The INF ID of a component
// can NEVER change once it is installed.
//
PCWSTR m_pszInfId;
// The PnP Instance ID of the component. This is only
// valid for components that are considered of class NET. It can
// NEVER change once the component is installed.
//
PCWSTR m_pszPnpId;
// This is the interface to the component's external data. External data
// is under the instance key.
//
CExternalComponentData Ext;
// This is the interface to the component's optional notify object.
//
CNotifyObjectInterface Notify;
// This is the interface to the component's references. i.e. who
// has installed this component.
//
CComponentReferences Refs;
// This is a cached copy (addref'd) of this component's
// INetCfgComponent interface. It is created via
// HrGetINetCfgComponentInterface on the first call.
//
class CImplINetCfgComponent* m_pIComp;
// Valid for NCF_FILTER components only. This is the
// ordinal position that this filter gets within the range of
// filter classes. See filtdevs.h for more info.
//
DWORD m_dwFilterClassOrdinal;
// Valid for enumerated components only. This is the
// SP_DEVINSTALL_PARAMS.Flags value the class installer was told to
// use when installing the device. We need to honor this when starting
// it.
//
DWORD m_dwDeipFlags;
// When removing non-enumerated components, this string will hold
// the name of the remove section valid in this component's INF.
// We need to process this remove section (for delete files) after
// we release the notify object so that the component has a chance to
// properly delete the notify object dll.
//
tstring m_strRemoveSection;
private:
// Declare all constructors private so that no one except
// HrCreateInstance can create instances of this class.
//
CComponent() {}
public:
~CComponent();
NETCLASS
Class() const
{
AssertH (FIsValidNetClass(m_Class));
return m_Class;
}
BOOL
FCanDirectlyBindTo (
IN const CComponent* pLower,
OUT const WCHAR** ppStart,
OUT ULONG* pcch) const;
BOOL
FHasService() const
{
return (Ext.PszService()) ? TRUE : FALSE;
}
BOOL
FIsBindable () const;
BOOL
FIsFilter () const
{
return m_dwCharacter & NCF_FILTER;
}
BOOL
FIsWanAdapter () const;
HINF
GetCachedInfFile () const
{
return m_hinf;
}
HRESULT
HrOpenInfFile (OUT HINF* phinf) const;
void
CloseInfFile () const
{
Assert(m_hinf);
SetupCloseInfFile (m_hinf);
m_hinf = NULL;
}
static
HRESULT
HrCreateInstance (
IN const BASIC_COMPONENT_DATA* pData,
IN DWORD dwFlags /* CCI_FLAGS */,
IN const OBO_TOKEN* pOboToken, OPTIONAL
OUT CComponent** ppComponent);
HRESULT
HrGetINetCfgComponentInterface (
IN class CImplINetCfg* pINetCfg,
OUT INetCfgComponent** ppIComp);
INetCfgComponent*
GetINetCfgComponentInterface () const;
VOID
ReleaseINetCfgComponentInterface ();
HRESULT
HrOpenDeviceInfo (
OUT HDEVINFO* phdiOut,
OUT SP_DEVINFO_DATA* pdeidOut) const;
HRESULT
HrOpenInstanceKey (
IN REGSAM samDesired,
OUT HKEY* phkey,
OUT HDEVINFO* phdiOut OPTIONAL,
OUT SP_DEVINFO_DATA* pdeidOut OPTIONAL) const;
HRESULT
HrOpenServiceKey (
IN REGSAM samDesired,
OUT HKEY* phkey) const;
HRESULT
HrStartOrStopEnumeratedComponent (
IN DWORD dwFlag /* DICS_START or DICS_STOP */) const;
PCWSTR
PszGetPnpIdOrInfId () const
{
AssertH (FIsValidNetClass(m_Class));
AssertH (FImplies(FIsEnumerated(m_Class),
m_pszPnpId && *m_pszPnpId));
if (!m_pszPnpId)
{
AssertH (m_pszInfId && *m_pszInfId);
return m_pszInfId;
}
AssertH (m_pszPnpId && *m_pszPnpId);
return m_pszPnpId;
}
};