Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

325 lines
8.8 KiB

//*************************************************************
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998
//
// File: NameSpace.cpp
//
// Contents: Functions to copy classes and instances from one namespace to
// another
//
// History: 25-Aug-99 NishadM Created
//
//*************************************************************
#include <windows.h>
#include <ole2.h>
#include <initguid.h>
#include <wbemcli.h>
#include "smartptr.h"
#include "RsopInc.h"
#include "rsoputil.h"
#include "rsopdbg.h"
HRESULT
GetWbemServicesPtr( LPCWSTR wszNameSpace,
IWbemLocator** ppLocator,
IWbemServices** ppServices )
{
HRESULT hr;
IWbemLocator* pWbemLocator = 0;
if ( !wszNameSpace || !ppLocator || !ppServices )
{
hr = E_INVALIDARG;
dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("GetWbemServicesPtr: Invalid argument" ));
}
else
{
if ( !*ppLocator )
{
//
// get a handle to IWbemLocator
//
hr = CoCreateInstance( CLSID_WbemLocator,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(void**) &pWbemLocator );
if ( SUCCEEDED( hr ) )
{
*ppLocator = pWbemLocator;
}
else
{
dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("GetWbemServicesPtr: CoCreateInstance failed with 0x%x"), hr );
}
}
else
{
//
// IWbemLocator was passed in. don't create it
//
pWbemLocator = *ppLocator;
}
}
if ( pWbemLocator )
{
XBStr xNameSpace( (LPWSTR) wszNameSpace );
if ( xNameSpace )
{
//
// based on the name space, get a handle to IWbemServices
//
hr = pWbemLocator->ConnectServer( xNameSpace,
0,
0,
0L,
0L,
0,
0,
ppServices );
}
}
return hr;
}
HRESULT
CopyInstances( IWbemServices* pServicesSrc,
IWbemServices* pServicesDest,
BSTR bstrClass,
BOOL* pbAbort )
{
HRESULT hr;
IEnumWbemClassObject* pEnum = 0;
//
// create an enumeration of instances
//
hr = pServicesSrc->CreateInstanceEnum( bstrClass,
WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY,
NULL,
&pEnum );
XInterface<IEnumWbemClassObject> xEnum( pEnum );
ULONG ulReturned = 1;
hr = *pbAbort ? E_ABORT : hr ;
while ( SUCCEEDED( hr ) )
{
IWbemClassObject *pInstance;
//
// for every instance
//
hr = xEnum->Next( -1,
1,
&pInstance,
&ulReturned );
//
// perf: use batching calls
//
if ( SUCCEEDED( hr ) && ulReturned == 1 )
{
XInterface<IWbemClassObject> xInstance( pInstance );
//
// copy to the destination namespace
//
hr = pServicesDest->PutInstance( pInstance,
WBEM_FLAG_CREATE_OR_UPDATE,
0,
0 );
hr = *pbAbort ? E_ABORT : hr ;
}
else
{
break;
}
}
return hr;
}
HRESULT
CopyClasses(IWbemServices* pServicesSrc,
IWbemServices* pServicesDest,
BSTR bstrParent,
BOOL bCopyInstances,
BOOL* pbAbort )
{
HRESULT hr = S_OK;
//
// create an enumeration of classes
//
XInterface<IEnumWbemClassObject> xEnum;
hr = pServicesSrc->CreateClassEnum( bstrParent,
WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY,
0,
&xEnum );
ULONG ulReturned = 1;
XBStr xbstrClass( L"__CLASS" );
hr = *pbAbort ? E_ABORT : hr ;
while ( SUCCEEDED( hr ) )
{
XInterface<IWbemClassObject> xClass;
//
// for every class
//
hr = xEnum->Next( -1,
1,
&xClass,
&ulReturned );
hr = *pbAbort ? E_ABORT : hr ;
if ( SUCCEEDED( hr ) && ulReturned == 1 )
{
VARIANT var;
VariantInit( &var );
//
// get __CLASS system property
//
hr = xClass->Get( xbstrClass,
0,
&var,
0,
0 );
if ( SUCCEEDED( hr ) )
{
//
// system classes begin with "_", don't copy them
//
if ( wcsncmp( var.bstrVal, L"_", 1 ) )
{
//
// copy class
//
hr = pServicesDest->PutClass( xClass,
WBEM_FLAG_CREATE_OR_UPDATE,
0,
0 );
if ( SUCCEEDED( hr ) )
{
hr = CopyClasses( pServicesSrc,
pServicesDest,
var.bstrVal,
bCopyInstances,
pbAbort );
if ( FAILED( hr ) )
{
dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CopyClasses: CopyClassesSorted failed with 0x%x"), hr );
}
else if ( bCopyInstances )
{
//
// copy instance
//
hr = CopyInstances( pServicesSrc, pServicesDest, var.bstrVal, pbAbort );
if ( FAILED(hr) )
{
dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CopyClasses: CopyInstances failed with 0x%x"), hr );
}
}
}
}
VariantClear( &var );
}
}
else
{
break;
}
}
return hr;
}
HRESULT
CopyNameSpace( LPCWSTR wszSrc,
LPCWSTR wszDest,
BOOL bCopyInstances,
BOOL* pbAbort,
IWbemLocator* pWbemLocator )
{
//
// parameter validation
//
if ( !wszSrc || !wszDest || !pbAbort )
{
return E_POINTER;
}
BOOL bLocatorObtained = ( pWbemLocator == 0 );
IWbemServices* pServicesSrc;
//
// get a pointer to the source namespace
//
HRESULT hr = GetWbemServicesPtr( wszSrc, &pWbemLocator, &pServicesSrc );
hr = *pbAbort ? E_ABORT : hr ;
if ( SUCCEEDED( hr ) )
{
XInterface<IWbemServices> xServicesSrc( pServicesSrc );
IWbemServices* pServicesDest;
//
// get a pointer to the destination namespace
//
hr = GetWbemServicesPtr( wszDest, &pWbemLocator, &pServicesDest );
hr = *pbAbort ? E_ABORT : hr ;
if ( SUCCEEDED( hr ) )
{
XInterface<IWbemServices> xServicesDest( pServicesDest );
//
// copy classes and instances
//
hr = CopyClasses( pServicesSrc,
pServicesDest,
0,
bCopyInstances,
pbAbort );
if ( FAILED(hr) )
{
dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CopyNamespace: CopyClasses failed with 0x%x"), hr );
}
}
}
//
// if we created IWbemLocator, release it
//
if ( bLocatorObtained && pWbemLocator )
{
pWbemLocator->Release();
}
return hr;
}