mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|
|
|
|
};
|