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.
417 lines
11 KiB
417 lines
11 KiB
// podbase.cpp, implementation of CPodBase class
|
|
// Copyright (c)1997-1999 Microsoft Corporation
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "precomp.h"
|
|
#include "podbase.h"
|
|
#include <io.h>
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CPodBase::CPodBase(CRequestObject *pObj, IWbemServices *pNamespace,
|
|
IWbemContext *pCtx):CGenericClass(pObj, pNamespace, pCtx)
|
|
{
|
|
|
|
}
|
|
|
|
CPodBase::~CPodBase()
|
|
{
|
|
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// CPodBase::CreateObject
|
|
//
|
|
// Create one instance for the requested Sample_BaseClass
|
|
//////////////////////////////////////////////////////////////////////
|
|
HRESULT CPodBase::CreateObject(IWbemObjectSink *pHandler, ACTIONTYPE atAction)
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
if ( ACTIONTYPE_DELETE == atAction ) {
|
|
|
|
//
|
|
// do not support enumeration because we don't know the scope of the request
|
|
//
|
|
hr = WBEM_E_NOT_SUPPORTED;
|
|
|
|
} else if ( ACTIONTYPE_GET == atAction ||
|
|
ACTIONTYPE_ENUM == atAction ) {
|
|
|
|
|
|
// Create the instance
|
|
//============================
|
|
try{
|
|
|
|
if(FAILED(hr = SpawnAnInstance(&m_pObj))) throw hr;
|
|
|
|
//----------------------------------------------------
|
|
|
|
|
|
hr = PutProperty(m_pObj, pPodID, (PWSTR)szPodGUID);
|
|
|
|
if ( SUCCEEDED(hr) ) {
|
|
hr = pHandler->Indicate(1, &m_pObj);
|
|
}
|
|
|
|
m_pObj->Release();
|
|
m_pObj = NULL;
|
|
|
|
|
|
}catch(...){
|
|
|
|
if(m_pObj){
|
|
|
|
m_pObj->Release();
|
|
m_pObj = NULL;
|
|
}
|
|
|
|
// Clean up
|
|
// ========
|
|
throw;
|
|
}
|
|
|
|
|
|
} else {
|
|
//
|
|
// not supported for now
|
|
//
|
|
hr = WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// CPodBase::ExecMethod
|
|
// execute static and non static methods defined in the class
|
|
//////////////////////////////////////////////////////////////////////
|
|
HRESULT CPodBase::ExecMethod(IN BSTR bstrMethod,
|
|
IN bool bIsInstance,
|
|
IN IWbemClassObject *pInParams,
|
|
IN IWbemObjectSink *pHandler,
|
|
IN IWbemContext *pCtx
|
|
)
|
|
{
|
|
if ( pInParams == NULL || pHandler == NULL ) {
|
|
return WBEM_E_INVALID_PARAMETER;
|
|
}
|
|
|
|
|
|
HRESULT hr=WBEM_S_NO_ERROR;
|
|
|
|
if ( !bIsInstance ) {
|
|
|
|
//Static Methods
|
|
|
|
if(0 != _wcsicmp(bstrMethod, L"Configure"))
|
|
hr = WBEM_E_NOT_SUPPORTED;
|
|
|
|
} else {
|
|
|
|
//Non-Static Methods
|
|
hr = WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
if ( FAILED(hr) ) return hr;
|
|
|
|
|
|
//
|
|
// parse the input parameters
|
|
//
|
|
BSTR bstrDatabase = NULL;
|
|
BSTR bstrLog = NULL;
|
|
LONG ulStatus = 0;
|
|
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
if(!bstrReturnValue) throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
|
|
IWbemClassObject *pClass = NULL;
|
|
IWbemClassObject *pOutClass = NULL;
|
|
IWbemClassObject *pOutParams = NULL;
|
|
VARIANT v;
|
|
|
|
if(SUCCEEDED(hr = m_pRequest->m_pNamespace->GetObject(m_pRequest->m_bstrClass,
|
|
0, pCtx, &pClass, NULL))){
|
|
|
|
if(SUCCEEDED(hr = pClass->GetMethod(bstrMethod, 0, NULL, &pOutClass))){
|
|
|
|
if(SUCCEEDED(hr = pOutClass->SpawnInstance(0, &pOutParams))){
|
|
|
|
//Get DatabaseName
|
|
hr = GetProperty(pInParams, pSceStorePath, &bstrDatabase);
|
|
if ( hr == WBEM_S_RESET_TO_DEFAULT ) hr = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
if(SUCCEEDED(hr)){
|
|
if( SysStringLen(bstrDatabase) == 0 ) hr = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
}
|
|
|
|
if(SUCCEEDED(hr)){
|
|
|
|
// get LogName, optional
|
|
GetProperty(pInParams, pLogFilePath, &bstrLog);
|
|
|
|
// now query data then configure this component
|
|
|
|
hr = PodConfigure(pCtx, bstrDatabase, bstrLog, &ulStatus);
|
|
|
|
if ( SUCCEEDED(hr) ) {
|
|
|
|
//Set up ReturnValue
|
|
VariantInit(&v);
|
|
V_VT(&v) = VT_I4;
|
|
V_I4(&v) = ulStatus;
|
|
|
|
if(SUCCEEDED(hr = pOutParams->Put(bstrReturnValue, 0,
|
|
&v, NULL)))
|
|
pHandler->Indicate(1, &pOutParams);
|
|
}
|
|
|
|
}
|
|
|
|
pOutParams->Release();
|
|
}
|
|
pOutClass->Release();
|
|
}
|
|
pClass->Release();
|
|
}
|
|
|
|
if ( bstrDatabase ) SysFreeString(bstrDatabase);
|
|
if ( bstrLog ) SysFreeString(bstrLog);
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// CPodBase::PodConfigure
|
|
//
|
|
// Configure the Pod using data defined for the Pod
|
|
// for this sample app, it just creates/sets the data to registry
|
|
//////////////////////////////////////////////////////////////////////
|
|
HRESULT CPodBase::PodConfigure(IWbemContext *pCtx, BSTR bstrDb, BSTR bstrLog, LONG *pStatus)
|
|
{
|
|
if ( !bstrDb || !pStatus ) return WBEM_E_INVALID_PARAMETER;
|
|
|
|
*pStatus = 0;
|
|
|
|
HRESULT hr=WBEM_S_NO_ERROR;
|
|
|
|
//
|
|
// query data from the store
|
|
//
|
|
|
|
DWORD Len = SysStringLen(bstrDb);
|
|
WCHAR *pQuery =TEXT("SELECT * FROM Sce_PodData WHERE SceStorePath=\"");
|
|
WCHAR *pQuery2 =TEXT("\" AND PodID=\"");
|
|
WCHAR *pQuery3 = TEXT("\" AND PodSection=\"1\"");
|
|
|
|
PWSTR tmp=(PWSTR)LocalAlloc(LPTR, (Len+wcslen(pQuery)+wcslen(pQuery2)+wcslen(szPodGUID)+wcslen(pQuery3)+2)*sizeof(WCHAR));
|
|
if ( tmp == NULL ) return WBEM_E_OUT_OF_MEMORY;
|
|
|
|
wcscpy(tmp, pQuery);
|
|
wcscat(tmp, bstrDb);
|
|
wcscat(tmp, pQuery2);
|
|
wcscat(tmp, szPodGUID);
|
|
wcscat(tmp, pQuery3);
|
|
|
|
BSTR strQueryCategories = SysAllocString(tmp);
|
|
LocalFree(tmp);
|
|
|
|
IEnumWbemClassObject * pEnum = NULL;
|
|
IWbemClassObject * pObj = NULL;
|
|
ULONG n = 0;
|
|
HKEY hKey1=NULL;
|
|
BOOL bFindOne=FALSE;
|
|
|
|
hr = m_pNamespace->ExecQuery(TEXT("WQL"),
|
|
strQueryCategories,
|
|
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY,
|
|
NULL,
|
|
&pEnum);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
//
|
|
// get data
|
|
//
|
|
do {
|
|
|
|
hr = pEnum->Next(WBEM_INFINITE, 1, &pObj, &n);
|
|
if ( hr == WBEM_S_FALSE ) {
|
|
if ( bFindOne ) {
|
|
hr = WBEM_S_NO_ERROR;
|
|
break;
|
|
} else hr = WBEM_E_NOT_FOUND; // not find any
|
|
}
|
|
|
|
if ( SUCCEEDED(hr) && n > 0) {
|
|
|
|
bFindOne = TRUE;
|
|
|
|
//
|
|
// find the instance
|
|
//
|
|
BSTR bstrKey=NULL;
|
|
BSTR bstrValue=NULL;
|
|
|
|
hr = GetProperty(pObj, pKey, &bstrKey);
|
|
if ( SUCCEEDED(hr) )
|
|
hr = GetProperty(pObj, pValue, &bstrValue);
|
|
|
|
// log the operation
|
|
LogOneRecord(pCtx, bstrLog, hr, (PWSTR)bstrKey, (PWSTR)bstrValue);
|
|
|
|
if ( bstrKey && bstrValue ) {
|
|
//
|
|
// set the registry value
|
|
//
|
|
|
|
DWORD rc = RegCreateKey(HKEY_LOCAL_MACHINE, L"software\\microsoft\\windows nt\\currentversion\\secedit", &hKey1);
|
|
if ( NO_ERROR == rc ) {
|
|
|
|
rc = RegSetValueEx(hKey1, (PWSTR)bstrKey, 0, REG_SZ, (BYTE *)bstrValue, (wcslen(bstrValue)+1)*sizeof(WCHAR));
|
|
|
|
RegCloseKey(hKey1);
|
|
hKey1 = NULL;
|
|
}
|
|
if ( rc != NO_ERROR )
|
|
*pStatus = rc;
|
|
|
|
}
|
|
|
|
if ( bstrKey ) {
|
|
SysFreeString(bstrKey);
|
|
bstrKey = NULL;
|
|
}
|
|
|
|
if ( bstrValue ) {
|
|
SysFreeString(bstrValue);
|
|
bstrValue = NULL;
|
|
}
|
|
|
|
}
|
|
|
|
if (pObj)
|
|
{
|
|
pObj->Release();
|
|
pObj = NULL;
|
|
}
|
|
|
|
} while ( SUCCEEDED(hr) );
|
|
|
|
if ( WBEM_E_NOT_FOUND == hr )
|
|
LogOneRecord(pCtx, bstrLog, hr, L"No data to configure", NULL);
|
|
else if ( FAILED(hr) )
|
|
LogOneRecord(pCtx, bstrLog, hr, L"Query pod data failed", NULL);
|
|
|
|
}
|
|
|
|
SysFreeString(strQueryCategories);
|
|
|
|
if (pEnum)
|
|
{
|
|
pEnum->Release();
|
|
}
|
|
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// CPodBase::LogOneRecord
|
|
//
|
|
// Log a record for the Pod
|
|
//////////////////////////////////////////////////////////////////////
|
|
HRESULT CPodBase::LogOneRecord(IWbemContext *pCtx, BSTR bstrLog, HRESULT hrLog, PWSTR bufKey, PWSTR bufValue)
|
|
{
|
|
if ( !bstrLog ) return WBEM_E_INVALID_PARAMETER;
|
|
|
|
//
|
|
// build the log record string
|
|
//
|
|
DWORD Len=0;
|
|
|
|
if ( bufKey ) Len += wcslen(bufKey) + 1;
|
|
if ( bufValue ) Len += wcslen(bufValue) + 1;
|
|
|
|
PWSTR tmp=(PWSTR)LocalAlloc(LPTR, (Len+2)*sizeof(WCHAR));
|
|
if ( !tmp ) return WBEM_E_OUT_OF_MEMORY;
|
|
|
|
if ( bufKey ) {
|
|
wcscat(tmp, bufKey);
|
|
wcscat(tmp, L"\t");
|
|
}
|
|
if ( bufValue ) {
|
|
wcscat(tmp, bufValue);
|
|
wcscat(tmp, L"\t");
|
|
}
|
|
|
|
BSTR bstrRecord=SysAllocString(tmp);
|
|
LocalFree(tmp);
|
|
|
|
if ( !bstrRecord ) return WBEM_E_OUT_OF_MEMORY;
|
|
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
|
|
//
|
|
// get the log class
|
|
//
|
|
BSTR bstrClass=SysAllocString(L"Sce_ConfigurationLogRecord");
|
|
if ( !bstrClass ) hr = WBEM_E_OUT_OF_MEMORY;
|
|
|
|
IWbemClassObject *pClass=NULL;
|
|
IWbemClassObject *pObj=NULL;
|
|
|
|
|
|
if ( SUCCEEDED(hr) ) {
|
|
//
|
|
// create an instance of the log class
|
|
//
|
|
hr = m_pNamespace->GetObject(bstrClass, 0, pCtx, &pClass, NULL);
|
|
|
|
if ( SUCCEEDED(hr) ) {
|
|
hr = pClass->SpawnInstance(0, &pObj);
|
|
}
|
|
|
|
if ( SUCCEEDED(hr) ) {
|
|
|
|
bool bName=FALSE;
|
|
// fill in the properties of this class
|
|
hr = PutKeyProperty(pObj, pLogFilePath, (PWSTR)bstrLog, &bName, m_pRequest);
|
|
|
|
if (SUCCEEDED(hr) )
|
|
hr = PutKeyProperty(pObj, pLogArea, (PWSTR)szPodGUID, &bName, m_pRequest);
|
|
|
|
if (SUCCEEDED(hr) )
|
|
hr = PutKeyProperty(pObj, pLogFileRecord, (PWSTR)bstrRecord, &bName, m_pRequest);
|
|
|
|
if (SUCCEEDED(hr) )
|
|
hr = PutProperty(pObj, pLogErrorCode, (int)hrLog);
|
|
|
|
if ( SUCCEEDED(hr) ) {
|
|
// save this instance
|
|
hr = m_pNamespace->PutInstance( pObj, 0, pCtx, NULL );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( bstrClass ) SysFreeString(bstrClass);
|
|
if ( bstrRecord ) SysFreeString(bstrRecord);
|
|
|
|
if ( pClass ) {
|
|
pClass->Release();
|
|
}
|
|
if ( pObj ) {
|
|
pObj->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|