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.
273 lines
6.0 KiB
273 lines
6.0 KiB
//+--------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996 - 1999
|
|
//
|
|
// File: certcli.cpp
|
|
//
|
|
// Contents: Cert Server client implementation
|
|
//
|
|
// History: 24-Aug-96 vich created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "pch.cpp"
|
|
|
|
#pragma hdrstop
|
|
|
|
#include "certsrvd.h"
|
|
#include "configp.h"
|
|
#include "config.h"
|
|
#include "getconf.h"
|
|
#include "request.h"
|
|
#include "certtype.h"
|
|
|
|
#include "csif.h" // CertIf includes
|
|
#include "csprxy.h" // CertPrxy includes
|
|
#include "resource.h"
|
|
#include "csresstr.h"
|
|
|
|
|
|
HINSTANCE g_hInstance = NULL;
|
|
|
|
extern CRITICAL_SECTION g_csDomainSidCache;
|
|
extern CRITICAL_SECTION g_csOidURL;
|
|
extern BOOL g_fInitDone = FALSE;
|
|
extern BOOL g_fOidURL = FALSE;
|
|
|
|
#if DBG_CERTSRV
|
|
extern VOID RegisterMemoryDeleteCriticalSection();
|
|
#endif
|
|
|
|
CComModule _Module;
|
|
|
|
BEGIN_OBJECT_MAP(ObjectMap)
|
|
OBJECT_ENTRY(CLSID_CCertConfig, CCertConfig)
|
|
OBJECT_ENTRY(CLSID_CCertGetConfig, CCertGetConfig)
|
|
OBJECT_ENTRY(CLSID_CCertRequest, CCertRequest)
|
|
#include "csifm.h" // CertIf object map entries
|
|
END_OBJECT_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DLL Entry Point
|
|
|
|
extern "C"
|
|
BOOL WINAPI
|
|
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
|
|
{
|
|
BOOL fRet = TRUE; // assume OK
|
|
|
|
__try
|
|
{
|
|
fRet = CertPrxyDllMain(hInstance, dwReason, lpReserved);
|
|
switch (dwReason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
myVerifyResourceStrings(hInstance);
|
|
_Module.Init(ObjectMap, hInstance);
|
|
DisableThreadLibraryCalls(hInstance);
|
|
g_hInstance = hInstance;
|
|
InitializeCriticalSection(&g_csDomainSidCache);
|
|
g_fInitDone = TRUE;
|
|
InitializeCriticalSection(&g_csOidURL);
|
|
g_fOidURL = TRUE;
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
myFreeColumnDisplayNames();
|
|
if (g_fOidURL)
|
|
{
|
|
DeleteCriticalSection(&g_csOidURL);
|
|
}
|
|
if (g_fInitDone)
|
|
{
|
|
DeleteCriticalSection(&g_csDomainSidCache);
|
|
}
|
|
DbgTerminate();
|
|
_Module.Term();
|
|
#if DBG_CERTSRV
|
|
RegisterMemoryDeleteCriticalSection();
|
|
#endif
|
|
g_hInstance = NULL;
|
|
break;
|
|
}
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
// return failure
|
|
fRet = FALSE;
|
|
}
|
|
return(fRet);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Used to determine whether the DLL can be unloaded by OLE
|
|
|
|
STDAPI
|
|
DllCanUnloadNow(void)
|
|
{
|
|
return(
|
|
(S_OK == CertPrxyDllCanUnloadNow() && 0 == _Module.GetLockCount())?
|
|
S_OK : S_FALSE);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Returns a class factory to create an object of the requested type
|
|
|
|
STDAPI
|
|
DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
|
|
{
|
|
HRESULT hr;
|
|
|
|
hr = CertPrxyDllGetClassObject(rclsid, riid, ppv);
|
|
if (S_OK != hr)
|
|
{
|
|
hr = _Module.GetClassObject(rclsid, riid, ppv);
|
|
if (S_OK == hr && NULL != *ppv)
|
|
{
|
|
myRegisterMemFree(*ppv, CSM_NEW | CSM_GLOBALDESTRUCTOR);
|
|
}
|
|
}
|
|
return(hr);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllRegisterServer - Adds entries to the system registry
|
|
|
|
STDAPI
|
|
DllRegisterServer(void)
|
|
{
|
|
HRESULT hr;
|
|
HRESULT hr2;
|
|
HKEY hGPOExtensions;
|
|
|
|
// we remove the registration of GPO Processing call backs. This was
|
|
// intended for upgrading B2 clients.
|
|
|
|
hr = RegOpenKeyEx(
|
|
HKEY_LOCAL_MACHINE,
|
|
TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\GPExtensions"),
|
|
0,
|
|
KEY_WRITE | KEY_READ,
|
|
&hGPOExtensions);
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
RegDeleteKey(hGPOExtensions, TEXT("PublicKeyPolicy"));
|
|
RegCloseKey(hGPOExtensions);
|
|
}
|
|
|
|
hr = CertPrxyDllRegisterServer();
|
|
|
|
// registers object, typelib and all interfaces in typelib
|
|
hr2 = _Module.RegisterServer(TRUE);
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = hr2;
|
|
}
|
|
|
|
//register the evenlog
|
|
hr2 = myAddLogSourceToRegistry(L"%SystemRoot%\\System32\\pautoenr.dll",
|
|
L"AutoEnrollment");
|
|
|
|
if (S_OK == hr)
|
|
{
|
|
hr = hr2;
|
|
}
|
|
return(hr);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllUnregisterServer - Removes entries from the system registry
|
|
|
|
STDAPI
|
|
DllUnregisterServer(void)
|
|
{
|
|
HRESULT hr;
|
|
HRESULT hr2;
|
|
HKEY hGPOExtensions;
|
|
|
|
hr = RegOpenKeyEx(
|
|
HKEY_LOCAL_MACHINE,
|
|
TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\GPExtensions"),
|
|
0,
|
|
KEY_WRITE | KEY_READ,
|
|
&hGPOExtensions);
|
|
if (S_OK == hr)
|
|
{
|
|
hr = RegDeleteKey(hGPOExtensions, TEXT("PublicKeyPolicy"));
|
|
RegCloseKey(hGPOExtensions);
|
|
}
|
|
|
|
hr = CertPrxyDllUnregisterServer();
|
|
hr2 = _Module.UnregisterServer();
|
|
if (S_OK == hr)
|
|
{
|
|
hr = hr2;
|
|
}
|
|
return(hr);
|
|
}
|
|
|
|
|
|
// Register certcli.dll with the following command line to install templates:
|
|
// regsvr32 /i:i /n certcli.dll
|
|
|
|
STDAPI
|
|
DllInstall(
|
|
IN BOOL, // bInstall
|
|
IN LPCWSTR pszCmdLine)
|
|
{
|
|
LPCWSTR wszCurrentCmd = pszCmdLine;
|
|
|
|
// parse the cmd line
|
|
|
|
while(wszCurrentCmd && *wszCurrentCmd)
|
|
{
|
|
while(*wszCurrentCmd == L' ')
|
|
wszCurrentCmd++;
|
|
if(*wszCurrentCmd == 0)
|
|
break;
|
|
|
|
switch(*wszCurrentCmd++)
|
|
{
|
|
case L'i':
|
|
|
|
CCertTypeInfo::InstallDefaultTypes();
|
|
return S_OK;
|
|
}
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
void __RPC_FAR *__RPC_USER
|
|
MIDL_user_allocate(
|
|
IN size_t cb)
|
|
{
|
|
return(CoTaskMemAlloc(cb));
|
|
}
|
|
|
|
|
|
void __RPC_USER
|
|
MIDL_user_free(
|
|
IN void __RPC_FAR *pb)
|
|
{
|
|
CoTaskMemFree(pb);
|
|
}
|
|
|
|
|
|
VOID
|
|
myFreeColumnDisplayNames()
|
|
{
|
|
extern VOID myFreeColumnDisplayNames2();
|
|
|
|
CACleanup();
|
|
myFreeColumnDisplayNames2();
|
|
myFreeResourceStrings("certcli.dll");
|
|
}
|