//---------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 2001. // // File: snapin.cpp // // Contents: WiF Policy Snapin // // // History: TaroonM // 10/30/01 // //---------------------------------------------------------------------------- #include "stdafx.h" #include "initguid.h" #include "about.h" CComModule _Module; BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_Snapin, CComponentDataPrimaryImpl) OBJECT_ENTRY(CLSID_Extension, CComponentDataExtensionImpl) OBJECT_ENTRY(CLSID_About, CSnapinAboutImpl) END_OBJECT_MAP() #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif class CSnapinApp : public CWinApp { public: virtual BOOL InitInstance(); virtual int ExitInstance(); }; CSnapinApp theApp; BOOL CSnapinApp::InitInstance() { _Module.Init(ObjectMap, m_hInstance); // set the application name: //First free the string allocated by MFC at CWinApp startup. //The string is allocated before InitInstance is called. free((void*)m_pszAppName); //Change the name of the application file. //The CWinApp destructor will free the memory. CString strName; strName.LoadString (IDS_NAME); m_pszAppName=_tcsdup(strName); SHFusionInitializeFromModuleID (m_hInstance, 2); return CWinApp::InitInstance(); } int CSnapinApp::ExitInstance() { SHFusionUninitialize(); _Module.Term(); DEBUG_VERIFY_INSTANCE_COUNT(CComponentImpl); DEBUG_VERIFY_INSTANCE_COUNT(CComponentDataImpl); return CWinApp::ExitInstance(); } ///////////////////////////////////////////////////////////////////////////// // Used to determine whether the DLL can be unloaded by OLE STDAPI DllCanUnloadNow(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return (AfxDllCanUnloadNow()==S_OK && _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) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // registers object, typelib and all interfaces in typelib HRESULT hr = _Module.RegisterServer(FALSE); if (hr == S_OK) { // the dll was registered ok, so proceed to do the MMC registry fixups // open the registry at \\My Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MMC\SnapIns HKEY hkMMC = NULL; LONG lErr = RegOpenKeyEx (HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\MMC\\SnapIns"), 0, KEY_ALL_ACCESS, &hkMMC); if (lErr == ERROR_SUCCESS) { // create our subkey(s) HKEY hkSub = NULL; lErr = RegCreateKey (hkMMC, cszSnapin, &hkSub); if (lErr == ERROR_SUCCESS) { // A couple of simple values into our subkey // NameString = IP Security Management // NodeType = {36703241-D16C-11d0-9CE4-0080C7221EBD} // Version = 1.0 // TODO: resource hardcoded strings CString strName; strName.LoadString (IDS_NAME); lErr = RegSetValueEx (hkSub, _T("NameString"), 0, REG_SZ, (CONST BYTE *)(LPCTSTR)strName, strName.GetLength() * sizeof (TCHAR)); ASSERT (lErr == ERROR_SUCCESS); TCHAR szModuleFileName[MAX_PATH * 2 + 1]; ZeroMemory(szModuleFileName, sizeof(szModuleFileName)); DWORD dwRet = ::GetModuleFileName(_Module.GetModuleInstance(), szModuleFileName, DimensionOf(szModuleFileName)-1); szModuleFileName[MAX_PATH*2] = L'\0'; if (0 != dwRet) { CString strNameIndirect; strNameIndirect.Format(_T("@%s,-%u"), szModuleFileName, IDS_NAME); lErr = RegSetValueEx(hkSub, _T("NameStringIndirect"), 0, REG_SZ, (CONST BYTE *)(LPCTSTR)strNameIndirect, strNameIndirect.GetLength() * sizeof (TCHAR)); ASSERT (lErr == ERROR_SUCCESS); } //lErr = RegSetValueEx (hkSub, _T("NodeType"), 0, REG_SZ, (CONST BYTE *)&(_T("{36703241-D16C-11d0-9CE4-0080C7221EBD}")), wcslen (_T("{36703241-D16C-11d0-9CE4-0080C7221EBD}")) * sizeof (TCHAR)); //ASSERT (lErr == ERROR_SUCCESS); lErr = RegSetValueEx (hkSub, _T("NodeType"), 0, REG_SZ, (CONST BYTE *)&(_T("{36D6CA65-3367-49de-BB22-1907554F6075}")), wcslen (_T("{36D6CA65-3367-49de-BB22-1907554F6075}")) * sizeof (TCHAR)); ASSERT (lErr == ERROR_SUCCESS); lErr = RegSetValueEx (hkSub, _T("Provider"), 0, REG_SZ, (CONST BYTE *)&(_T("Microsoft Corporation")), wcslen (_T("Microsoft Corporation")) * sizeof (TCHAR)); ASSERT (lErr == ERROR_SUCCESS); lErr = RegSetValueEx (hkSub, _T("Version"), 0, REG_SZ, (CONST BYTE *)&(_T("1.0")), wcslen (_T("1.01")) * sizeof (TCHAR)); ASSERT (lErr == ERROR_SUCCESS); lErr = RegSetValueEx (hkSub, _T("About"), 0, REG_SZ, (CONST BYTE *)&(_T("{DD468E14-AF42-4d63-8908-EDAC4A9E67AE}")), wcslen (_T("{DD468E14-AF42-4d63-8908-EDAC4A9E67AE}")) * sizeof (TCHAR)); ASSERT (lErr == ERROR_SUCCESS); HKEY hkType = NULL; /* // create "StandAlone" subkey lErr = RegCreateKey (hkSub, _T("StandAlone"), &hkType); ASSERT (lErr == ERROR_SUCCESS); RegCloseKey( hkType ); */ hkType = NULL; // create "Extension" subkey lErr = RegCreateKey (hkSub, _T("Extension"), &hkType); ASSERT (lErr == ERROR_SUCCESS); RegCloseKey( hkType ); hkType = NULL; // close the hkSub RegCloseKey (hkSub); } // close the hkMMC RegCloseKey (hkMMC); hkMMC = NULL; // Register as an extension to the Security Template snap-in { #define WIRELESS_POLMGR_NAME _T("Wireless Network Policy Manager Extension") // lstruuidNodetypeSceTemplate is defined as L"{668A49ED-8888-11d1-AB72-00C04FB6C6FA}" in sceattch.h // open the registry at \\My Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MMC\Node Types lErr = RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\MMC\\NodeTypes"), 0, KEY_ALL_ACCESS, &hkMMC ); ASSERT( lErr == ERROR_SUCCESS ); if (lErr == ERROR_SUCCESS) { HKEY hkNameSpace = NULL; // Now open the Security Template entry: {668A49ED-8888-11d1-AB72-00C04FB6C6FA}\Extensions\NameSpace lErr = RegCreateKey( hkMMC, _T("{668A49ED-8888-11d1-AB72-00C04FB6C6FA}\\Extensions\\NameSpace"), &hkNameSpace ); ASSERT( lErr == ERROR_SUCCESS ); if (lErr == ERROR_SUCCESS) { // We want to add ourselves as an extension to the Security editor //lErr = RegSetValueEx( hkNameSpace, _T("{DEA8AFA0-CC85-11d0-9CE2-0080C7221EBD}" ), lErr = RegSetValueEx( hkNameSpace, cszSnapin, 0, REG_SZ, (CONST BYTE *)&(WIRELESS_POLMGR_NAME), wcslen( WIRELESS_POLMGR_NAME ) * sizeof (TCHAR)); ASSERT( lErr == ERROR_SUCCESS ); } } } } else { ASSERT (0); hr = E_UNEXPECTED; } } return hr; } ///////////////////////////////////////////////////////////////////////////// // DllUnregisterServer - Removes entries from the system registry STDAPI DllUnregisterServer(void) { _Module.UnregisterServer(); return S_OK; }