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.
191 lines
6.3 KiB
191 lines
6.3 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997-2002.
|
|
//
|
|
// File: SendCMsg.cpp
|
|
//
|
|
// Contents:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
// SendCMsg.cpp : Implementation of DLL Exports.
|
|
|
|
|
|
// Note: Proxy/Stub Information
|
|
// To build a separate proxy/stub DLL,
|
|
// run nmake -f SendCMsgps.mk in the project directory.
|
|
|
|
|
|
#include "stdafx.h"
|
|
#define STRSAFE_NO_DEPRECATE
|
|
#include <strsafe.h>
|
|
#include "initguid.h"
|
|
#include "SendCMsg.h"
|
|
#include "SendCMsg_i.c"
|
|
#include "debug.h"
|
|
#include "util.h"
|
|
#include "resource.h"
|
|
#include "App.h"
|
|
|
|
#include <atlimpl.cpp>
|
|
|
|
HINSTANCE g_hInstance;
|
|
CComModule _Module;
|
|
|
|
BEGIN_OBJECT_MAP(ObjectMap)
|
|
OBJECT_ENTRY(CLSID_SendConsoleMessageApp, CSendConsoleMessageApp)
|
|
END_OBJECT_MAP()
|
|
|
|
// GUID for the CSendConsoleMessageApp class
|
|
#define d_szGuidSendConsoleMessageApp _T("{B1AFF7D0-0C49-11D1-BB12-00C04FC9A3A3}")
|
|
|
|
#if 0
|
|
// To have sendcmsg.dll to extend your context menu, add the following
|
|
// key into the registry
|
|
//
|
|
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MMC\NodeTypes\
|
|
{476e6448-aaff-11d0-b944-00c04fd8d5b0}\Extensions\ContextMenu]
|
|
"{B1AFF7D0-0C49-11D1-BB12-00C04FC9A3A3}"="Send Console Message"
|
|
|
|
// where {476e6448-aaff-11d0-b944-00c04fd8d5b0} is
|
|
// the GUID for the nodetype which you want to be extended.
|
|
#endif
|
|
|
|
// The following is an array of GUIDs of snapins that wants to be
|
|
// automatically extended by the Send Console Message Snapin.
|
|
// When the snapin registers itself, it will extend those nodetypes.
|
|
const PCWSTR rgzpszGuidNodetypeContextMenuExtensions[] =
|
|
{
|
|
_T("{476e6446-aaff-11d0-b944-00c04fd8d5b0}"), // Computer Management
|
|
_T("{4e410f0e-abc1-11d0-b944-00c04fd8d5b0}"), // Root of File Service Management subtree
|
|
_T("{4e410f0f-abc1-11d0-b944-00c04fd8d5b0}"), // FSM - Shares
|
|
_T("{4e410f12-abc1-11d0-b944-00c04fd8d5b0}"), // System Service Management
|
|
};
|
|
|
|
// The following is an array of GUIDs of snapins that no longer want
|
|
// to be automatically extended by the Send Console Message Snapin.
|
|
const PCWSTR rgzpszRemoveContextMenuExtensions[] =
|
|
{
|
|
_T("{476e6448-aaff-11d0-b944-00c04fd8d5b0}"), // Computer Management -> SystemTools
|
|
_T("{0eeeeeee-d390-11cf-b607-00c04fd8d565}"), // invalid
|
|
_T("{1eeeeeee-d390-11cf-b607-00c04fd8d565}"), // invalid
|
|
_T("{7eeeeeee-d390-11cf-b607-00c04fd8d565}"), // invalid
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DLL Entry Point
|
|
|
|
extern "C"
|
|
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
|
|
{
|
|
g_hInstance = hInstance;
|
|
if (dwReason == DLL_PROCESS_ATTACH)
|
|
{
|
|
_Module.Init(ObjectMap, hInstance);
|
|
DisableThreadLibraryCalls(hInstance);
|
|
}
|
|
else if (dwReason == DLL_PROCESS_DETACH)
|
|
_Module.Term();
|
|
return TRUE; // ok
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Used to determine whether the DLL can be unloaded by OLE
|
|
|
|
STDAPI DllCanUnloadNow(void)
|
|
{
|
|
return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Returns a class factory to create an object of the requested type
|
|
|
|
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
|
|
{
|
|
return _Module.GetClassObject(rclsid, riid, ppv);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllRegisterServer - Adds entries to the system registry
|
|
|
|
STDAPI DllRegisterServer(void)
|
|
{
|
|
// registers object, typelib and all interfaces in typelib
|
|
HRESULT hr = _Module.RegisterServer(TRUE);
|
|
|
|
HKEY hkey = RegOpenOrCreateKey(
|
|
HKEY_LOCAL_MACHINE,
|
|
_T("Software\\Microsoft\\MMC\\SnapIns\\") d_szGuidSendConsoleMessageApp);
|
|
if (hkey == NULL)
|
|
{
|
|
Assert(FALSE && "DllRegisterServer() - Unable to create key from registry.");
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
RegWriteString(hkey, _T("NameString"), IDS_CAPTION);
|
|
RegCloseKey(hkey);
|
|
|
|
const PWSTR pwszREG_FORMAT_KEY = L"Software\\Microsoft\\MMC\\NodeTypes\\%s\\Extensions\\ContextMenu";
|
|
|
|
for (int i = 0; i < LENGTH(rgzpszGuidNodetypeContextMenuExtensions); i++)
|
|
{
|
|
WCHAR szRegistryKey[256];
|
|
Assert(rgzpszGuidNodetypeContextMenuExtensions[i] != NULL);
|
|
// security review 3/1/2002 BryanWal
|
|
// ISSUE - potential buffer overflow - use wsnprintf or strsafe
|
|
hr = ::StringCchPrintf (OUT szRegistryKey, sizeof (szRegistryKey)/sizeof (szRegistryKey[0]),
|
|
pwszREG_FORMAT_KEY,
|
|
rgzpszGuidNodetypeContextMenuExtensions[i]);
|
|
Assert (SUCCEEDED (hr));
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
Assert(wcslen(szRegistryKey) < LENGTH(szRegistryKey));
|
|
hkey = ::RegOpenOrCreateKey(HKEY_LOCAL_MACHINE, szRegistryKey);
|
|
if (hkey == NULL)
|
|
{
|
|
Assert(FALSE && "DllRegisterServer() - Unable to create key from registry.");
|
|
continue;
|
|
}
|
|
::RegWriteString(hkey, d_szGuidSendConsoleMessageApp, IDS_CAPTION);
|
|
::RegCloseKey(hkey);
|
|
}
|
|
} // for
|
|
|
|
for (i = 0; i < LENGTH(rgzpszRemoveContextMenuExtensions); i++)
|
|
{
|
|
WCHAR szRegistryKey[256];
|
|
Assert(rgzpszRemoveContextMenuExtensions[i] != NULL);
|
|
// security review 3/1/2002 BryanWal
|
|
// ISSUE - potential buffer overflow - use wsnprintf or strsafe
|
|
hr = ::StringCchPrintf (OUT szRegistryKey, sizeof (szRegistryKey)/sizeof (szRegistryKey[0]),
|
|
pwszREG_FORMAT_KEY,
|
|
rgzpszRemoveContextMenuExtensions[i]);
|
|
Assert (SUCCEEDED (hr));
|
|
if ( SUCCEEDED (hr) )
|
|
{
|
|
Assert(wcslen(szRegistryKey) < LENGTH(szRegistryKey));
|
|
(void) RegOpenKey(HKEY_LOCAL_MACHINE, szRegistryKey, &hkey);
|
|
if (hkey == NULL)
|
|
{
|
|
// not a problem
|
|
continue;
|
|
}
|
|
(void) RegDeleteValue(hkey, d_szGuidSendConsoleMessageApp);
|
|
// ignore error code, the only likely code is ERROR_FILE_NOT_FOUND
|
|
RegCloseKey(hkey);
|
|
hkey = NULL;
|
|
}
|
|
} // for
|
|
return hr;
|
|
} // DllRegisterServer()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllUnregisterServer - Removes entries from the system registry
|
|
|
|
STDAPI DllUnregisterServer(void)
|
|
{
|
|
_Module.UnregisterServer();
|
|
return S_OK;
|
|
}
|
|
|
|
|