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
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 ;
|
|
}
|