280 lines
7.8 KiB
C++
280 lines
7.8 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1999.
|
|
//
|
|
// File: E C O M P . H
|
|
//
|
|
// Contents: Implements the interface to a component's external data.
|
|
// External data is that data controlled (or placed) by
|
|
// PnP or the network class installer. Everything under a
|
|
// component's instance key is considered external data.
|
|
// (Internal data is that data we store in the persisted binary
|
|
// for the network configuration. See persist.cpp for
|
|
// code that deals with internal data.)
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: shaunco 15 Jan 1999
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
#include "ncmisc.h"
|
|
|
|
#define ECD_OFFSET(_p) (UINT)FIELD_OFFSET(CExternalComponentData, _p)
|
|
|
|
class CExternalComponentData : CNetCfgDebug<CExternalComponentData>
|
|
{
|
|
friend class CImplINetCfgComponent;
|
|
|
|
private:
|
|
// The data buffer into which subsequent member pointers will point.
|
|
// Always freed.
|
|
//
|
|
PVOID m_pvBuffer;
|
|
|
|
// For enumerated components, this is the 'DriverDesc' value from PnP.
|
|
// For non-enumerated components, this is read from the instance key.
|
|
// In both cases, this is the localizable string value that comes from
|
|
// the component's INF. It is displayed as the component's
|
|
// display name in any UI. Note that this is the only member which
|
|
// can be changed. Therefore, it does not point into the same buffer
|
|
// which all the others point. Freed if it does not point into
|
|
// m_pvBuffer.
|
|
//
|
|
PCWSTR m_pszDescription;
|
|
|
|
// The CLSID of the component's notify object. Will be NULL in
|
|
// the case the component does not have a notify object. Never freed.
|
|
//
|
|
const GUID* m_pNotifyObjectClsid;
|
|
|
|
// The component's primary service. Will be NULL if the component does
|
|
// not have a service. Never freed.
|
|
//
|
|
PCWSTR m_pszService;
|
|
|
|
// The component's list of co-services as a multi-sz. Will be NULL
|
|
// if the component does not have any co-services. Never freed.
|
|
//
|
|
PCWSTR m_pmszCoServices;
|
|
|
|
// The component's bind form. Will be NULL if the component takes the
|
|
// default bindform. Never freed.
|
|
//
|
|
PCWSTR m_pszBindForm;
|
|
|
|
// The component's help text. Will be NULL if the component does not
|
|
// have any help text. (Not recommened for visible component's)
|
|
// Never freed.
|
|
//
|
|
PCWSTR m_pszHelpText;
|
|
|
|
// Comma-separated list of sub-strings that are the
|
|
// lower-edge binding interfaces. Never freed.
|
|
//
|
|
PCWSTR m_pszLowerRange;
|
|
|
|
// Comma-separated list of sub-strings that are the
|
|
// upper-edge binding interfaces.
|
|
//
|
|
PCWSTR m_pszUpperRange;
|
|
|
|
// Comma-separated list of sub-strings that are the excluded
|
|
// binding interfaces.
|
|
//
|
|
PCWSTR m_pszLowerExclude;
|
|
|
|
// Comma-separated list of sub-strings that are the media types supported
|
|
// by this filter component. (Only valid for filters.)
|
|
//
|
|
PCWSTR m_pszFilterMediaTypes;
|
|
|
|
// This pointer is just so that we have an upper bound on the pointers
|
|
// that point into m_pvBuffer. We use this knowledge to know
|
|
// whether or not to free m_pszDescription as it may not be
|
|
// pointing somewhere in this buffer for the case when it has been
|
|
// changed and hence uses its own allocation.
|
|
//
|
|
PVOID m_pvBufferLast;
|
|
|
|
// The bindname for the component. This is built from BindForm,
|
|
// Class, Character, ServiceName, InfId, and InstanceGuid.
|
|
// It is a seaparate allocation made with LocalAlloc (because
|
|
// FormatMessage is used to build it.) Freed with LocalFree.
|
|
//
|
|
PCWSTR m_pszBindName;
|
|
|
|
// The result of HrEnsureExternalDataLoaded. It is saved, so that on
|
|
// subsequent calls, we return the same result we did the first time.
|
|
//
|
|
HRESULT m_hrLoadResult;
|
|
|
|
// FALSE until HrEnsureExternalDataLoaded is called. TRUE thereafter
|
|
// which prevents HrEnsureExternalDataLoaded from hitting the registry
|
|
// again. Indicates all of the other members are cached and valid.
|
|
//
|
|
BOOLEAN m_fInitialized;
|
|
|
|
private:
|
|
HRESULT
|
|
HrLoadData (
|
|
IN HKEY hkeyInstance,
|
|
OUT BYTE* pbBuf OPTIONAL,
|
|
IN OUT ULONG* pcbBuf);
|
|
|
|
VOID
|
|
FreeDescription ();
|
|
|
|
VOID
|
|
FreeExternalData ();
|
|
|
|
public:
|
|
~CExternalComponentData ()
|
|
{
|
|
FreeExternalData ();
|
|
}
|
|
|
|
HRESULT
|
|
HrEnsureExternalDataLoaded ();
|
|
|
|
HRESULT
|
|
HrReloadExternalData ();
|
|
|
|
HRESULT
|
|
HrSetDescription (
|
|
PCWSTR pszNewDescription);
|
|
|
|
BOOL
|
|
FHasNotifyObject () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
return (NULL != m_pNotifyObjectClsid);
|
|
}
|
|
|
|
BOOL
|
|
FLoadedOkayIfLoadedAtAll () const;
|
|
|
|
const CLSID*
|
|
PNotifyObjectClsid () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
AssertH (m_pNotifyObjectClsid);
|
|
return m_pNotifyObjectClsid;
|
|
}
|
|
|
|
PCWSTR
|
|
PszAtOffset (
|
|
IN UINT unOffset) const
|
|
{
|
|
AssertH (
|
|
(ECD_OFFSET(m_pszDescription) == unOffset) ||
|
|
(ECD_OFFSET(m_pszService) == unOffset) ||
|
|
(ECD_OFFSET(m_pszBindForm) == unOffset) ||
|
|
(ECD_OFFSET(m_pszHelpText) == unOffset) ||
|
|
(ECD_OFFSET(m_pszLowerRange) == unOffset) ||
|
|
(ECD_OFFSET(m_pszUpperRange) == unOffset) ||
|
|
(ECD_OFFSET(m_pszBindName) == unOffset));
|
|
|
|
PCWSTR psz;
|
|
psz = *(PCWSTR*)((BYTE*)this + unOffset);
|
|
|
|
AssertH (
|
|
(m_pszDescription == psz) ||
|
|
(m_pszService == psz) ||
|
|
(m_pszBindForm == psz) ||
|
|
(m_pszHelpText == psz) ||
|
|
(m_pszLowerRange == psz) ||
|
|
(m_pszLowerRange == psz) ||
|
|
(m_pszBindName == psz));
|
|
|
|
return psz;
|
|
}
|
|
|
|
PCWSTR
|
|
PszBindForm () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
return m_pszBindForm;
|
|
}
|
|
|
|
PCWSTR
|
|
PszBindName () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
AssertH (m_pszBindName && *m_pszBindName);
|
|
return m_pszBindName;
|
|
}
|
|
|
|
PCWSTR
|
|
PszDescription () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
return m_pszDescription;
|
|
}
|
|
|
|
PCWSTR
|
|
PszHelpText () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
return m_pszHelpText;
|
|
}
|
|
|
|
PCWSTR
|
|
PszService () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
return m_pszService;
|
|
}
|
|
|
|
PCWSTR
|
|
PszCoServices () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
return m_pmszCoServices;
|
|
}
|
|
|
|
PCWSTR
|
|
PszFilterMediaTypes () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
return m_pszFilterMediaTypes;
|
|
}
|
|
|
|
PCWSTR
|
|
PszLowerRange () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
return (m_pszLowerRange) ? m_pszLowerRange : L"";
|
|
}
|
|
|
|
PCWSTR
|
|
PszLowerExclude () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
return m_pszLowerExclude;
|
|
}
|
|
|
|
PCWSTR
|
|
PszUpperRange () const
|
|
{
|
|
AssertH (m_fInitialized && (S_OK == m_hrLoadResult));
|
|
return (m_pszUpperRange) ? m_pszUpperRange : L"";
|
|
}
|
|
|
|
#if DBG
|
|
BOOL DbgIsExternalDataLoaded () const
|
|
{
|
|
return m_fInitialized && (S_OK == m_hrLoadResult);
|
|
}
|
|
VOID DbgVerifyExternalDataLoaded () const
|
|
{
|
|
AssertH (DbgIsExternalDataLoaded());
|
|
}
|
|
#else
|
|
BOOL DbgIsExternalDataLoaded () const { return TRUE; }
|
|
VOID DbgVerifyExternalDataLoaded () const {}
|
|
#endif
|
|
};
|