|
|
// This is a part of the Microsoft Management Console.
// Copyright (C) Microsoft Corporation, 1995 - 1999
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Management Console and related
// electronic documentation provided with the interfaces.
// You will need the NT SUR Beta 2 SDK or VC 4.2 in order to build this
// project. This is because you will need MIDL 3.00.15 or higher and new
// headers and libs. If you have VC 4.2 installed, then everything should
// already be configured correctly.
// Note: Proxy/Stub Information
// To build a separate proxy/stub DLL,
// run nmake -f Snapinps.mak in the project directory.
#include "stdafx.h"
#define myHLastError GetLastError
#include "csresstr.h"
CComModule _Module; HINSTANCE g_hInstance = NULL;
BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_CAPolicyExtensionSnapIn, CComponentDataPolicySettings) OBJECT_ENTRY(CLSID_CACertificateTemplateManager, CComponentDataGPEExtension) OBJECT_ENTRY(CLSID_CAPolicyAbout, CCAPolicyAboutImpl) OBJECT_ENTRY(CLSID_CertTypeAbout, CCertTypeAboutImpl) OBJECT_ENTRY(CLSID_CertTypeShellExt, CCertTypeShlExt) OBJECT_ENTRY(CLSID_CAShellExt, CCAShellExt) END_OBJECT_MAP()
STDAPI UnregisterGPECertTemplates(void);
BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to DLL module
DWORD dwReason, // reason for calling function
LPVOID lpvReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: { g_hInstance = hinstDLL; myVerifyResourceStrings(hinstDLL); _Module.Init(ObjectMap, hinstDLL);
DisableThreadLibraryCalls(hinstDLL); break; } case DLL_PROCESS_DETACH: { _Module.Term();
DEBUG_VERIFY_INSTANCE_COUNT(CSnapin); DEBUG_VERIFY_INSTANCE_COUNT(CComponentDataImpl); break; }
default: break; } return TRUE; }
/////////////////////////////////////////////////////////////////////////////
// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); 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) { HRESULT hResult = S_OK; CString cstrSubKey; DWORD dwDisp; LONG lResult; HKEY hKey; CString cstrSnapInKey; CString cstrCAPolicyAboutKey; CString cstrSnapInName; LPWSTR pszTmp;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
cstrSnapInName.LoadString(IDS_SNAPIN_NAME);
// be sure this is alloced
if (NULL == (pszTmp = cstrSubKey.GetBuffer(MAX_PATH))) return SELFREG_E_CLASS; StringFromGUID2( CLSID_CAPolicyExtensionSnapIn, pszTmp, MAX_PATH); cstrSnapInKey = cstrSubKey;
// be sure this is alloced
if (NULL == (pszTmp = cstrSubKey.GetBuffer(MAX_PATH))) return SELFREG_E_CLASS; StringFromGUID2( CLSID_CAPolicyAbout, pszTmp, MAX_PATH); cstrCAPolicyAboutKey = cstrSubKey;
//
// Register Policy Extensions SnapIn with MMC
//
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\SnapIns\\%s", (LPCWSTR)cstrSnapInKey); lResult = RegCreateKeyEx (HKEY_LOCAL_MACHINE, cstrSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp);
if (lResult != ERROR_SUCCESS) { return SELFREG_E_CLASS; }
RegSetValueEx (hKey, L"NameString", 0, REG_SZ, (LPBYTE)((LPCTSTR)cstrSnapInName), (cstrSnapInName.GetLength() + 1) * sizeof(WCHAR));
RegSetValueEx (hKey, L"About", 0, REG_SZ, (LPBYTE)((LPCTSTR)cstrCAPolicyAboutKey), (cstrCAPolicyAboutKey.GetLength() + 1) * sizeof(WCHAR));
RegCloseKey (hKey);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\SnapIns\\%s\\NodeTypes", (LPCWSTR)cstrSnapInKey); lResult = RegCreateKeyEx (HKEY_LOCAL_MACHINE, cstrSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp);
if (lResult != ERROR_SUCCESS) { return SELFREG_E_CLASS; }
RegCloseKey (hKey);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\SnapIns\\%s\\NodeTypes\\%s", (LPCWSTR)cstrSnapInKey, cszNodeTypePolicySettings); lResult = RegCreateKeyEx (HKEY_LOCAL_MACHINE, cstrSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp);
if (lResult != ERROR_SUCCESS) { return SELFREG_E_CLASS; }
RegCloseKey (hKey);
//
// Register Policy Settings in the NodeTypes key
//
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\NodeTypes\\%s", cszNodeTypePolicySettings); lResult = RegCreateKeyEx (HKEY_LOCAL_MACHINE, cstrSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp);
if (lResult != ERROR_SUCCESS) { return SELFREG_E_CLASS; }
RegSetValueEx (hKey, NULL, 0, REG_SZ, (LPBYTE)((LPCTSTR)cstrSnapInName), (cstrSnapInName.GetLength() + 1) * sizeof(WCHAR));
RegCloseKey (hKey);
//
// register as an extension under the CA snapin
//
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\NodeTypes\\%s\\Extensions\\NameSpace", cszCAManagerParentNodeID); lResult = RegCreateKeyEx (HKEY_LOCAL_MACHINE, cstrSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp);
if (lResult != ERROR_SUCCESS) { return SELFREG_E_CLASS; }
RegSetValueEx (hKey, cstrSnapInKey, 0, REG_SZ, (LPBYTE)((LPCTSTR)cstrSnapInName), (cstrSnapInName.GetLength() + 1) * sizeof(WCHAR));
RegCloseKey (hKey);
// kill beta2 GPT cert type editing
UnregisterGPECertTemplates();
// registers object, typelib and all interfaces in typelib
return _Module.RegisterServer(FALSE); //return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void) { CString cstrSubKey; LONG lResult; HKEY hKey; WCHAR szSnapInKey[50];
AFX_MANAGE_STATE(AfxGetStaticModuleState());
_Module.UnregisterServer();
StringFromGUID2 (CLSID_CAPolicyExtensionSnapIn, szSnapInKey, 50);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\NodeTypes\\%s\\Extensions\\NameSpace", cszCAManagerParentNodeID); lResult = RegOpenKeyEx (HKEY_LOCAL_MACHINE, cstrSubKey, 0, KEY_WRITE, &hKey);
if (lResult == ERROR_SUCCESS) { RegDeleteValue (hKey, szSnapInKey); RegCloseKey (hKey); } cstrSubKey.Format(L"Software\\Microsoft\\MMC\\NodeTypes\\%s\\Extensions\\NameSpace", cszNodeTypePolicySettings); RegDeleteKey (HKEY_LOCAL_MACHINE, cstrSubKey);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\NodeTypes\\%s", cszNodeTypePolicySettings); RegDeleteKey (HKEY_LOCAL_MACHINE, cstrSubKey);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\SnapIns\\%s\\NodeTypes\\%s", szSnapInKey, cszNodeTypePolicySettings); RegDeleteKey (HKEY_LOCAL_MACHINE, cstrSubKey);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\SnapIns\\%s\\NodeTypes", szSnapInKey); RegDeleteKey (HKEY_LOCAL_MACHINE, cstrSubKey);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\SnapIns\\%s", szSnapInKey); RegDeleteKey (HKEY_LOCAL_MACHINE, cstrSubKey);
// kill beta2 GPT cert type editing
UnregisterGPECertTemplates(); return S_OK; }
/////////////////////////////////////////////////////////////////////////////
// UnregisterGPECertTemplates - Removes GPECertTemplateEditing from the registry
STDAPI UnregisterGPECertTemplates(void) { CString cstrSubKey; LONG lResult; HKEY hKey; WCHAR szSnapInKeyForGPT[50]; WCHAR szSnapInKey[50];
StringFromGUID2 (CLSID_CACertificateTemplateManager, szSnapInKeyForGPT, 50); StringFromGUID2 (CLSID_CAPolicyExtensionSnapIn, szSnapInKey, 50);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\NodeTypes\\%s\\Extensions\\NameSpace", cszSCEParentNodeIDUSER); lResult = RegOpenKeyEx (HKEY_LOCAL_MACHINE, cstrSubKey, 0, KEY_WRITE, &hKey);
if (lResult == ERROR_SUCCESS) { RegDeleteValue (hKey, szSnapInKeyForGPT); RegCloseKey (hKey); }
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\NodeTypes\\%s\\Extensions\\NameSpace", cszSCEParentNodeIDCOMPUTER); lResult = RegOpenKeyEx (HKEY_LOCAL_MACHINE, cstrSubKey, 0, KEY_WRITE, &hKey);
if (lResult == ERROR_SUCCESS) { RegDeleteValue (hKey, szSnapInKeyForGPT); RegCloseKey (hKey); }
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\NodeTypes\\%s", cszNodeTypeCertificateTemplate); RegDeleteKey (HKEY_LOCAL_MACHINE, cstrSubKey);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\SnapIns\\%s\\NodeTypes\\%s", (LPCWSTR)szSnapInKey, cszNodeTypeCertificateTemplate); RegDeleteKey (HKEY_LOCAL_MACHINE, cstrSubKey);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\SnapIns\\%s\\NodeTypes", (LPCWSTR)szSnapInKeyForGPT); RegDeleteKey (HKEY_LOCAL_MACHINE, cstrSubKey);
cstrSubKey.Format(L"Software\\Microsoft\\MMC\\SnapIns\\%s", (LPCWSTR)szSnapInKeyForGPT); RegDeleteKey (HKEY_LOCAL_MACHINE, cstrSubKey);
return S_OK; }
VOID Usage() { CString cstrDllInstallUsageText; CString cstrDllInstallUsageTitle; cstrDllInstallUsageText.LoadString(IDS_DLL_INSTALL_USAGE_TEXT); cstrDllInstallUsageTitle.LoadString(IDS_DLL_INSTALL_USAGE_TITLE);
MessageBox(NULL, cstrDllInstallUsageText, cstrDllInstallUsageTitle, MB_OK); }
STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine) { DWORD dwDisp; LONG lResult; HKEY hKey; LPCWSTR wszCurrentCmd = pszCmdLine;
AFX_MANAGE_STATE(AfxGetStaticModuleState()); BOOL fEnableTypeEditing = FALSE;
// parse the cmd line
while(wszCurrentCmd && *wszCurrentCmd) { while(*wszCurrentCmd == L' ') wszCurrentCmd++; if(*wszCurrentCmd == 0) break;
switch(*wszCurrentCmd++) { case L'?': Usage(); return S_OK; case L'c': fEnableTypeEditing = TRUE; break; } }
//
// Register Certificate Templates in the NodeTypes key
//
if(fEnableTypeEditing) { DWORD dwEnable = bInstall; lResult = RegCreateKeyEx (HKEY_CURRENT_USER, L"Software\\Microsoft\\Cryptography\\CertificateTemplateCache", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp);
if (lResult != ERROR_SUCCESS) { return SELFREG_E_CLASS; }
RegSetValueEx (hKey, REGSZ_ENABLE_CERTTYPE_EDITING, 0, REG_DWORD, (LPBYTE)(&dwEnable), sizeof(dwEnable));
RegCloseKey (hKey); }
return S_OK; }
|