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.
|
|
//+---------------------------------------------------------------------------
//
// 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 { 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
};
|