497 lines
12 KiB
C++
497 lines
12 KiB
C++
#ifndef HOTFIX_MANAGER
|
|
#define HOTFIX_MANAGER
|
|
|
|
#include "resource.h"
|
|
#include <atlsnap.h>
|
|
|
|
static _TCHAR gszComputerName[255];
|
|
static BOOL ComputerNameSent = FALSE;
|
|
static IDispatch* gszManagerCtlDispatch = NULL;
|
|
inline LPOLESTR CoTaskDupString( LPOLESTR pszInput )
|
|
{
|
|
USES_CONVERSION;
|
|
LPOLESTR pszOut = NULL;
|
|
|
|
//
|
|
// We throw an exception if the following allocation fails.
|
|
//
|
|
pszOut = (LPOLESTR) CoTaskMemAlloc( ( wcslen( pszInput ) + 1 ) * sizeof( OLECHAR ) );
|
|
if ( pszOut == NULL )
|
|
throw;
|
|
|
|
wcscpy( pszOut, pszInput );
|
|
|
|
return( pszOut );
|
|
};
|
|
|
|
template <class T>
|
|
class ATL_NO_VTABLE ISnapinHelpImpl : public ISnapinHelp
|
|
{
|
|
public:
|
|
|
|
// get the dkms help file location and returns it
|
|
STDMETHOD( GetHelpTopic )( LPOLESTR* lpCompiledHelpFile )
|
|
{
|
|
_ASSERT( lpCompiledHelpFile != NULL );
|
|
USES_CONVERSION;
|
|
HRESULT hr = E_FAIL;
|
|
TCHAR szPath[ _MAX_PATH * 2 ];
|
|
|
|
// this is where the dkms help file is stored
|
|
|
|
wcscpy(szPath,L"C:\\mmc-samples\\Hotfix_Snapin\\snapsamp.chm");
|
|
// MessageBox(NULL,szPath,_T("Help File Path"),MB_OK);
|
|
// expand out the %systemroot% variable
|
|
// ExpandEnvVars(szPath);
|
|
|
|
// MessageBox(NULL,szPath,_T("Help File Path"),MB_OK);
|
|
// Allocate the string and return it.
|
|
*lpCompiledHelpFile = CoTaskDupString( T2W( szPath ) );
|
|
hr = S_OK;
|
|
|
|
return( hr );
|
|
}
|
|
};
|
|
|
|
class CHotfix_ManagerComponent;
|
|
class CHotfix_ManagerData : public CSnapInItemImpl<CHotfix_ManagerData>
|
|
{
|
|
public:
|
|
static const GUID* m_NODETYPE;
|
|
static const OLECHAR* m_SZNODETYPE;
|
|
static const OLECHAR* m_SZDISPLAY_NAME;
|
|
static const CLSID* m_SNAPIN_CLASSID;
|
|
|
|
_TCHAR m_szComputerName[255];
|
|
_TCHAR m_szCreation[255];
|
|
bool m_bChild;
|
|
bool b_Expanded;
|
|
DWORD m_dwCurrentView;
|
|
_TCHAR m_ProductName[255];
|
|
CHotfix_ManagerComponent* m_pComponent;
|
|
static BSTR m_bstrColumnType;
|
|
static BSTR m_bstrColumnDesc;
|
|
CComPtr<IControlbar> m_spControlBar;
|
|
|
|
BEGIN_SNAPINCOMMAND_MAP(CHotfix_ManagerData, FALSE)
|
|
END_SNAPINCOMMAND_MAP()
|
|
|
|
// SNAPINMENUID(IDR_HOTFIXMANAGER_MENU)
|
|
|
|
BEGIN_SNAPINTOOLBARID_MAP(CHotfix_ManagerData)
|
|
// Create toolbar resources with button dimensions 16x16
|
|
// and add an entry to the MAP. You can add multiple toolbars
|
|
// SNAPINTOOLBARID_ENTRY(Toolbar ID)
|
|
END_SNAPINTOOLBARID_MAP()
|
|
|
|
CHotfix_ManagerData(_TCHAR * ProductName,_TCHAR * new_ComputerName, bool Child)
|
|
{
|
|
_TCHAR Messg[255];
|
|
m_dwCurrentView = IDC_VIEW_BY_HOTFIX;
|
|
m_bChild = Child;
|
|
_tcscpy (m_szComputerName, new_ComputerName);
|
|
b_Expanded = false;
|
|
|
|
|
|
// Image indexes may need to be modified depending on the images specific to
|
|
// the snapin.
|
|
// Image indexes may need to be modified depending on the images specific to
|
|
// the snapin.
|
|
memset(&m_scopeDataItem, 0, sizeof(SCOPEDATAITEM));
|
|
m_scopeDataItem.mask = SDI_STR | SDI_IMAGE | SDI_OPENIMAGE | SDI_PARAM;
|
|
m_scopeDataItem.displayname = MMC_CALLBACK;
|
|
m_scopeDataItem.nImage = 4; // May need modification
|
|
m_scopeDataItem.nOpenImage = 5; // May need modification
|
|
m_scopeDataItem.lParam = (LPARAM) this;
|
|
memset(&m_resultDataItem, 4, sizeof(RESULTDATAITEM));
|
|
m_resultDataItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
|
|
m_resultDataItem.str = MMC_CALLBACK;
|
|
m_resultDataItem.nImage = 4; // May need modification
|
|
m_resultDataItem.lParam = (LPARAM) this;
|
|
|
|
if (ProductName == NULL)
|
|
{
|
|
LoadString(_Module.GetResourceInstance(),IDS_DISPLAY_NAME,Messg,255);
|
|
_tcscpy(m_ProductName,_T("\0"));
|
|
}
|
|
else
|
|
{
|
|
_tcscpy(Messg,ProductName);
|
|
_tcscpy(m_ProductName,ProductName);
|
|
|
|
}
|
|
|
|
m_bstrDisplayName = SysAllocString(Messg);
|
|
|
|
LoadString(_Module.GetResourceInstance(),IDS_COLUMN_TYPE,Messg,255);
|
|
m_bstrColumnType = SysAllocString(Messg);
|
|
|
|
LoadString(_Module.GetResourceInstance(),IDS_COLUMN_DESC,Messg,255);
|
|
m_bstrColumnDesc = SysAllocString( Messg );
|
|
|
|
}
|
|
|
|
~CHotfix_ManagerData()
|
|
{
|
|
}
|
|
|
|
STDMETHOD(GetScopePaneInfo)(SCOPEDATAITEM *pScopeDataItem);
|
|
|
|
STDMETHOD( GetResultViewType )( LPOLESTR* ppViewType, long* pViewOptions );
|
|
|
|
|
|
STDMETHOD(GetResultPaneInfo)(RESULTDATAITEM *pResultDataItem);
|
|
|
|
STDMETHOD(Notify)( MMC_NOTIFY_TYPE event,
|
|
long arg,
|
|
long param,
|
|
IComponentData* pComponentData,
|
|
IComponent* pComponent,
|
|
DATA_OBJECT_TYPES type);
|
|
|
|
LPOLESTR GetResultPaneColInfo(int nCol);
|
|
BOOL SendProductName(_TCHAR *szPoductName, IDispatch * pDisp);
|
|
BOOL SendComputerName(_TCHAR *szDataMachineName,IDispatch * pDisp);
|
|
|
|
|
|
|
|
BOOL SendCommand( LPARAM lparamCommand );
|
|
|
|
|
|
STDMETHOD( Command )(long lCommandID,
|
|
CSnapInObjectRootBase* pObj,
|
|
DATA_OBJECT_TYPES type);
|
|
|
|
STDMETHOD(AddMenuItems)(
|
|
LPCONTEXTMENUCALLBACK pContextMenuCallback,
|
|
long *pInsertionAllowed,
|
|
DATA_OBJECT_TYPES type);
|
|
|
|
|
|
};
|
|
|
|
DWORD GetCtrlStatus();
|
|
|
|
class CHotfix_ManagerExtData : public CSnapInItemImpl<CHotfix_ManagerExtData, TRUE>
|
|
{
|
|
public:
|
|
static const GUID* m_NODETYPE;
|
|
static const OLECHAR* m_SZNODETYPE;
|
|
static const OLECHAR* m_SZDISPLAY_NAME;
|
|
static const CLSID* m_SNAPIN_CLASSID;
|
|
|
|
BEGIN_SNAPINCOMMAND_MAP(CHotfix_ManagerExtData, FALSE)
|
|
END_SNAPINCOMMAND_MAP()
|
|
|
|
// SNAPINMENUID(IDR_HOTFIXMANAGER_MENU)
|
|
|
|
BEGIN_SNAPINTOOLBARID_MAP(CHotfix_ManagerExtData)
|
|
// Create toolbar resources with button dimensions 16x16
|
|
// and add an entry to the MAP. You can add multiple toolbars
|
|
// SNAPINTOOLBARID_ENTRY(Toolbar ID)
|
|
END_SNAPINTOOLBARID_MAP()
|
|
|
|
CHotfix_ManagerExtData()
|
|
{
|
|
m_pNode = NULL;
|
|
memset(&m_scopeDataItem, 0, sizeof(SCOPEDATAITEM));
|
|
memset(&m_resultDataItem, 0, sizeof(RESULTDATAITEM));
|
|
}
|
|
|
|
~CHotfix_ManagerExtData()
|
|
{
|
|
if ( m_pNode != NULL )
|
|
delete m_pNode;
|
|
}
|
|
|
|
IDataObject* m_pDataObject;
|
|
virtual void InitDataClass(IDataObject* pDataObject, CSnapInItem* pDefault)
|
|
{
|
|
m_pDataObject = pDataObject;
|
|
// The default code stores off the pointer to the Dataobject the class is wrapping
|
|
// at the time.
|
|
// Alternatively you could convert the dataobject to the internal format
|
|
// it represents and store that information
|
|
}
|
|
|
|
CSnapInItem* GetExtNodeObject(IDataObject* pDataObject, CSnapInItem* pDefault)
|
|
{
|
|
// Modify to return a different CSnapInItem* pointer.
|
|
return pDefault;
|
|
}
|
|
STDMETHOD(Notify)( MMC_NOTIFY_TYPE event,
|
|
long arg,
|
|
long param,
|
|
IComponentData* pComponentData,
|
|
IComponent* pComponent,
|
|
DATA_OBJECT_TYPES type);
|
|
|
|
STDMETHOD(GetDisplayInfo)(SCOPEDATAITEM *pScopeDataItem)
|
|
{
|
|
return( S_OK );
|
|
}
|
|
|
|
protected:
|
|
CSnapInItem* m_pNode;
|
|
|
|
};
|
|
|
|
class CHotfix_Manager;
|
|
|
|
class CHotfix_ManagerComponent : public CComObjectRootEx<CComSingleThreadModel>,
|
|
public CSnapInObjectRoot<2, CHotfix_Manager >,
|
|
public IExtendContextMenuImpl<CHotfix_Manager>,
|
|
// public IExtendControlbarImpl<CHotfix_ManagerComponent>,
|
|
public IPersistStreamInit,
|
|
public IComponentImpl<CHotfix_ManagerComponent>
|
|
{
|
|
public:
|
|
BEGIN_COM_MAP(CHotfix_ManagerComponent)
|
|
COM_INTERFACE_ENTRY(IComponent)
|
|
COM_INTERFACE_ENTRY(IExtendContextMenu)
|
|
// COM_INTERFACE_ENTRY(IExtendControlbar)
|
|
COM_INTERFACE_ENTRY(IPersistStreamInit)
|
|
END_COM_MAP()
|
|
// SNAPINMENUID(IDR_HOTFIXMANAGER_MENU)
|
|
public:
|
|
CHotfix_ManagerComponent()
|
|
{
|
|
}
|
|
|
|
STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param)
|
|
{
|
|
//
|
|
// Check for a special data object being sent.
|
|
// Might be able to extract the computer name here....
|
|
if ( IS_SPECIAL_DATAOBJECT( lpDataObject ) )
|
|
return( S_OK );
|
|
if (lpDataObject != NULL)
|
|
return IComponentImpl<CHotfix_ManagerComponent>::Notify(lpDataObject, event, arg, param);
|
|
// TODO : Add code to handle notifications that set lpDataObject == NULL.
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
STDMETHOD(GetClassID)(CLSID *pClassID)
|
|
{
|
|
ATLTRACENOTIMPL(_T("CHotfix_ManagerComponent::GetClassID"));
|
|
}
|
|
|
|
STDMETHOD(IsDirty)()
|
|
{
|
|
ATLTRACENOTIMPL(_T("CHotfix_ManagerComponent::IsDirty"));
|
|
}
|
|
|
|
STDMETHOD(Load)(IStream *pStm)
|
|
{
|
|
ATLTRACENOTIMPL(_T("CHotfix_ManagerComponent::Load"));
|
|
}
|
|
|
|
STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty)
|
|
{
|
|
ATLTRACENOTIMPL(_T("CHotfix_ManagerComponent::Save"));
|
|
}
|
|
|
|
STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize)
|
|
{
|
|
ATLTRACENOTIMPL(_T("CHotfix_ManagerComponent::GetSizeMax"));
|
|
}
|
|
|
|
STDMETHOD(Command)(long lCommandID,
|
|
LPDATAOBJECT pDataObject);
|
|
STDMETHOD(InitNew)()
|
|
{
|
|
ATLTRACE(_T("CHotfix_ManagerComponent::InitNew\n"));
|
|
return S_OK;
|
|
}
|
|
STDMETHOD (AddMenuItems) (LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK piCallback,long *pInsertionAllowed);
|
|
|
|
};
|
|
|
|
class CHotfix_Manager : public CComObjectRootEx<CComSingleThreadModel>,
|
|
public CSnapInObjectRoot<1, CHotfix_Manager>,
|
|
public IComponentDataImpl<CHotfix_Manager, CHotfix_ManagerComponent>,
|
|
public IExtendControlbarImpl<CHotfix_Manager>,
|
|
public IExtendContextMenuImpl<CHotfix_Manager>,
|
|
public IPersistStreamInit,
|
|
public ISnapinHelpImpl<CHotfix_Manager>,
|
|
public CComCoClass<CHotfix_Manager, &CLSID_Hotfix_Manager>
|
|
{
|
|
public:
|
|
CHotfix_Manager();
|
|
|
|
bool IsRemoted()
|
|
{
|
|
return( m_fRemoted );
|
|
}
|
|
|
|
|
|
~CHotfix_Manager()
|
|
{
|
|
delete m_pNode;
|
|
m_pNode = NULL;
|
|
}
|
|
|
|
EXTENSION_SNAPIN_DATACLASS(CHotfix_ManagerExtData)
|
|
|
|
BEGIN_EXTENSION_SNAPIN_NODEINFO_MAP(CHotfix_Manager)
|
|
EXTENSION_SNAPIN_NODEINFO_ENTRY(CHotfix_ManagerExtData)
|
|
END_EXTENSION_SNAPIN_NODEINFO_MAP()
|
|
|
|
BEGIN_COM_MAP(CHotfix_Manager)
|
|
COM_INTERFACE_ENTRY(IComponentData)
|
|
COM_INTERFACE_ENTRY(IExtendControlbar)
|
|
COM_INTERFACE_ENTRY(IExtendContextMenu)
|
|
COM_INTERFACE_ENTRY(IPersistStreamInit)
|
|
COM_INTERFACE_ENTRY(ISnapinHelp)
|
|
END_COM_MAP()
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_HOTFIXMANAGER)
|
|
|
|
DECLARE_NOT_AGGREGATABLE(CHotfix_Manager)
|
|
|
|
STDMETHOD(GetClassID)(CLSID *pClassID)
|
|
{
|
|
ATLTRACENOTIMPL(_T("CHotfix_Manager::GetClassID"));
|
|
}
|
|
|
|
STDMETHOD(IsDirty)()
|
|
{
|
|
ATLTRACENOTIMPL(_T("CHotfix_Manager::IsDirty"));
|
|
}
|
|
|
|
STDMETHOD(Load)(IStream *pStm)
|
|
{
|
|
ATLTRACENOTIMPL(_T("CHotfix_Manager::Load"));
|
|
}
|
|
|
|
STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty)
|
|
{
|
|
ATLTRACENOTIMPL(_T("CHotfix_Manager::Save"));
|
|
}
|
|
|
|
STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize)
|
|
{
|
|
ATLTRACENOTIMPL(_T("CHotfix_Manager::GetSizeMax"));
|
|
}
|
|
|
|
|
|
STDMETHOD(InitNew)()
|
|
{
|
|
ATLTRACE(_T("CHotfix_Manager::InitNew\n"));
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(Initialize)(LPUNKNOWN pUnknown);
|
|
|
|
static void WINAPI ObjectMain(bool bStarting)
|
|
{
|
|
if (bStarting)
|
|
CSnapInItem::Init();
|
|
}
|
|
|
|
|
|
STDMETHOD(Notify)( LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param);
|
|
|
|
protected:
|
|
_TCHAR m_szComputerName[255];
|
|
bool ExtractString( IDataObject* pDataObject, unsigned int cfClipFormat, LPTSTR pBuf, DWORD dwMaxLength );
|
|
//
|
|
// Register the clipboard format and get the value to query on.
|
|
//
|
|
void RegisterRemotedClass()
|
|
{
|
|
m_ccfRemotedFormat = RegisterClipboardFormat( _T( "MMC_SNAPIN_MACHINE_NAME" ) );
|
|
_ASSERTE( m_ccfRemotedFormat > 0 );
|
|
}
|
|
//
|
|
// Determine if we're monitoring a local or remote machine based on the given data object.
|
|
//
|
|
bool IsDataObjectRemoted( IDataObject* pDataObject );
|
|
//
|
|
// Used to track whether we're remoted or not.
|
|
//
|
|
bool m_fRemoted;
|
|
//
|
|
// Initialized by RegisterRemoteClass(). Contains the clipboard ID
|
|
// of MMC_SNAPIN_MACHINE_NAME after registered with the clipboard.
|
|
//
|
|
UINT m_ccfRemotedFormat;
|
|
};
|
|
|
|
class ATL_NO_VTABLE CHotfix_ManagerAbout : public ISnapinAbout,
|
|
public CComObjectRoot,
|
|
public CComCoClass< CHotfix_ManagerAbout, &CLSID_Hotfix_ManagerAbout>
|
|
{
|
|
public:
|
|
DECLARE_REGISTRY(CHotfixManagerAbout, _T("Hotfix_ManagerAbout.1"), _T("Hotfix_ManagerAbout.1"), IDS_HOTFIXMANAGER_DESC, THREADFLAGS_BOTH);
|
|
|
|
BEGIN_COM_MAP(CHotfix_ManagerAbout)
|
|
COM_INTERFACE_ENTRY(ISnapinAbout)
|
|
END_COM_MAP()
|
|
|
|
STDMETHOD(GetSnapinDescription)(LPOLESTR *lpDescription)
|
|
{
|
|
USES_CONVERSION;
|
|
TCHAR szBuf[256];
|
|
if (::LoadString(_Module.GetResourceInstance(), IDS_HOTFIXMANAGER_DESC, szBuf, 256) == 0)
|
|
return E_FAIL;
|
|
|
|
*lpDescription = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR));
|
|
if (*lpDescription == NULL)
|
|
return E_OUTOFMEMORY;
|
|
|
|
ocscpy(*lpDescription, T2OLE(szBuf));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(GetProvider)(LPOLESTR *lpName)
|
|
{
|
|
USES_CONVERSION;
|
|
TCHAR szBuf[256];
|
|
if (::LoadString(_Module.GetResourceInstance(), IDS_HOTFIXMANAGER_PROVIDER, szBuf, 256) == 0)
|
|
return E_FAIL;
|
|
|
|
*lpName = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR));
|
|
if (*lpName == NULL)
|
|
return E_OUTOFMEMORY;
|
|
|
|
ocscpy(*lpName, T2OLE(szBuf));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(GetSnapinVersion)(LPOLESTR *lpVersion)
|
|
{
|
|
USES_CONVERSION;
|
|
TCHAR szBuf[256];
|
|
if (::LoadString(_Module.GetResourceInstance(), IDS_HOTFIXMANAGER_VERSION, szBuf, 256) == 0)
|
|
return E_FAIL;
|
|
|
|
*lpVersion = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR));
|
|
if (*lpVersion == NULL)
|
|
return E_OUTOFMEMORY;
|
|
|
|
ocscpy(*lpVersion, T2OLE(szBuf));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(GetSnapinImage)(HICON *hAppIcon)
|
|
{
|
|
*hAppIcon = NULL;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(GetStaticFolderImage)(HBITMAP *hSmallImage,
|
|
HBITMAP *hSmallImageOpen,
|
|
HBITMAP *hLargeImage,
|
|
COLORREF *cMask)
|
|
{
|
|
*hSmallImageOpen = *hLargeImage = *hLargeImage = 0;
|
|
return S_OK;
|
|
}
|
|
};
|
|
|
|
#endif
|