windows-nt/Source/XPSP1/NT/net/mmc/mprsnap/infoi.h
2020-09-26 16:20:57 +08:00

813 lines
24 KiB
C++

//============================================================================
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: info.h
//
// History:
// Abolade Gbadegesin Feb. 10, 1996 Created.
//
// This file contains declarations for InfoBase parsing code.
// Also including are classes for loading and saving the Router's
// configuration tree (CRouterInfo, CRmInfo, etc.)
//
// The classes are as follows
// (in the diagrams, d => derives, c => contains-list-of):
//
//
// CInfoBase
// |
// c---SInfoBlock
//
//
// CInfoBase holds block of data broken up into a list
// of SInfoBlock structures using RTR_INFO_BLOCK_HEADER
// as a template (see rtinfo.h).
//
// CRouterInfo // router info
// |
// c---CRmInfo // router-manager info
// | |
// | c---CRmProtInfo // protocol info
// |
// c---CInterfaceInfo // router interface info
// |
// c---CRmInterfaceInfo // router-manager interface
// |
// c---CRmProtInterfaceInfo // protocol info
//
// CRouterInfo top-level container for Router registry info.
// holds list of router-managers and interfaces.
//
// CRmInfo global information for a router-manager,
// holds list of routing-protocols.
//
// CRmProtInfo global information for a routing-protocol.
//
// CInterfaceInfo global information for a router-interface.
// holds list of CRmInterfaceInfo structures,
// which hold per-interface info for router-managers.
//
// CRmInterfaceInfo per-interface info for a router-manager.
// holds list of CRmProtInterfaceInfo structures,
// which hold per-interface info for protocols.
//
// CRmProtInterfaceInfo per-interface info for a routing-protocol.
//
//============================================================================
#ifndef _INFOI_H_
#define _INFOI_H_
#include "router.h"
#ifndef _INFOPRIV_H
#include "infopriv.h"
#endif
#ifndef _RTRLIST_H
#include "rtrlist.h"
#endif
//
// Forward declarations of router-information classes.
//
class CRmInfo;
class CRmProtInfo;
class CInterfaceInfo;
class CRmInterfaceInfo;
class CRmProtInterfaceInfo;
class RouterRefreshObject;
typedef struct _SRouterCB
{
DWORD dwLANOnlyMode; // 0 or 1
void LoadFrom(const RouterCB *pcb);
void SaveTo(RouterCB *pcb);
} SRouterCB;
typedef struct _SRtrMgrCB
{
DWORD dwTransportId; // e.g. PID_IP (mprapi.h)
CString stId; // e.g. "Tcpip"
CString stTitle; // e.g. "TCP/IP Router Manager"
CString stDLLPath; // e.g. "%systemroot%\system32\iprtrmgr.dll"
//CString stConfigDLL; // e.g. "rtrui.dll"
// Internal data
DWORD dwPrivate; // private data (for use internally)
void LoadFrom(const RtrMgrCB *pcb);
void SaveTo(RtrMgrCB *pcb);
} SRtrMgrCB;
typedef struct _SRtrMgrProtocolCB
{
DWORD dwProtocolId; // e.g. IP_RIP (routprot.h)
CString stId; // e.g. "IPRIP"
DWORD dwFlags;
DWORD dwTransportId; // e.g. PID_IP
CString stRtrMgrId; // e.g. "Tcpip"
CString stTitle; // e.g. "RIP for Internet Protocol"
CString stDLLName; // e.g. "iprip2.dll"
//CString stConfigDLL; // e.g. "rtrui.dll"
GUID guidConfig; // CLSID for config object
GUID guidAdminUI; // CLSID for snapin
CString stVendorName;
// Internal data
DWORD dwPrivate; // private data (for use internally)
void LoadFrom(const RtrMgrProtocolCB *pcb);
void SaveTo(RtrMgrProtocolCB *pcb);
} SRtrMgrProtocolCB;
typedef struct _SInterfaceCB
{
CString stId; // e.g. "EPRO1"
DWORD dwIfType; // e.g. ROUTER_IF_TYPE_CLIENT (mprapi.h)
BOOL bEnable; // e.g. Enabled or Disabled
CString stTitle; // e.g. friendly name(NT5) or the device name(NT4)
CString stDeviceName; // e.g. "[1] Intel EtherPro"
DWORD dwBindFlags; // e.g. Bound to IP or IPX
// Internal data
DWORD dwPrivate; // private data (for use internally)
void LoadFrom(const InterfaceCB *pcb);
void SaveTo(InterfaceCB *pcb);
} SInterfaceCB;
typedef struct _SRtrMgrInterfaceCB
{
DWORD dwTransportId; // e.g. PID_IP (mprapi.h)
CString stId; // e.g. "Tcpip"
CString stInterfaceId; // e.g. "EPRO1"
DWORD dwIfType; // e.g. ROUTER_IF_TYPE_CLIENT (mprapi.h)
CString stTitle; // e.g. "[1] Intel Etherexpress PRO"
// Internal data
DWORD dwPrivate; // private data (for use internally)
void LoadFrom(const RtrMgrInterfaceCB *pcb);
void SaveTo(RtrMgrInterfaceCB *pcb);
} SRtrMgrInterfaceCB;
typedef struct _SRtrMgrProtocolInterfaceCB
{
DWORD dwProtocolId; // e.g. IP_RIP (routprot.h)
CString stId; // e.g. "IPRIP"
DWORD dwTransportId; // e.g. PID_IP
CString stRtrMgrId; // e.g. "Tcpip"
CString stInterfaceId; // e.g. "EPRO1"
DWORD dwIfType; // e.g. ROUTER_IF_TYPE_CLIENT (mprapi.h)
CString stTitle; // e.g. "[1] Intel Etherexpress PRO"
// Internal data
DWORD dwPrivate; // private data (for use internally)
void LoadFrom(const RtrMgrProtocolInterfaceCB *pcb);
void SaveTo(RtrMgrProtocolInterfaceCB *pcb);
} SRtrMgrProtocolInterfaceCB;
/*---------------------------------------------------------------------------
CList classes for the external structures
---------------------------------------------------------------------------*/
typedef CList<RtrMgrCB *, RtrMgrCB *> RtrMgrCBList;
typedef CList<RtrMgrProtocolCB *, RtrMgrProtocolCB *> RtrMgrProtocolCBList;
typedef CList<InterfaceCB *, InterfaceCB *> InterfaceCBList;
typedef CList<RtrMgrInterfaceCB *, RtrMgrInterfaceCB *> RtrMgrInterfaceCBList;
typedef CList<RtrMgrProtocolInterfaceCB *, RtrMgrProtocolInterfaceCB *> RtrMgrProtocolInterfaceCBList;
/*---------------------------------------------------------------------------
CList classes for the various internal structures
---------------------------------------------------------------------------*/
typedef CList<SRtrMgrCB *, SRtrMgrCB *> SRtrMgrCBList;
typedef CList<SRtrMgrProtocolCB *, SRtrMgrProtocolCB *> SRtrMgrProtocolCBList;
typedef CList<SInterfaceCB *, SInterfaceCB *> SInterfaceCBList;
typedef CList<SRtrMgrInterfaceCB *, SRtrMgrInterfaceCB *> SRtrMgrInterfaceCBList;
typedef CList<SRtrMgrProtocolInterfaceCB *, SRtrMgrProtocolInterfaceCB *> SRtrMgrProtocolInterfaceCBList;
/*---------------------------------------------------------------------------
Smart pointers for the various structures
---------------------------------------------------------------------------*/
DeclareSP(SRouterCB, SRouterCB)
DeclareSP(SRtrMgrCB, SRtrMgrCB)
DeclareSP(SRtrMgrProtocolCB, SRtrMgrProtocolCB)
DeclareSP(SInterfaceCB, SInterfaceCB)
DeclareSP(SRtrMgrInterfaceCB, SRtrMgrInterfaceCB)
DeclareSP(SRtrMgrProtocolInterfaceCB, SRtrMgrProtocolInterfaceCB)
struct SRmData
{
IRtrMgrInfo * m_pRmInfo;
SRmData() : m_pRmInfo(NULL){};
// Do this instead of using a destructor to avoid problems with
// destruction of temporaries.
static void Destroy(SRmData *pRmData);
};
typedef CList<SRmData, SRmData> RmDataList;
struct SIfData
{
IInterfaceInfo * pIfInfo;
DWORD dwConnection;
SIfData() : pIfInfo(NULL), dwConnection(0) {};
};
typedef CList<SIfData, SIfData> IfList;
/*---------------------------------------------------------------------------
CreateEnum for the various CBs
---------------------------------------------------------------------------*/
HRESULT CreateEnumFromSRmCBList(SRtrMgrCBList *pRmCBList,
IEnumRtrMgrCB **ppEnum);
HRESULT CreateEnumFromSRmProtCBList(SRtrMgrProtocolCBList *pRmProtCBList,
IEnumRtrMgrProtocolCB **ppEnum);
HRESULT CreateEnumFromSIfCBList(SInterfaceCBList *pIfCBList,
IEnumInterfaceCB **ppEnum);
HRESULT CreateEnumFromSRmIfCBList(SRtrMgrInterfaceCBList *pRmIfCBList,
IEnumRtrMgrInterfaceCB **ppEnum);
HRESULT CreateEnumFromSRmProtIfCBList(SRtrMgrProtocolInterfaceCBList *pRmIfProtCBList,
IEnumRtrMgrProtocolInterfaceCB **ppEnum);
/*---------------------------------------------------------------------------
CreateEnum for the various interface lists
---------------------------------------------------------------------------*/
// These lists are assumed to have arrays of WEAK references!
HRESULT CreateEnumFromRmList(RmDataList *pRmList,
IEnumRtrMgrInfo **ppEnum);
HRESULT CreateEnumFromRtrMgrProtocolList(PRtrMgrProtocolInfoList *pRmProtList,
IEnumRtrMgrProtocolInfo **ppEnum);
HRESULT CreateEnumFromInterfaceList(PInterfaceInfoList *pIfList,
IEnumInterfaceInfo **ppEnum);
HRESULT CreateEnumFromRtrMgrInterfaceList(PRtrMgrInterfaceInfoList *pRmIfList,
IEnumRtrMgrInterfaceInfo **ppEnum);
HRESULT CreateEnumFromRtrMgrProtocolInterfaceList(PRtrMgrProtocolInterfaceInfoList *pRmProtIfList,
IEnumRtrMgrProtocolInterfaceInfo **ppEnum);
/*---------------------------------------------------------------------------
Struct: SAdviseData
Helper class for management of advise connections.
---------------------------------------------------------------------------*/
struct SAdviseData
{
IRtrAdviseSink *m_pAdvise;
LONG_PTR m_ulConnection;
LPARAM m_lUserParam;
// This m_ulFlags parameter is used by the AdviseDataList.
ULONG m_ulFlags;
SAdviseData() : m_pAdvise(NULL), m_ulConnection(0) {};
static void Destroy(SAdviseData *pAdviseData);
};
typedef CList<SAdviseData, SAdviseData> _SAdviseDataList;
// Possible values for the m_ulFlags
#define ADVISEDATA_DELETED (1)
class AdviseDataList : public _SAdviseDataList
{
public:
HRESULT AddConnection(IRtrAdviseSink *pAdvise,
LONG_PTR ulConnection,
LPARAM lUserParam);
HRESULT RemoveConnection(LONG_PTR ulConnection);
HRESULT NotifyChange(DWORD dwChange, DWORD dwObj, LPARAM lParam);
protected:
// Need to have a private list to handle the notifies.
// This list is created while in a NotifyChange(). Any calls
// to RemoveConnection() DURING a notify, will mark entries as
// invalid (and are thus not called during the NotifyChange()).
_SAdviseDataList m_listNotify;
};
/*---------------------------------------------------------------------------
Class: RtrCriticalSection
This class is used to support entering/leaving of critical sections.
Put this class at the top of a function that you want protected.
---------------------------------------------------------------------------*/
class RtrCriticalSection
{
public:
RtrCriticalSection(CRITICAL_SECTION *pCritSec)
: m_pCritSec(pCritSec)
{
IfDebug(m_cEnter=0;)
Assert(m_pCritSec);
Enter();
}
~RtrCriticalSection()
{
Detach();
}
void Enter()
{
if (m_pCritSec)
{
IfDebug(m_cEnter++;)
EnterCriticalSection(m_pCritSec);
AssertSz(m_cEnter==1, "EnterCriticalSection called too much!");
}
}
BOOL TryToEnter()
{
if (m_pCritSec)
return TryEnterCriticalSection(m_pCritSec);
return TRUE;
}
void Leave()
{
if (m_pCritSec)
{
IfDebug(m_cEnter--;)
LeaveCriticalSection(m_pCritSec);
Assert(m_cEnter==0);
}
}
void Detach()
{
Leave();
m_pCritSec = NULL;
}
private:
CRITICAL_SECTION * m_pCritSec;
IfDebug(int m_cEnter;)
};
/*---------------------------------------------------------------------------
Class: RouterInfo
---------------------------------------------------------------------------*/
class RouterInfo :
public CWeakRef,
public IRouterInfo,
public IRouterAdminAccess
{
public:
DeclareIUnknownMembers(IMPL)
DeclareIRouterRefreshAccessMembers(IMPL)
DeclareIRouterInfoMembers(IMPL)
DeclareIRtrAdviseSinkMembers(IMPL)
DeclareIRouterAdminAccessMembers(IMPL)
// Constructor
RouterInfo(HWND hWndSync, LPCWSTR machineName);
// If you are releasing ANY interface pointers do it in
// the Destruct() call instead.
virtual ~RouterInfo();
// Internal calls to help out with adding/removing interfaces
// ----------------------------------------------------------------
HRESULT AddInterfaceInternal(IInterfaceInfo *pInfo, BOOL fForce,
BOOL fAddToRouter);
HRESULT RemoveInterfaceInternal(LPCOLESTR pszIf, BOOL fRemoveFromRouter);
HRESULT RemoteRtrMgrInternal(DWORD dwTransportId, BOOL fRemoveFromRouter);
HRESULT FindInterfaceByName(LPCOLESTR pszIfName, IInterfaceInfo **ppInfo);
HRESULT NotifyRtrMgrInterfaceOfMove(IInterfaceInfo *pInfo);
// Functions to load up static information about the router.
// This will return information about the INSTALLED protocols/rms,
// not necessarily the RUNNING protocols/rms.
// ----------------------------------------------------------------
static HRESULT LoadInstalledRtrMgrList(LPCTSTR pszMachine,
SRtrMgrCBList *pRmCBList);
static HRESULT LoadInstalledInterfaceList(LPCTSTR pszMachine,
SInterfaceCBList *pIfCBList);
static HRESULT LoadInstalledRtrMgrProtocolList(LPCTSTR pszMachine,
DWORD dwTransportId, SRtrMgrProtocolCBList *pRmProtCBList,
LPCWSTR lpwszUserName, LPCWSTR lpwszPassword , LPCWSTR lpwszDomain );
static HRESULT LoadInstalledRtrMgrProtocolList(LPCTSTR pszMachine,
DWORD dwTransportId, SRtrMgrProtocolCBList *pRmProtCBList, RouterInfo * pRouter);
static HRESULT LoadInstalledRtrMgrProtocolList(LPCTSTR pszMachine,
DWORD dwTransportId, SRtrMgrProtocolCBList *pRmProtCBList, IRouterInfo * pRouter);
protected:
// The router control block for this router. There's not too much
// information here.
// ----------------------------------------------------------------
SRouterCB m_SRouterCB;
// List of Router-Managers that are running on the router.
// ----------------------------------------------------------------
RmDataList m_RmList;
// List of interfaces that have been added to the router.
// WEAK-REF ptrs to IInterfaceInfo objects.
// ----------------------------------------------------------------
PInterfaceInfoList m_IfList;
// Name of this machine.
// ----------------------------------------------------------------
CString m_stMachine;
// MPR_CONFIG_HANDLE to the router
// Obtained by MprAdminServerConnect();
// ----------------------------------------------------------------
MPR_CONFIG_HANDLE m_hMachineConfig;
// MPR_SERVER_HANDLE to the router
// Obtained by MprAdminServerConnect();
// ----------------------------------------------------------------
MPR_SERVER_HANDLE m_hMachineAdmin;
// This is set to TRUE if we are to disconnect the machine handles.
// ----------------------------------------------------------------
BOOL m_bDisconnect;
// This is the router type (LAN, WAN, RAS);
// ----------------------------------------------------------------
DWORD m_dwRouterType;
// Version info for the router and machine.
// ----------------------------------------------------------------
RouterVersionInfo m_VersionInfo;
// Pointer to the refresh object connected with this machine.
// ----------------------------------------------------------------
SPIRouterRefresh m_spRefreshObject;
HWND m_hWndSync; // hwnd of the background hidden window
SRtrMgrCBList m_RmCBList; // contains ptrs to RtrMgrCB objects
SRtrMgrProtocolCBList m_RmProtCBList; // ptrs to RtrMgrProtocolCB objects
SInterfaceCBList m_IfCBList; // ptrs to InterfaceCB objects
AdviseDataList m_AdviseList; // list of advises
DWORD m_dwFlags;
HRESULT LoadRtrMgrList();
HRESULT LoadInterfaceList();
HRESULT TryToConnect(LPCWSTR pswzMachine, HANDLE hMachine);
// Functions for merge support
HRESULT MergeRtrMgrCB(IRouterInfo *pNewRouter);
HRESULT MergeInterfaceCB(IRouterInfo *pNewRouter);
HRESULT MergeRtrMgrProtocolCB(IRouterInfo *pNewRouter);
HRESULT MergeRtrMgrs(IRouterInfo *pNewRouter);
HRESULT MergeInterfaces(IRouterInfo *pNewRouter);
SRtrMgrCB * FindRtrMgrCB(DWORD dwTransportId);
SInterfaceCB * FindInterfaceCB(LPCTSTR pszInterfaceId);
SRtrMgrProtocolCB * FindRtrMgrProtocolCB(DWORD dwTransportId, DWORD dwProtocolId);
// Disconnect
void Disconnect();
// Overrides of CWeakRef functions
virtual void OnLastStrongRef();
virtual void ReviveStrongRef();
// Critical section support
CRITICAL_SECTION m_critsec;
// Information for IRouterAdminAccess
BOOL m_fIsAdminInfoSet;
CString m_stUserName;
CString m_stDomain;
BYTE * m_pbPassword;
int m_cPassword;
};
/*---------------------------------------------------------------------------
Class: RtrMgrInfo
---------------------------------------------------------------------------*/
class RtrMgrInfo :
public IRtrMgrInfo,
public CWeakRef
{
public:
DeclareIUnknownMembers(IMPL)
DeclareIRtrMgrInfoMembers(IMPL)
RtrMgrInfo(DWORD dwTransportId, LPCTSTR pszTransportName,
RouterInfo *pRouterInfo);
virtual ~RtrMgrInfo();
protected:
SRtrMgrCB m_cb; // router-manager control block
PRtrMgrProtocolInfoList m_RmProtList; // list of routing-protocols
// CObList m_protList; // list of routing-protocols
CString m_stMachine; // machine whose config is loaded
HANDLE m_hMachineConfig; // handle to machine's router-config
HANDLE m_hTransport; // handle to transport's config
BOOL m_bDisconnect;
AdviseDataList m_AdviseList; // list of advises
DWORD m_dwFlags;
// This will contain a weak/strong ref on the parent
IRouterInfo * m_pRouterInfoParent;
//--------------------------------------------------------------------
// Functions: LoadRtrMgrInfo
// SaveRtrMgrInfo
//
// The following handle loading and saving the routing-protocol list
// for the router-manager in the correct format in the registry.
//--------------------------------------------------------------------
HRESULT LoadRtrMgrInfo(HANDLE hMachine,
HANDLE hTransport
);
HRESULT SaveRtrMgrInfo(HANDLE hMachine,
HANDLE hTransport,
IInfoBase *pGlobalInfo,
IInfoBase *pClientInfo,
DWORD dwDeleteProtocolId);
HRESULT TryToConnect(LPCWSTR pswzMachine, HANDLE *phMachine);
HRESULT TryToGetAllHandles(LPCOLESTR pszMachine,
HANDLE *phMachine,
HANDLE *phTransport);
// Disconnects this object
void Disconnect();
// Overrides of CWeakRef functions
virtual void OnLastStrongRef();
virtual void ReviveStrongRef();
// Critical section support
CRITICAL_SECTION m_critsec;
};
/*---------------------------------------------------------------------------
Class: RtrMgrProtocolInfo
---------------------------------------------------------------------------*/
class RtrMgrProtocolInfo :
public IRtrMgrProtocolInfo,
public CWeakRef
{
public:
DeclareIUnknownMembers(IMPL)
DeclareIRtrMgrProtocolInfoMembers(IMPL)
RtrMgrProtocolInfo(DWORD dwProtocolId,
LPCTSTR lpszId,
DWORD dwTransportId,
LPCTSTR lpszRm,
RtrMgrInfo * pRmInfo);
virtual ~RtrMgrProtocolInfo();
HRESULT SetCB(const RtrMgrProtocolCB *pcb);
protected:
// This will contain a weak/strong ref on the parent
IRtrMgrInfo * m_pRtrMgrInfoParent;
SRtrMgrProtocolCB m_cb; // protocol control block
AdviseDataList m_AdviseList; // list of advises
DWORD m_dwFlags;
// Disconnect
void Disconnect();
// Overrides of CWeakRef functions
virtual void OnLastStrongRef();
virtual void ReviveStrongRef();
// Critical section support
CRITICAL_SECTION m_critsec;
};
/*---------------------------------------------------------------------------
Class: InterfaceInfo
---------------------------------------------------------------------------*/
class InterfaceInfo :
public IInterfaceInfo,
public CWeakRef
{
public:
DeclareIUnknownMembers(IMPL)
DeclareIInterfaceInfoMembers(IMPL)
InterfaceInfo(LPCTSTR lpszId,
DWORD dwIfType,
BOOL bEnable,
DWORD dwBindFlags,
RouterInfo* pRouterInfo);
~InterfaceInfo();
static HRESULT FindInterfaceTitle(LPCTSTR pszMachine,
LPCTSTR pszInterface,
LPTSTR *ppszTitle);
protected:
// CInterfaceInfo m_CInterfaceInfo;
SInterfaceCB m_cb; // interface control block
PRtrMgrInterfaceInfoList m_RmIfList; // list of IRtrMgrInterfaceInfo
// CObList m_rmIfList; // list of CRmInterfaceInfo
CString m_stMachine; // machine whose config is loaded
HANDLE m_hMachineConfig; // handle to machine's config
HANDLE m_hInterface; // handle to interface-config
BOOL m_bDisconnect;
AdviseDataList m_AdviseList; // list of advises
DWORD m_dwFlags;
IRouterInfo * m_pRouterInfoParent;
HRESULT LoadRtrMgrInterfaceList();
HRESULT TryToConnect(LPCWSTR pszMachine, HANDLE *phMachine);
HRESULT TryToGetIfHandle(HANDLE hMachine, LPCWSTR pswzInterface, HANDLE *phInterface);
// Disconnect
void Disconnect();
// Overrides of CWeakRef functions
virtual void OnLastStrongRef();
virtual void ReviveStrongRef();
// Critical section support
CRITICAL_SECTION m_critsec;
};
/*---------------------------------------------------------------------------
Class: RtrMgrInterfaceInfo
---------------------------------------------------------------------------*/
class RtrMgrInterfaceInfo :
public IRtrMgrInterfaceInfo,
public CWeakRef
{
public:
DeclareIUnknownMembers(IMPL)
DeclareIRtrMgrInterfaceInfoMembers(IMPL)
RtrMgrInterfaceInfo(DWORD dwTransportId,
LPCTSTR lpszId,
LPCTSTR lpszIfId,
DWORD dwIfType,
InterfaceInfo * pIfInfo);
virtual ~RtrMgrInterfaceInfo();
protected:
// CRmInterfaceInfo m_CRmInterfaceInfo;
SRtrMgrInterfaceCB m_cb; // router-manager control block
PRtrMgrProtocolInterfaceInfoList m_RmProtIfList;
// CObList m_protList; // list of CRmProtInterfaceInfo
CString m_stMachine; // name of machine
HANDLE m_hMachineConfig; // handle to machine's config
HANDLE m_hInterface; // handle to interface-config
HANDLE m_hIfTransport; // handle to transport-config
BOOL m_bDisconnect;
DWORD m_dwFlags; // state of this interface
AdviseDataList m_AdviseList; // list of advises
IInterfaceInfo * m_pInterfaceInfoParent;
HRESULT LoadRtrMgrInterfaceInfo(HANDLE hMachine,
HANDLE hInterface,
HANDLE hIfTransport);
HRESULT SaveRtrMgrInterfaceInfo(HANDLE hMachine,
HANDLE hInterface,
HANDLE hIfTransport,
IInfoBase *pInterfaceInfoBase,
DWORD dwDeleteProtocolId);
HRESULT TryToGetAllHandles(LPCWSTR pszMachine,
HANDLE *phMachine,
HANDLE *phInterface,
HANDLE *phTransport);
HRESULT TryToConnect(LPCWSTR pswzMachine, HANDLE *phMachine);
HRESULT TryToGetIfHandle(HANDLE hMachine, LPCWSTR pswzInterface, HANDLE *phInterface);
// Disconnect
void Disconnect();
// Notification helper functions
HRESULT NotifyOfRmProtIfAdd(IRtrMgrProtocolInterfaceInfo *pRmProtIf,
IInterfaceInfo *pParentIf);
// Overrides of CWeakRef functions
virtual void OnLastStrongRef();
virtual void ReviveStrongRef();
// Critical section support
CRITICAL_SECTION m_critsec;
};
/*---------------------------------------------------------------------------
Class: RtrMgrProtocolInterfaceInfo
---------------------------------------------------------------------------*/
class RtrMgrProtocolInterfaceInfo :
public IRtrMgrProtocolInterfaceInfo,
public CWeakRef
{
public:
DeclareIUnknownMembers(IMPL)
DeclareIRtrMgrProtocolInterfaceInfoMembers(IMPL)
RtrMgrProtocolInterfaceInfo(DWORD dwProtocolId,
LPCTSTR pszId,
DWORD dwTransportId,
LPCTSTR pszRmId,
LPCTSTR pszIfId,
DWORD dwIfType,
RtrMgrInterfaceInfo *pRmIf);
virtual ~RtrMgrProtocolInterfaceInfo();
SRtrMgrProtocolInterfaceCB m_cb; // protocol control block
protected:
AdviseDataList m_AdviseList; // list of advises
DWORD m_dwFlags;
IRtrMgrInterfaceInfo * m_pRtrMgrInterfaceInfoParent;
// Disconnect
void Disconnect();
// Overrides of CWeakRef functions
virtual void OnLastStrongRef();
virtual void ReviveStrongRef();
// Critical section support
CRITICAL_SECTION m_critsec;
};
#endif