//+--------------------------------------------------------------------------- // // 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 #include "initguid.h" #include "SendCMsg.h" #include "SendCMsg_i.c" #include "debug.h" #include "util.h" #include "resource.h" #include "App.h" #include 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; }