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.
 
 
 
 
 
 

434 lines
11 KiB

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999-2000 Microsoft Corporation
//
// Module Name: vsswmi.cpp
//
// Implementation of the provider registration and entry point.
//
// Author: MSP Prabu (mprabu) 04-Dec-2000
// Jim Benton (jbenton) 15-Oct-2000
//
//////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include <initguid.h>
#include "ProvFactory.h"
#include "InstanceProv.h"
////////////////////////////////////////////////////////////////////////
//// Standard foo for file name aliasing. This code block must be after
//// all includes of VSS header files.
////
#ifdef VSS_FILE_ALIAS
#undef VSS_FILE_ALIAS
#endif
#define VSS_FILE_ALIAS "ADMVWMIP"
////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Global Data
//////////////////////////////////////////////////////////////////////////////
const int g_cchRegkey = 128;
// {72970BEB-81F8-46d4-B220-D743F4E49C95}
DEFINE_GUID(CLSID_VSS_PROVIDER,
0x72970BEB,
0x81F8,
0x46d4,
0xB2, 0x20, 0xD7, 0x43, 0xF4, 0xE4, 0x9C, 0x95);
//DECLARE_DEBUG_PRINTS_OBJECT();
// Count number of objects and number of locks.
long g_cObj = 0;
long g_cLock = 0;
HMODULE g_hModule;
FactoryData g_FactoryDataArray[] =
{
{
&CLSID_VSS_PROVIDER,
CInstanceProv::S_HrCreateThis,
PVD_WBEM_PROVIDERNAME
}
};
//////////////////////////////////////////////////////////////////////////////
//++
//
// BOOL
// WINAPI
// DllMain(
// HANDLE hModule,
// DWORD ul_reason_for_call,
// LPVOID lpReserved
// )
//
// Description:
// Main DLL entry point.
//
// Arguments:
// hModule -- DLL module handle.
// ul_reason_for_call --
// lpReserved --
//
// Return Values:
// TRUE
//
//--
//////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
DllMain(
HANDLE hModule,
DWORD dwReason,
LPVOID lpReserved
)
{
g_hModule = static_cast< HMODULE >( hModule );
if (dwReason == DLL_PROCESS_ATTACH)
{
}
else if (dwReason == DLL_PROCESS_DETACH)
{
}
return TRUE;
} //*** DllMain()
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDAPI
// DllCanUnloadNow( void )
//
// Description:
// Called periodically by Ole in order to determine if the
// DLL can be freed.
//
// Arguments:
// None.
//
// Return Values:
// S_OK if there are no objects in use and the class factory
// isn't locked.
//
//--
//////////////////////////////////////////////////////////////////////////////
STDAPI DllCanUnloadNow( void )
{
SCODE sc;
//It is OK to unload if there are no objects or locks on the
// class factory.
sc = ( 0L == g_cObj && 0L == g_cLock ) ? S_OK : S_FALSE;
return sc;
} //*** DllCanUnloadNow()
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDAPI
// DllRegisterServer( void )
//
// Description:
// Called during setup or by regsvr32.
//
// Arguments:
// None.
//
// Return Values:
// NOERROR if registration successful, error otherwise.
// SELFREG_E_CLASS
//
//--
//////////////////////////////////////////////////////////////////////////////
STDAPI DllRegisterServer( void )
{
WCHAR wszID[ g_cchGUID ];
WCHAR wszCLSID[ g_cchRegkey ];
WCHAR wszModule[ MAX_PATH ];
INT idx;
WCHAR * pwszModel = L"Both";
HKEY hKey1 = NULL;
HKEY hKey2 = NULL;
DWORD dwRet = ERROR_SUCCESS;
INT cArray = sizeof ( g_FactoryDataArray ) / sizeof ( FactoryData );
// Create the path.
try
{
for ( idx = 0 ; idx < cArray && dwRet == ERROR_SUCCESS ; idx++ )
{
LPCWSTR pwszName = g_FactoryDataArray[ idx ].m_pwszRegistryName;
dwRet = StringFromGUID2(
*g_FactoryDataArray[ idx ].m_pCLSID,
wszID,
g_cchGUID
);
if (dwRet == 0)
{
dwRet = ERROR_INSUFFICIENT_BUFFER;
break;
}
if (FAILED(StringCchPrintf(wszCLSID, g_cchRegkey, L"Software\\Classes\\CLSID\\%lS", wszID)))
{
dwRet = ERROR_INSUFFICIENT_BUFFER;
break;
}
wszCLSID[g_cchRegkey - 1] = L'\0';
// Create entries under CLSID
dwRet = RegCreateKeyW(
HKEY_LOCAL_MACHINE,
wszCLSID,
&hKey1
);
if ( dwRet != ERROR_SUCCESS )
{
break;
}
dwRet = RegSetValueEx(
hKey1,
NULL,
0,
REG_SZ,
(BYTE *) pwszName,
sizeof( WCHAR ) * (lstrlenW( pwszName ) + 1)
);
if ( dwRet != ERROR_SUCCESS )
{
break;
}
dwRet = RegCreateKeyW(
hKey1,
L"InprocServer32",
& hKey2
);
if ( dwRet != ERROR_SUCCESS )
{
break;
}
GetModuleFileName( g_hModule, wszModule, MAX_PATH );
dwRet = RegSetValueEx(
hKey2,
NULL,
0,
REG_SZ,
(BYTE *) wszModule,
sizeof( WCHAR ) * (lstrlen( wszModule ) + 1)
);
if ( dwRet != ERROR_SUCCESS )
{
break;
}
dwRet = RegSetValueExW(
hKey2,
L"ThreadingModel",
0,
REG_SZ,
(BYTE *) pwszModel,
sizeof( WCHAR ) * (lstrlen( pwszModel ) + 1)
);
if ( dwRet != ERROR_SUCCESS )
{
break;
}
RegCloseKey( hKey1 );
hKey1 = NULL;
RegCloseKey( hKey2 );
hKey2 = NULL;
} // for: each entry in factory entry array
}
catch ( ... )
{
dwRet = SELFREG_E_CLASS;
}
if (hKey1 != NULL)
RegCloseKey( hKey1 );
if (hKey2 != NULL)
RegCloseKey( hKey2 );
return dwRet;
} //*** DllRegisterServer()
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDAPI
// DllUnregisterServer( void )
//
// Description:
// Called when it is time to remove the registry entries.
//
// Arguments:
// None.
//
// Return Values:
// NOERROR if registration successful, error otherwise.
// SELFREG_E_CLASS
//
//--
//////////////////////////////////////////////////////////////////////////////
STDAPI DllUnregisterServer( void )
{
WCHAR wszID[ g_cchGUID ];
WCHAR wszCLSID[ g_cchRegkey ];
HKEY hKey;
INT idx;
DWORD dwRet = ERROR_SUCCESS;
INT cArray = sizeof ( g_FactoryDataArray ) / sizeof ( FactoryData );
for ( idx = 0 ; idx < cArray && dwRet == ERROR_SUCCESS ; idx++ )
{
dwRet = StringFromGUID2(
*g_FactoryDataArray[ idx ].m_pCLSID,
wszID,
g_cchGUID
);
if (dwRet == 0)
{
dwRet = ERROR_INSUFFICIENT_BUFFER;
break;
}
if (FAILED(StringCchPrintf(wszCLSID, g_cchRegkey - 1, L"Software\\Classes\\CLSID\\%lS", wszID)))
{
dwRet = ERROR_INSUFFICIENT_BUFFER;
break;
}
wszCLSID[g_cchRegkey - 1] = L'\0';
// First delete the InProcServer subkey.
dwRet = RegOpenKeyW(
HKEY_LOCAL_MACHINE,
wszCLSID,
&hKey
);
if ( dwRet != ERROR_SUCCESS )
{
continue;
}
dwRet = RegDeleteKeyW( hKey, L"InProcServer32" );
RegCloseKey( hKey );
if ( dwRet != ERROR_SUCCESS )
{
break;
}
dwRet = RegOpenKeyW(
HKEY_LOCAL_MACHINE,
L"Software\\Classes\\CLSID",
&hKey
);
if ( dwRet != ERROR_SUCCESS )
{
break;
}
dwRet = RegDeleteKeyW( hKey,wszID );
RegCloseKey( hKey );
if ( dwRet != ERROR_SUCCESS )
{
break;
}
} // for: each object
//if ( dwRet != ERROR_SUCCESS )
//{
// dwRet = SELFREG_E_CLASS;
//}
return S_OK;
} //*** DllUnregisterServer()
//////////////////////////////////////////////////////////////////////////////
//++
//
// STDAPI
// DllGetClassObject(
// REFCLSID rclsidIn,
// REFIID riidIn,
// PPVOID ppvOut
// )
//
// Description:
// Called by Ole when some client wants a class factory. Return
// one only if it is the sort of class this DLL supports.
//
// Arguments:
// rclsidIn --
// riidIn --
// ppvOut --
//
// Return Values:
// NOERROR if registration successful, error otherwise.
// E_OUTOFMEMORY
// E_FAIL
//
//--
//////////////////////////////////////////////////////////////////////////////
STDAPI
DllGetClassObject(
REFCLSID rclsidIn,
REFIID riidIn,
PPVOID ppvOut
)
{
HRESULT hr;
CProvFactory * pObj = NULL;
UINT idx;
UINT cDataArray = sizeof ( g_FactoryDataArray ) / sizeof ( FactoryData );
for ( idx = 0 ; idx < cDataArray ; idx++ )
{
if ( IsEqualCLSID(rclsidIn, *g_FactoryDataArray[ idx ].m_pCLSID) )
{
pObj= new CProvFactory( &g_FactoryDataArray[ idx ] );
if ( NULL == pObj )
{
return E_OUTOFMEMORY;
}
hr = pObj->QueryInterface( riidIn, ppvOut );
if ( FAILED( hr ) )
{
delete pObj;
}
return hr;
}
}
return E_FAIL;
} //*** DllGetClassObject()