Leaked source code of windows server 2003
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.
 
 
 
 
 
 

437 lines
9.8 KiB

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
MainDll.cpp
Abstract:
History:
--*/
#include "PreComp.h"
#include <wbemint.h>
#include <comdef.h>
#include <stdio.h>
#include <strsafe.h>
#include "Globals.h"
#include "ClassFac.h"
#include "Guids.h"
#include "aggregator.h"
#include "ProvRegistrar.h"
#include "ProvEvents.h"
#include "OS.h"
HINSTANCE g_hInst=NULL;
enum { RUN_AS_PROVIDER = 1, RUN_AS_CLIENT=2 };
int run_as = 0;
CriticalSection s_CriticalSection(NOTHROW_LOCK) ;
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
BOOL APIENTRY DllMain (
HINSTANCE hInstance,
ULONG ulReason ,
LPVOID pvReserved
)
{
g_hInst=hInstance;
BOOL t_Status = TRUE ;
if ( DLL_PROCESS_DETACH == ulReason )
{
HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Global_Shutdown () ;
if ( SUCCEEDED ( t_Result ) )
{
t_Status = TRUE ;
}
else
{
t_Status = FALSE ;
}
t_Status = TRUE ;
}
else if ( DLL_PROCESS_ATTACH == ulReason )
{
if (!s_CriticalSection.valid())
return FALSE;
HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Global_Startup () ;
if ( SUCCEEDED ( t_Result ) )
{
t_Status = TRUE ;
}
else
{
t_Status = FALSE ;
}
}
else if ( DLL_THREAD_DETACH == ulReason )
{
t_Status = TRUE ;
}
else if ( DLL_THREAD_ATTACH == ulReason )
{
t_Status = TRUE ;
}
return t_Status ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDAPI DllGetClassObject (
REFCLSID rclsid ,
REFIID riid,
void **ppv
)
{
CS_GUARD_RETURN(monitor, s_CriticalSection, E_OUTOFMEMORY) ;
HRESULT status = S_OK ;
if ( rclsid == CLSID_WmiDCProxyProvider)
{
run_as = RUN_AS_PROVIDER;
CServerClassFactory <DCProxy,IWbemServices> *lpunk = new CServerClassFactory <DCProxy,IWbemServices> ;
if ( lpunk == NULL )
{
status = E_OUTOFMEMORY ;
}
else
{
status = lpunk->QueryInterface ( riid , ppv ) ;
if ( FAILED ( status ) )
{
delete lpunk ;
}
else
{
}
}
} else if ( rclsid == CLSID_WbemDecoupledRegistrar)
{
run_as = RUN_AS_CLIENT;
CServerClassFactory <CServerObject_ProviderRegistrar,IWbemDecoupledRegistrar> *lpunk = new CServerClassFactory <CServerObject_ProviderRegistrar,IWbemDecoupledRegistrar> ;
if ( lpunk == NULL )
{
status = E_OUTOFMEMORY ;
}
else
{
status = lpunk->QueryInterface ( riid , ppv ) ;
if ( FAILED ( status ) )
{
delete lpunk ;
}
else
{
}
}
}
else if ( rclsid == CLSID_WbemDecoupledBasicEventProvider)
{
run_as = RUN_AS_CLIENT;
CServerClassFactory <CServerObject_ProviderEvents,IWbemDecoupledBasicEventProvider> *lpunk = new CServerClassFactory <CServerObject_ProviderEvents,IWbemDecoupledBasicEventProvider> ;
if ( lpunk == NULL )
{
status = E_OUTOFMEMORY ;
}
else
{
status = lpunk->QueryInterface ( riid , ppv ) ;
if ( FAILED ( status ) )
{
delete lpunk ;
}
else
{
}
}
}
else
{
status = CLASS_E_CLASSNOTAVAILABLE ;
}
return status ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDAPI DllCanUnloadNow ()
{
CS_GUARD_RETURN(monitor, s_CriticalSection, E_OUTOFMEMORY) ; bool unload = true;
switch(run_as)
{
case 0:
break;
case RUN_AS_PROVIDER:
{
DC_registrar * dcReg = DC_registrar::instance_;
if (dcReg && DecoupledProviderSubSystem_Globals::s_ObjectsInProgress == 0)
{
dcReg->Delete();
dcReg->Release();
}
unload = DecoupledProviderSubSystem_Globals::s_LocksInProgress || DecoupledProviderSubSystem_Globals::s_ObjectsInProgress ||
DecoupledProviderSubSystem_Globals::s_RegistrarUsers;
break;
}
case RUN_AS_CLIENT:
unload = DecoupledProviderSubSystem_Globals::s_LocksInProgress || DecoupledProviderSubSystem_Globals::s_ObjectsInProgress;
break;
};
unload = ! unload ;
return unload ? ResultFromScode ( S_OK ) : ResultFromScode ( S_FALSE ) ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
//Strings used during self registeration
#define REG_FORMAT_STR ("%s\\%s")
#define NOT_INSERT_STR ("NotInsertable")
#define INPROC32_STR ("InprocServer32")
#define LOCALSERVER32_STR ("LocalServer32")
#define THREADING_MODULE_STR ("ThreadingModel")
#define APARTMENT_STR ("Both")
#define APPID_VALUE_STR ("APPID")
#define APPID_STR ("APPID\\")
#define CLSID_STR ("CLSID\\")
#define WMI_DECCUPLED_PROXY_PROVIDER ("Microsoft WMI Adaptor Provider for Decoupled Provider")
#define WMI_PROVIDER_DECOUPLED_REGISTRAR ("Microsoft WMI Provider Subsystem Decoupled Registrar")
#define WMI_PROVIDER_DECOUPLED_BASIC_EVENT_PROVIDER ("Microsoft WMI Provider Subsystem Decoupled Basic Event Provider")
const char * WmiDCProxyProviderKey= ("{54D8502C-527D-43f7-A506-A9DA075E229C}");
const char * WbemDecoupledRegistrarKey=("{4cfc7932-0f9d-4bef-9c32-8ea2a6b56fcb}");
const char * WbemDecoupledBasicEventProviderKey = ("{f5f75737-2843-4f22-933d-c76a97cda62f}");
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
BOOL SetKeyAndValue ( char *pszKey , char *pszSubkey , char *pszValueName , char *pszValue )
{
HKEY hKey;
char szKey[256];
StringCchCopyA ( szKey , 256, pszKey ) ;
if ( NULL != pszSubkey )
{
StringCchCatA ( szKey , 256, ("\\") ) ;
StringCchCatA ( szKey , 256, pszSubkey ) ;
}
if ( ERROR_SUCCESS != RegCreateKeyExA (
HKEY_CLASSES_ROOT ,
szKey ,
0,
NULL,
REG_OPTION_NON_VOLATILE ,
KEY_ALL_ACCESS,
NULL,
&hKey,
NULL
)
)
{
return FALSE ;
}
if ( NULL != pszValue )
{
if ( ERROR_SUCCESS != RegSetValueExA (
hKey,
pszValueName,
0,
REG_SZ,
(BYTE *) pszValue ,
(lstrlenA(pszValue)+1)*sizeof(char)
)
)
{
return FALSE;
}
}
RegCloseKey ( hKey ) ;
return TRUE;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDAPI RegisterServer ( const char * szProviderClassID , char *a_ProviderName )
{
CServerObject_DecoupledClientRegistration_Element::VerifyClientKey();
char szModule[512];
if (GetModuleFileNameA(g_hInst,(char *)szModule, sizeof(szModule)/sizeof(char))==0)
return HRESULT_FROM_WIN32(GetLastError());
char szProviderCLSIDClassID[128];
StringCchCopyA(szProviderCLSIDClassID,128, CLSID_STR);
StringCchCatA(szProviderCLSIDClassID,128, szProviderClassID);
//Create entries under CLSID
if (FALSE ==SetKeyAndValue(szProviderCLSIDClassID, NULL, NULL, a_ProviderName ))
return SELFREG_E_CLASS;
if (FALSE ==SetKeyAndValue(szProviderCLSIDClassID, NOT_INSERT_STR, NULL, NULL))
return SELFREG_E_CLASS;
if (FALSE ==SetKeyAndValue(szProviderCLSIDClassID, INPROC32_STR, NULL,szModule))
return SELFREG_E_CLASS;
if (FALSE ==SetKeyAndValue(szProviderCLSIDClassID, INPROC32_STR,THREADING_MODULE_STR, APARTMENT_STR))
return SELFREG_E_CLASS;
return S_OK;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDAPI UnregisterServer( const char * szProviderClassID )
{
char szTemp[128];
char szProviderCLSIDClassID[128];
StringCchCopyA(szProviderCLSIDClassID,128, CLSID_STR);
StringCchCatA(szProviderCLSIDClassID,128, szProviderClassID);
//Delete entries under CLSID
StringCchPrintfA(szTemp, 128, REG_FORMAT_STR, szProviderCLSIDClassID, NOT_INSERT_STR);
RegDeleteKeyA(HKEY_CLASSES_ROOT, szTemp);
StringCchPrintfA(szTemp, 128, REG_FORMAT_STR,szProviderCLSIDClassID, INPROC32_STR);
RegDeleteKeyA(HKEY_CLASSES_ROOT, szTemp);
RegDeleteKeyA(HKEY_CLASSES_ROOT, szProviderCLSIDClassID);
return S_OK;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDAPI DllRegisterServer ()
{
HRESULT t_Result ;
t_Result = RegisterServer ( WmiDCProxyProviderKey , WMI_DECCUPLED_PROXY_PROVIDER ) ;
t_Result = RegisterServer ( WbemDecoupledRegistrarKey , WMI_PROVIDER_DECOUPLED_REGISTRAR ) ;
t_Result = RegisterServer ( WbemDecoupledBasicEventProviderKey , WMI_PROVIDER_DECOUPLED_BASIC_EVENT_PROVIDER ) ;
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDAPI DllUnregisterServer ()
{
HRESULT t_Result ;
t_Result = UnregisterServer ( WmiDCProxyProviderKey ) ;
t_Result = UnregisterServer ( WbemDecoupledRegistrarKey ) ;
t_Result = UnregisterServer ( WbemDecoupledBasicEventProviderKey ) ;
return t_Result ;
}