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.
1881 lines
54 KiB
1881 lines
54 KiB
// Product.cpp: implementation of the CProduct class.
|
|
//
|
|
// Copyright (c) 1997-2002 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "precomp.h"
|
|
#include "Product.h"
|
|
#include <wininet.h>
|
|
#include <ocidl.h>
|
|
#include "CRegCls.h"
|
|
|
|
#include <WbemTime.h>
|
|
|
|
#include <helper.h>
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CProduct::CProduct(CRequestObject *pObj, IWbemServices *pNamespace,
|
|
IWbemContext *pCtx):CGenericClass(pObj, pNamespace, pCtx)
|
|
{
|
|
|
|
}
|
|
|
|
CProduct::~CProduct()
|
|
{
|
|
|
|
}
|
|
|
|
HRESULT CProduct::CreateObject(IWbemObjectSink *pHandler, ACTIONTYPE atAction)
|
|
{
|
|
HRESULT hr = WBEM_S_NO_ERROR;
|
|
int i = -1;
|
|
WCHAR wcBuf[BUFF_SIZE];
|
|
WCHAR wcProductCode[39];
|
|
WCHAR wcTestCode[39];
|
|
DWORD dwBufsize;
|
|
bool bMatch = false;
|
|
bool bTestCode = false;
|
|
|
|
if(atAction != ACTIONTYPE_ENUM)
|
|
{
|
|
// we are doing GetObject so we need to be reinitialized
|
|
hr = WBEM_E_NOT_FOUND;
|
|
|
|
int iPos = -1;
|
|
BSTR bstrIdentifyingNumber = SysAllocString(L"IdentifyingNumber");
|
|
|
|
if ( bstrIdentifyingNumber )
|
|
{
|
|
if(FindIn(m_pRequest->m_Property, bstrIdentifyingNumber, &iPos))
|
|
{
|
|
if ( ::SysStringLen ( m_pRequest->m_Value[iPos] ) == 38 )
|
|
{
|
|
wcscpy(wcTestCode, m_pRequest->m_Value[iPos]);
|
|
bTestCode = true;
|
|
}
|
|
else
|
|
{
|
|
// we are not good to go, they have sent us longer string
|
|
SysFreeString ( bstrIdentifyingNumber );
|
|
throw hr;
|
|
}
|
|
|
|
}
|
|
|
|
SysFreeString(bstrIdentifyingNumber);
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
|
|
bool bName, bVersion = false, bIDNum, bProductHandle;
|
|
|
|
while(!bMatch && m_pRequest->Package(++i) && (hr != WBEM_E_CALL_CANCELLED))
|
|
{
|
|
// safe operation:
|
|
// Package ( i ) returns NULL ( tested above ) or valid WCHAR [39]
|
|
|
|
wcscpy(wcProductCode, m_pRequest->Package(i));
|
|
|
|
if((atAction == ACTIONTYPE_ENUM) || (bTestCode && (_wcsicmp(wcTestCode, wcProductCode) == 0)))
|
|
{
|
|
//Open our database
|
|
|
|
try
|
|
{
|
|
if ( GetView ( NULL, wcProductCode, NULL, NULL, FALSE, TRUE ) )
|
|
{
|
|
bProductHandle = true;
|
|
}
|
|
else
|
|
{
|
|
bProductHandle = false;
|
|
}
|
|
|
|
if(FAILED(hr = SpawnAnInstance(&m_pObj)))
|
|
{
|
|
throw hr;
|
|
}
|
|
|
|
dwBufsize = BUFF_SIZE;
|
|
CheckMSI(g_fpMsiGetProductInfoW(wcProductCode, INSTALLPROPERTY_PRODUCTNAME, wcBuf, &dwBufsize));
|
|
PutKeyProperty(m_pObj, pName, wcBuf, &bName, m_pRequest);
|
|
|
|
PutProperty(m_pObj, pCaption, wcBuf);
|
|
PutProperty(m_pObj, pDescription, wcBuf);
|
|
|
|
if(bProductHandle)
|
|
{
|
|
dwBufsize = BUFF_SIZE;
|
|
CheckMSI(g_fpMsiGetProductPropertyW(msidata.GetProduct(), L"Manufacturer", wcBuf, &dwBufsize));
|
|
PutProperty(m_pObj, pVendor, wcBuf);
|
|
|
|
dwBufsize = BUFF_SIZE;
|
|
CheckMSI(g_fpMsiGetProductPropertyW(msidata.GetProduct(), L"ProductVersion", wcBuf, &dwBufsize));
|
|
PutKeyProperty(m_pObj, pVersion, wcBuf, &bVersion, m_pRequest);
|
|
}
|
|
|
|
PutKeyProperty(m_pObj, pIdentifyingNumber, wcProductCode, &bIDNum, m_pRequest);
|
|
|
|
INSTALLSTATE isState = g_fpMsiQueryProductStateW(wcProductCode);
|
|
|
|
switch(isState)
|
|
{
|
|
case INSTALLSTATE_ABSENT:
|
|
break;
|
|
|
|
case INSTALLSTATE_ADVERTISED:
|
|
dwBufsize = BUFF_SIZE;
|
|
if(ERROR_SUCCESS == g_fpMsiGetProductInfoW(wcProductCode,INSTALLPROPERTY_VERSIONSTRING, wcBuf, &dwBufsize))
|
|
{
|
|
PutKeyProperty(m_pObj, pVersion, wcBuf, &bVersion, m_pRequest);
|
|
dwBufsize = BUFF_SIZE;
|
|
}
|
|
break;
|
|
|
|
case INSTALLSTATE_BADCONFIG:
|
|
break;
|
|
|
|
case INSTALLSTATE_DEFAULT:
|
|
dwBufsize = BUFF_SIZE;
|
|
if(ERROR_SUCCESS == g_fpMsiGetProductInfoW(wcProductCode,INSTALLPROPERTY_VERSIONSTRING, wcBuf, &dwBufsize))
|
|
{
|
|
PutKeyProperty(m_pObj, pVersion, wcBuf, &bVersion, m_pRequest);
|
|
}
|
|
|
|
dwBufsize = BUFF_SIZE;
|
|
if(ERROR_SUCCESS == g_fpMsiGetProductInfoW(wcProductCode,INSTALLPROPERTY_LOCALPACKAGE, wcBuf, &dwBufsize))
|
|
{
|
|
PutProperty(m_pObj, pPackageCache, wcBuf);
|
|
}
|
|
|
|
dwBufsize = BUFF_SIZE;
|
|
if(ERROR_SUCCESS == g_fpMsiGetProductInfoW(wcProductCode,INSTALLPROPERTY_INSTALLDATE, wcBuf, &dwBufsize))
|
|
{
|
|
PutProperty(m_pObj, pInstallDate, wcBuf);
|
|
|
|
if ( ( lstrlenW ( wcBuf ) + lstrlenW ( L"000000.000000+000" ) + 1 ) < BUFF_SIZE )
|
|
{
|
|
lstrcatW ( wcBuf, L"000000.000000+000" );
|
|
|
|
BSTR bstrWbemTime;
|
|
if ( ( bstrWbemTime = ::SysAllocString ( wcBuf ) ) != NULL )
|
|
{
|
|
WBEMTime time ( bstrWbemTime );
|
|
::SysFreeString ( bstrWbemTime );
|
|
|
|
if ( time.IsOk () )
|
|
{
|
|
bstrWbemTime= time.GetDMTF ( );
|
|
|
|
try
|
|
{
|
|
PutProperty( m_pObj, pInstallDate2, bstrWbemTime );
|
|
}
|
|
catch ( ... )
|
|
{
|
|
::SysFreeString ( bstrWbemTime );
|
|
throw;
|
|
}
|
|
|
|
::SysFreeString ( bstrWbemTime );
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
}
|
|
|
|
dwBufsize = BUFF_SIZE;
|
|
if(ERROR_SUCCESS == g_fpMsiGetProductInfoW(wcProductCode,INSTALLPROPERTY_INSTALLLOCATION, wcBuf, &dwBufsize))
|
|
{
|
|
PutProperty(m_pObj, pInstallLocation, wcBuf);
|
|
}
|
|
break;
|
|
|
|
case INSTALLSTATE_INVALIDARG:
|
|
break;
|
|
|
|
case INSTALLSTATE_UNKNOWN:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
PutProperty(m_pObj, pInstallState, (int)isState);
|
|
|
|
if(bName && bVersion && bIDNum)
|
|
{
|
|
bMatch = true;
|
|
}
|
|
|
|
if((atAction != ACTIONTYPE_GET) || bMatch)
|
|
{
|
|
hr = pHandler->Indicate(1, &m_pObj);
|
|
}
|
|
|
|
m_pObj->Release();
|
|
m_pObj = NULL;
|
|
}
|
|
catch(...)
|
|
{
|
|
msidata.CloseProduct ();
|
|
|
|
if(m_pObj)
|
|
{
|
|
m_pObj->Release();
|
|
m_pObj = NULL;
|
|
}
|
|
|
|
throw;
|
|
}
|
|
|
|
msidata.CloseProduct ();
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CProduct::Admin(CRequestObject *pReqObj, IWbemClassObject *pInParams,
|
|
IWbemObjectSink *pHandler, IWbemContext *pCtx)
|
|
{
|
|
HRESULT hrReturn = WBEM_S_NO_ERROR;
|
|
BSTR bstrPackage = NULL;
|
|
BSTR bstrTarget = NULL;
|
|
BSTR bstrOptions = NULL;
|
|
UINT uiStatus = 1603;
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
if(!bstrReturnValue) throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
|
|
BSTR bstrInstall = SysAllocString(L"Install");
|
|
if(!bstrInstall)
|
|
{
|
|
::SysFreeString (bstrReturnValue);
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
IWbemClassObject *pClass = NULL;
|
|
IWbemClassObject *pOutClass = NULL;
|
|
IWbemClassObject *pOutParams = NULL;
|
|
VARIANT v;
|
|
|
|
m_pRequest = pReqObj;
|
|
|
|
LPWSTR wcOptions = NULL;
|
|
DWORD dwOptions = BUFF_SIZE;
|
|
|
|
try
|
|
{
|
|
if ( ( wcOptions = new WCHAR [ dwOptions ] ) == NULL )
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
throw;
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = m_pRequest->m_pNamespace->GetObject(m_pRequest->m_bstrClass,
|
|
0, pCtx, &pClass, NULL))){
|
|
|
|
if(SUCCEEDED(hrReturn = pClass->GetMethod(bstrInstall, 0, NULL, &pOutClass))){
|
|
|
|
if(SUCCEEDED(hrReturn = pOutClass->SpawnInstance(0, &pOutParams))){
|
|
|
|
//Get PackageLocation
|
|
if(SUCCEEDED(GetProperty(pInParams, "PackageLocation", &bstrPackage))){
|
|
|
|
OnDelete < BSTR, void ( * ) ( BSTR ), SysFreeString > del_bstrPackage ( bstrPackage ) ;
|
|
|
|
if((wcscmp(bstrPackage, L"") != 0) && (wcslen(bstrPackage) <= INTERNET_MAX_PATH_LENGTH)){
|
|
|
|
//Get Options
|
|
if(SUCCEEDED(GetProperty(pInParams, "TargetLocation", &bstrTarget))){
|
|
|
|
OnDelete < BSTR, void ( * ) ( BSTR ), SysFreeString > del_bstrTarget ( bstrTarget ) ;
|
|
|
|
//Get Options
|
|
if(SUCCEEDED(GetProperty(pInParams, "Options", &bstrOptions)))
|
|
{
|
|
OnDelete < BSTR, void ( * ) ( BSTR ), SysFreeString > del_bstrOptions ( bstrOptions ) ;
|
|
|
|
// safe operation
|
|
wcscpy(wcOptions, L"ACTION=ADMIN");
|
|
|
|
if((wcscmp(bstrTarget, L"") != 0))
|
|
{
|
|
if ( wcslen ( wcOptions ) + wcslen ( L" TARGETDIR=") + wcslen ( bstrTarget ) + 1 < dwOptions )
|
|
{
|
|
wcscat(wcOptions, L" TARGETDIR=");
|
|
wcscat(wcOptions, bstrTarget);
|
|
}
|
|
else
|
|
{
|
|
LPWSTR wsz = NULL;
|
|
|
|
try
|
|
{
|
|
if ( ( wsz = new WCHAR [ wcslen ( wcOptions ) + wcslen ( L" TARGETDIR=") + wcslen ( bstrTarget ) + 1 ] ) != NULL )
|
|
{
|
|
wcscpy(wsz, wcOptions);
|
|
wcscat(wsz, L" TARGETDIR=");
|
|
wcscat(wsz, bstrTarget);
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
wcOptions = wsz;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wsz )
|
|
{
|
|
delete [] wsz;
|
|
wsz = NULL;
|
|
}
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
}
|
|
|
|
if((wcscmp(bstrOptions, L"") != 0))
|
|
{
|
|
if ( wcslen ( wcOptions ) + wcslen ( L" ") + wcslen ( bstrOptions ) + 1 < dwOptions )
|
|
{
|
|
wcscat(wcOptions, L" ");
|
|
wcscat(wcOptions, bstrOptions);
|
|
}
|
|
else
|
|
{
|
|
LPWSTR wsz = NULL;
|
|
|
|
try
|
|
{
|
|
if ( ( wsz = new WCHAR [ wcslen ( wcOptions ) + wcslen ( L" ") + wcslen ( bstrOptions ) + 1 ] ) != NULL )
|
|
{
|
|
wcscpy(wsz, wcOptions);
|
|
wcscat(wsz, L" ");
|
|
wcscat(wsz, bstrOptions);
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
wcOptions = wsz;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wsz )
|
|
{
|
|
delete [] wsz;
|
|
wsz = NULL;
|
|
}
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(hrReturn == WBEM_S_NO_ERROR){
|
|
|
|
if(!IsNT4()){
|
|
|
|
if ( msidata.Lock () )
|
|
{
|
|
INSTALLUI_HANDLER ui = NULL;
|
|
|
|
//Set UI Level w/ event callback
|
|
ui = SetupExternalUI ( );
|
|
|
|
try
|
|
{
|
|
//Call Installer
|
|
uiStatus = g_fpMsiInstallProductW(bstrPackage, wcOptions);
|
|
}
|
|
catch(...)
|
|
{
|
|
uiStatus = static_cast < UINT > ( RPC_E_SERVERFAULT );
|
|
}
|
|
|
|
//Restore UI Level w/ event callback
|
|
RestoreExternalUI ( ui );
|
|
|
|
msidata. Unlock();
|
|
}
|
|
|
|
}else{
|
|
|
|
/////////////////
|
|
// NT4 fix code....
|
|
|
|
try{
|
|
|
|
WCHAR wcAction[20];
|
|
wcscpy(wcAction, L"/admin");
|
|
|
|
LPWSTR wcCommandLine = NULL;
|
|
|
|
try
|
|
{
|
|
if ( ( wcCommandLine = new WCHAR [ wcslen ( bstrPackage ) + 1 + wcslen ( wcOptions ) + 1 ] ) != NULL )
|
|
{
|
|
wcscpy(wcCommandLine, bstrPackage);
|
|
wcscat(wcCommandLine, L" ");
|
|
wcscat(wcCommandLine, wcOptions);
|
|
|
|
hrReturn = LaunchProcess(wcAction, wcCommandLine, &uiStatus);
|
|
|
|
delete [] wcCommandLine;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcCommandLine )
|
|
{
|
|
delete [] wcCommandLine;
|
|
wcCommandLine = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
|
|
}catch(...){
|
|
|
|
hrReturn = WBEM_E_FAILED;
|
|
}
|
|
|
|
////////////////////
|
|
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn)){
|
|
|
|
//Set up ReturnValue
|
|
VariantInit(&v);
|
|
V_VT(&v) = VT_I4;
|
|
V_I4(&v) = uiStatus;
|
|
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
|
|
if(!bstrReturnValue)
|
|
{
|
|
delete [] wcOptions;
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = pOutParams->Put(bstrReturnValue, 0,
|
|
&v, NULL)))
|
|
pHandler->Indicate(1, &pOutParams);
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
}
|
|
}
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
}else hrReturn = WBEM_E_INVALID_PARAMETER;
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
pOutParams->Release();
|
|
}
|
|
pOutClass->Release();
|
|
}
|
|
pClass->Release();
|
|
}
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
SysFreeString(bstrInstall);
|
|
|
|
return hrReturn;
|
|
}
|
|
|
|
HRESULT CProduct::Advertise(CRequestObject *pReqObj, IWbemClassObject *pInParams,
|
|
IWbemObjectSink *pHandler, IWbemContext *pCtx)
|
|
{
|
|
HRESULT hrReturn = WBEM_S_NO_ERROR;
|
|
BSTR bstrPackage = NULL;
|
|
BSTR wcBuf = NULL;
|
|
UINT uiStatus = 1603;
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
if(!bstrReturnValue) throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
|
|
BSTR bstrAdvertise = SysAllocString(L"Advertise");
|
|
if(!bstrAdvertise)
|
|
{
|
|
::SysFreeString (bstrReturnValue);
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
IWbemClassObject *pClass = NULL;
|
|
IWbemClassObject *pOutClass = NULL;
|
|
IWbemClassObject *pOutParams = NULL;
|
|
VARIANT v;
|
|
|
|
m_pRequest = pReqObj;
|
|
|
|
LPWSTR wcOptions = NULL;
|
|
DWORD dwOptions = BUFF_SIZE;
|
|
|
|
try
|
|
{
|
|
if ( ( wcOptions = new WCHAR [ dwOptions ] ) == NULL )
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
throw;
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = m_pRequest->m_pNamespace->GetObject(m_pRequest->m_bstrClass,
|
|
0, pCtx, &pClass, NULL))){
|
|
|
|
if(SUCCEEDED(hrReturn = pClass->GetMethod(bstrAdvertise, 0, NULL, &pOutClass))){
|
|
|
|
if(SUCCEEDED(hrReturn = pOutClass->SpawnInstance(0, &pOutParams))){
|
|
|
|
//Get PackageLocation
|
|
if(SUCCEEDED(GetProperty(pInParams, "PackageLocation", &bstrPackage))){
|
|
|
|
OnDelete < BSTR, void ( * ) ( BSTR ), SysFreeString > del_bstrPackage ( bstrPackage ) ;
|
|
|
|
if((wcscmp(bstrPackage, L"") != 0) && (wcslen(bstrPackage) <= INTERNET_MAX_PATH_LENGTH)){
|
|
|
|
//Get Options
|
|
if ( SUCCEEDED ( GetProperty ( pInParams, "Options", &wcBuf ) ) )
|
|
{
|
|
OnDelete < BSTR, void ( * ) ( BSTR ), SysFreeString > del_wcBuf ( wcBuf ) ;
|
|
|
|
//Make sure we perform an advertisement
|
|
wcscpy(wcOptions, L"ACTION=ADVERTISE ALLUSERS=1");
|
|
|
|
if( wcBuf && wcscmp ( wcBuf, L"" ) != 0 )
|
|
{
|
|
if ( wcslen ( wcOptions ) + wcslen ( L" ") + SysStringLen ( wcBuf ) + 1 < dwOptions )
|
|
{
|
|
wcscat(wcOptions, L" ");
|
|
wcscat(wcOptions, wcBuf);
|
|
}
|
|
else
|
|
{
|
|
LPWSTR wsz = NULL;
|
|
|
|
try
|
|
{
|
|
if ( ( wsz = new WCHAR [ wcslen ( wcOptions ) + wcslen ( L" ") + SysStringLen ( wcBuf ) + 1 ] ) != NULL )
|
|
{
|
|
wcscpy(wsz, wcOptions);
|
|
wcscat(wsz, L" ");
|
|
wcscat(wsz, wcBuf);
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
wcOptions = wsz;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wsz )
|
|
{
|
|
delete [] wsz;
|
|
wsz = NULL;
|
|
}
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(hrReturn == WBEM_S_NO_ERROR){
|
|
|
|
if(!IsNT4()){
|
|
|
|
if ( msidata.Lock () )
|
|
{
|
|
INSTALLUI_HANDLER ui = NULL;
|
|
|
|
//Set UI Level w/ event callback
|
|
ui = SetupExternalUI ( );
|
|
|
|
try
|
|
{
|
|
//Call Installer
|
|
uiStatus = g_fpMsiInstallProductW(bstrPackage, wcOptions);
|
|
}
|
|
catch(...)
|
|
{
|
|
uiStatus = static_cast < UINT > ( RPC_E_SERVERFAULT );
|
|
}
|
|
|
|
//Restore UI Level w/ event callback
|
|
RestoreExternalUI ( ui );
|
|
|
|
msidata. Unlock();
|
|
}
|
|
|
|
}else{
|
|
|
|
/////////////////
|
|
// NT4 fix code....
|
|
|
|
try{
|
|
|
|
WCHAR wcAction[20];
|
|
wcscpy(wcAction, L"/advertise");
|
|
|
|
LPWSTR wcCommandLine = NULL;
|
|
|
|
try
|
|
{
|
|
if ( ( wcCommandLine = new WCHAR [ wcslen ( bstrPackage ) + 1 + wcslen ( wcOptions ) + 1 ] ) != NULL )
|
|
{
|
|
wcscpy(wcCommandLine, bstrPackage);
|
|
wcscat(wcCommandLine, L" ");
|
|
wcscat(wcCommandLine, wcOptions);
|
|
|
|
hrReturn = LaunchProcess(wcAction, wcCommandLine, &uiStatus);
|
|
|
|
delete [] wcCommandLine;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcCommandLine )
|
|
{
|
|
delete [] wcCommandLine;
|
|
wcCommandLine = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
|
|
}catch(...){
|
|
|
|
hrReturn = WBEM_E_FAILED;
|
|
}
|
|
|
|
////////////////////
|
|
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn)){
|
|
|
|
//Set up ReturnValue
|
|
VariantInit(&v);
|
|
V_VT(&v) = VT_I4;
|
|
V_I4(&v) = uiStatus;
|
|
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
|
|
if(!bstrReturnValue)
|
|
{
|
|
delete [] wcOptions;
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = pOutParams->Put(bstrReturnValue, 0,
|
|
&v, NULL)))
|
|
pHandler->Indicate(1, &pOutParams);
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
}
|
|
}
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
}else hrReturn = WBEM_E_INVALID_PARAMETER;
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
pOutParams->Release();
|
|
}
|
|
pOutClass->Release();
|
|
}
|
|
pClass->Release();
|
|
}
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
SysFreeString(bstrAdvertise);
|
|
|
|
return hrReturn;
|
|
}
|
|
|
|
HRESULT CProduct::Configure(CRequestObject *pReqObj, IWbemClassObject *pInParams,
|
|
IWbemObjectSink *pHandler, IWbemContext *pCtx)
|
|
{
|
|
HRESULT hrReturn = WBEM_S_NO_ERROR;
|
|
int iState, iLevel;
|
|
UINT uiStatus = 1603;
|
|
WCHAR wcCode[BUFF_SIZE];
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
if(!bstrReturnValue) throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
|
|
BSTR bstrConfigure = SysAllocString(L"Configure");
|
|
if(!bstrConfigure)
|
|
{
|
|
::SysFreeString (bstrReturnValue);
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
IWbemClassObject *pClass = NULL;
|
|
IWbemClassObject *pOutClass = NULL;
|
|
IWbemClassObject *pOutParams = NULL;
|
|
VARIANT v;
|
|
INSTALLSTATE isState;
|
|
int i = -1;
|
|
bool bFoundCode = false;
|
|
|
|
m_pRequest = pReqObj;
|
|
|
|
LPWSTR wcOptions = NULL;
|
|
DWORD dwOptions = BUFF_SIZE;
|
|
|
|
try
|
|
{
|
|
if ( ( wcOptions = new WCHAR [ dwOptions ] ) == NULL )
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
throw;
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = m_pRequest->m_pNamespace->GetObject(m_pRequest->m_bstrClass,
|
|
0, pCtx, &pClass, NULL))){
|
|
|
|
if(SUCCEEDED(hrReturn = pClass->GetMethod(bstrConfigure, 0, NULL, &pOutClass))){
|
|
|
|
if(SUCCEEDED(hrReturn = pOutClass->SpawnInstance(0, &pOutParams))){
|
|
|
|
//Get PackageLocation
|
|
if(SUCCEEDED(GetProperty(pInParams, "InstallState", &iState))){
|
|
|
|
//Get Options
|
|
if(SUCCEEDED(GetProperty(pInParams, "InstallLevel", &iLevel))){
|
|
|
|
//Get the Product Code
|
|
while(pReqObj->m_Property[++i]){
|
|
|
|
if(wcscmp(pReqObj->m_Property[i], L"IdentifyingNumber") == 0)
|
|
{
|
|
if ( wcslen ( pReqObj->m_Value[i] ) < BUFF_SIZE )
|
|
{
|
|
wcscpy(wcCode, pReqObj->m_Value[i]);
|
|
bFoundCode = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(bFoundCode){
|
|
|
|
//Get the appropriate State
|
|
switch(iState){
|
|
case 1:
|
|
isState = INSTALLSTATE_DEFAULT;
|
|
break;
|
|
case 2:
|
|
isState = INSTALLSTATE_LOCAL;
|
|
break;
|
|
case 3:
|
|
isState = INSTALLSTATE_SOURCE;
|
|
break;
|
|
default:
|
|
isState = INSTALLSTATE_NOTUSED;
|
|
break;
|
|
}
|
|
|
|
//Get the appropriate Level
|
|
switch(iLevel){
|
|
case 1:
|
|
iLevel = INSTALLLEVEL_DEFAULT;
|
|
break;
|
|
case 2:
|
|
iLevel = INSTALLLEVEL_MINIMUM;
|
|
break;
|
|
case 3:
|
|
iLevel = INSTALLLEVEL_MAXIMUM;
|
|
break;
|
|
default:
|
|
iLevel = -123;
|
|
break;
|
|
}
|
|
|
|
//If everything is valid, proceed
|
|
if((isState != INSTALLSTATE_NOTUSED) && (iLevel != -123) &&
|
|
(hrReturn == WBEM_S_NO_ERROR)){
|
|
|
|
if(!IsNT4()){
|
|
|
|
if ( msidata.Lock () )
|
|
{
|
|
INSTALLUI_HANDLER ui = NULL;
|
|
|
|
//Set UI Level w/ event callback
|
|
ui = SetupExternalUI ( );
|
|
|
|
try
|
|
{
|
|
//Call Installer
|
|
uiStatus = g_fpMsiConfigureProductW(wcCode, iLevel, isState);
|
|
}
|
|
catch(...)
|
|
{
|
|
uiStatus = static_cast < UINT > ( RPC_E_SERVERFAULT );
|
|
}
|
|
|
|
//Restore UI Level w/ event callback
|
|
RestoreExternalUI ( ui );
|
|
|
|
msidata. Unlock();
|
|
}
|
|
|
|
}else{
|
|
|
|
/////////////////
|
|
// NT4 fix code....
|
|
|
|
try{
|
|
|
|
WCHAR wcAction[20];
|
|
wcscpy(wcAction, L"/configure");
|
|
|
|
LPWSTR wcCommandLine = NULL;
|
|
|
|
WCHAR wcTmp1[100];
|
|
WCHAR wcTmp2[100];
|
|
|
|
_itow((int)iLevel, wcTmp1, 10);
|
|
_itow((int)isState, wcTmp2, 10);
|
|
|
|
try
|
|
{
|
|
if ( ( wcCommandLine = new WCHAR [ wcslen ( wcCode ) + wcslen ( wcTmp1 ) + wcslen ( wcTmp2 ) + 3 ] ) != NULL )
|
|
{
|
|
wcscpy(wcCommandLine, wcCode);
|
|
wcscat(wcCommandLine, L" ");
|
|
wcscpy(wcCommandLine, wcTmp1);
|
|
wcscat(wcCommandLine, L" ");
|
|
wcscat(wcCommandLine, wcTmp2);
|
|
|
|
hrReturn = LaunchProcess(wcAction, wcCommandLine, &uiStatus);
|
|
|
|
delete [] wcCommandLine;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcCommandLine )
|
|
{
|
|
delete [] wcCommandLine;
|
|
wcCommandLine = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
|
|
}catch(...){
|
|
|
|
hrReturn = WBEM_E_FAILED;
|
|
}
|
|
|
|
////////////////////
|
|
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn)){
|
|
|
|
//Set up ReturnValue
|
|
VariantInit(&v);
|
|
V_VT(&v) = VT_I4;
|
|
V_I4(&v) = uiStatus;
|
|
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
|
|
if(!bstrReturnValue)
|
|
{
|
|
delete [] wcOptions;
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = pOutParams->Put(bstrReturnValue, 0,
|
|
&v, NULL)))
|
|
pHandler->Indicate(1, &pOutParams);
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
}
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
}else hrReturn = WBEM_E_FAILED;
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
pOutParams->Release();
|
|
|
|
}else return WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
pOutClass->Release();
|
|
}
|
|
|
|
pClass->Release();
|
|
}
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
SysFreeString(bstrConfigure);
|
|
|
|
return hrReturn;
|
|
}
|
|
|
|
HRESULT CProduct::Install(CRequestObject *pReqObj, IWbemClassObject *pInParams,
|
|
IWbemObjectSink *pHandler, IWbemContext *pCtx)
|
|
{
|
|
HRESULT hrReturn = WBEM_S_NO_ERROR;
|
|
BSTR bstrPackage = NULL;
|
|
BSTR wcBuf = NULL;
|
|
UINT uiStatus = 1603;
|
|
CHeap_Exception he(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
|
|
IWbemClassObject *pClass = NULL;
|
|
IWbemClassObject *pOutClass = NULL;
|
|
IWbemClassObject *pOutParams = NULL;
|
|
VARIANT v;
|
|
|
|
m_pRequest = pReqObj;
|
|
|
|
LPWSTR wcOptions = NULL;
|
|
DWORD dwOptions = BUFF_SIZE;
|
|
|
|
try
|
|
{
|
|
if ( ( wcOptions = new WCHAR [ dwOptions ] ) == NULL )
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
throw;
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = m_pRequest->m_pNamespace->GetObject(m_pRequest->m_bstrClass,
|
|
0, pCtx, &pClass, NULL))){
|
|
|
|
BSTR bstrInstall = SysAllocString(L"Install");
|
|
if(!bstrInstall)
|
|
{
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
throw he;
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = pClass->GetMethod(bstrInstall, 0, NULL, &pOutClass))){
|
|
|
|
pClass->Release();
|
|
SysFreeString(bstrInstall);
|
|
|
|
if(SUCCEEDED(hrReturn = pOutClass->SpawnInstance(0, &pOutParams))){
|
|
|
|
pOutClass->Release();
|
|
|
|
//Get PackageLocation
|
|
if(SUCCEEDED(hrReturn = GetProperty(pInParams, "PackageLocation", &bstrPackage))){
|
|
|
|
OnDelete < BSTR, void ( * ) ( BSTR ), SysFreeString > del_bstrPackage ( bstrPackage ) ;
|
|
|
|
if((wcscmp(bstrPackage, L"") != 0) &&
|
|
(wcslen(bstrPackage) <= INTERNET_MAX_PATH_LENGTH)){
|
|
|
|
//Get Options
|
|
if ( SUCCEEDED ( hrReturn = GetProperty ( pInParams, "Options", &wcBuf ) ) )
|
|
{
|
|
OnDelete < BSTR, void ( * ) ( BSTR ), SysFreeString > del_wcBuf ( wcBuf ) ;
|
|
|
|
//Make sure we perform an advertisement
|
|
wcscpy(wcOptions, L"ACTION=INSTALL ALLUSERS=1");
|
|
|
|
if( wcBuf && wcscmp ( wcBuf, L"" ) != 0 )
|
|
{
|
|
if ( wcslen ( wcOptions ) + wcslen ( L" ") + SysStringLen ( wcBuf ) + 1 < dwOptions )
|
|
{
|
|
wcscat(wcOptions, L" ");
|
|
wcscat(wcOptions, wcBuf);
|
|
}
|
|
else
|
|
{
|
|
LPWSTR wsz = NULL;
|
|
|
|
try
|
|
{
|
|
if ( ( wsz = new WCHAR [ wcslen ( wcOptions ) + wcslen ( L" ") + SysStringLen ( wcBuf ) + 1 ] ) != NULL )
|
|
{
|
|
wcscpy(wsz, wcOptions);
|
|
wcscat(wsz, L" ");
|
|
wcscat(wsz, wcBuf);
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
wcOptions = wsz;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wsz )
|
|
{
|
|
delete [] wsz;
|
|
wsz = NULL;
|
|
}
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(hrReturn == WBEM_S_NO_ERROR){
|
|
|
|
//We want to call MSI ourselves unless we are on NT4
|
|
// and dealing with a user install.
|
|
if(!IsNT4()){
|
|
|
|
if ( msidata.Lock () )
|
|
{
|
|
INSTALLUI_HANDLER ui = NULL;
|
|
|
|
//Set UI Level w/ event callback
|
|
ui = SetupExternalUI ( );
|
|
|
|
try
|
|
{
|
|
//Call Installer
|
|
uiStatus = g_fpMsiInstallProductW(bstrPackage, wcOptions);
|
|
}
|
|
catch(...)
|
|
{
|
|
uiStatus = static_cast < UINT > ( RPC_E_SERVERFAULT );
|
|
}
|
|
|
|
//Restore UI Level w/ event callback
|
|
RestoreExternalUI ( ui );
|
|
|
|
msidata. Unlock();
|
|
}
|
|
|
|
}else{
|
|
|
|
/////////////////
|
|
// NT4 fix code....
|
|
|
|
try{
|
|
|
|
WCHAR wcAction[20];
|
|
wcscpy(wcAction, L"/install");
|
|
LPWSTR wcCommandLine = NULL;
|
|
|
|
try
|
|
{
|
|
if ( ( wcCommandLine = new WCHAR [ wcslen ( bstrPackage ) + 1 + wcslen ( wcOptions ) + 1 ] ) != NULL )
|
|
{
|
|
wcscpy(wcCommandLine, bstrPackage);
|
|
wcscat(wcCommandLine, L" ");
|
|
wcscat(wcCommandLine, wcOptions);
|
|
|
|
hrReturn = LaunchProcess(wcAction, wcCommandLine, &uiStatus);
|
|
|
|
delete [] wcCommandLine;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcCommandLine )
|
|
{
|
|
delete [] wcCommandLine;
|
|
wcCommandLine = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
|
|
}catch(...){
|
|
|
|
hrReturn = WBEM_E_FAILED;
|
|
}
|
|
|
|
////////////////////
|
|
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn)){
|
|
|
|
//Set up ReturnValue
|
|
VariantInit(&v);
|
|
V_VT(&v) = VT_I4;
|
|
V_I4(&v) = uiStatus;
|
|
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
|
|
if(!bstrReturnValue)
|
|
{
|
|
delete [] wcOptions;
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = pOutParams->Put(bstrReturnValue, 0,
|
|
&v, NULL)))
|
|
pHandler->Indicate(1, &pOutParams);
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
}
|
|
}
|
|
}
|
|
}else
|
|
hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
}
|
|
|
|
pOutParams->Release();
|
|
|
|
}else
|
|
pOutClass->Release();
|
|
|
|
}else{
|
|
|
|
pClass->Release();
|
|
SysFreeString(bstrInstall);
|
|
}
|
|
}
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
return hrReturn;
|
|
}
|
|
|
|
HRESULT CProduct::Reinstall(CRequestObject *pReqObj, IWbemClassObject *pInParams,
|
|
IWbemObjectSink *pHandler, IWbemContext *pCtx)
|
|
{
|
|
HRESULT hrReturn = WBEM_S_NO_ERROR;
|
|
int iMode;
|
|
UINT uiStatus = 1603;
|
|
WCHAR wcCode[BUFF_SIZE];
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
if(!bstrReturnValue) throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
|
|
BSTR bstrReinstall = SysAllocString(L"Reinstall");
|
|
if(!bstrReinstall)
|
|
{
|
|
::SysFreeString (bstrReturnValue);
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
IWbemClassObject *pClass = NULL;
|
|
IWbemClassObject *pOutClass = NULL;
|
|
IWbemClassObject *pOutParams = NULL;
|
|
VARIANT v;
|
|
DWORD dwMode;
|
|
int i = -1;
|
|
bool bFoundCode = false;
|
|
|
|
m_pRequest = pReqObj;
|
|
|
|
LPWSTR wcOptions = NULL;
|
|
DWORD dwOptions = BUFF_SIZE;
|
|
|
|
try
|
|
{
|
|
if ( ( wcOptions = new WCHAR [ dwOptions ] ) == NULL )
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
throw;
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = m_pRequest->m_pNamespace->GetObject(m_pRequest->m_bstrClass,
|
|
0, pCtx, &pClass, NULL))){
|
|
if(SUCCEEDED(hrReturn = pClass->GetMethod(bstrReinstall, 0, NULL, &pOutClass))){
|
|
if(SUCCEEDED(hrReturn = pOutClass->SpawnInstance(0, &pOutParams))){
|
|
//Get Reinstall Mode
|
|
if(SUCCEEDED(GetProperty(pInParams, "ReinstallMode", &iMode))){
|
|
|
|
//Get the Product Code
|
|
while(pReqObj->m_Property[++i])
|
|
{
|
|
if(wcscmp(pReqObj->m_Property[i], L"IdentifyingNumber") == 0)
|
|
{
|
|
if ( wcslen ( pReqObj->m_Value[i] ) < BUFF_SIZE )
|
|
{
|
|
wcscpy(wcCode, pReqObj->m_Value[i]);
|
|
bFoundCode = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(bFoundCode){
|
|
//Get the appropriate ReinstallMode
|
|
switch(iMode){
|
|
case 1:
|
|
dwMode = REINSTALLMODE_FILEMISSING;
|
|
break;
|
|
case 2:
|
|
dwMode = REINSTALLMODE_FILEOLDERVERSION;
|
|
break;
|
|
case 3:
|
|
dwMode = REINSTALLMODE_FILEEQUALVERSION;
|
|
break;
|
|
case 4:
|
|
dwMode = REINSTALLMODE_FILEEXACT;
|
|
break;
|
|
case 5:
|
|
dwMode = REINSTALLMODE_FILEVERIFY;
|
|
break;
|
|
case 6:
|
|
dwMode = REINSTALLMODE_FILEREPLACE;
|
|
break;
|
|
case 7:
|
|
dwMode = REINSTALLMODE_USERDATA;
|
|
break;
|
|
case 8:
|
|
dwMode = REINSTALLMODE_MACHINEDATA;
|
|
break;
|
|
case 9:
|
|
dwMode = REINSTALLMODE_SHORTCUT;
|
|
break;
|
|
case 10:
|
|
dwMode = REINSTALLMODE_PACKAGE;
|
|
break;
|
|
default:
|
|
dwMode = NULL;
|
|
break;
|
|
}
|
|
|
|
//If everything is valid, proceed
|
|
if ( dwMode && hrReturn == WBEM_S_NO_ERROR )
|
|
{
|
|
if(!IsNT4()){
|
|
|
|
if ( msidata.Lock () )
|
|
{
|
|
INSTALLUI_HANDLER ui = NULL;
|
|
|
|
//Set UI Level w/ event callback
|
|
ui = SetupExternalUI ( );
|
|
|
|
try
|
|
{
|
|
//Call Installer
|
|
uiStatus = g_fpMsiReinstallProductW(wcCode, dwMode);
|
|
}
|
|
catch(...)
|
|
{
|
|
uiStatus = static_cast < UINT > ( RPC_E_SERVERFAULT );
|
|
}
|
|
|
|
//Restore UI Level w/ event callback
|
|
RestoreExternalUI ( ui );
|
|
|
|
msidata. Unlock();
|
|
}
|
|
|
|
}else{
|
|
|
|
/////////////////
|
|
// NT4 fix code....
|
|
|
|
try{
|
|
|
|
WCHAR wcAction[20];
|
|
wcscpy(wcAction, L"/reinstall");
|
|
|
|
WCHAR wcTmp[100];
|
|
_itow((int)dwMode, wcTmp, 10);
|
|
|
|
LPWSTR wcCommandLine = NULL;
|
|
|
|
try
|
|
{
|
|
if ( ( wcCommandLine = new WCHAR [ wcslen ( wcCode ) + 1 + wcslen ( wcTmp ) + 1 ] ) != NULL )
|
|
{
|
|
wcscpy(wcCommandLine, wcCode);
|
|
wcscat(wcCommandLine, L" ");
|
|
wcscat(wcCommandLine, wcTmp);
|
|
|
|
hrReturn = LaunchProcess(wcAction, wcCommandLine, &uiStatus);
|
|
|
|
delete [] wcCommandLine;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcCommandLine )
|
|
{
|
|
delete [] wcCommandLine;
|
|
wcCommandLine = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
|
|
}catch(...){
|
|
|
|
hrReturn = WBEM_E_FAILED;
|
|
}
|
|
|
|
////////////////////
|
|
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn)){
|
|
|
|
//Set up ReturnValue
|
|
VariantInit(&v);
|
|
V_VT(&v) = VT_I4;
|
|
V_I4(&v) = uiStatus;
|
|
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
|
|
if(!bstrReturnValue)
|
|
{
|
|
delete [] wcOptions;
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = pOutParams->Put(bstrReturnValue, 0,
|
|
&v, NULL)))
|
|
pHandler->Indicate(1, &pOutParams);
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
}
|
|
|
|
}else return WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
}else hrReturn = WBEM_E_FAILED;
|
|
|
|
pOutParams->Release();
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
pOutClass->Release();
|
|
}
|
|
|
|
pClass->Release();
|
|
}
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
SysFreeString(bstrReinstall);
|
|
|
|
return hrReturn;
|
|
}
|
|
|
|
HRESULT CProduct::Uninstall(CRequestObject *pReqObj, IWbemClassObject *pInParams,
|
|
IWbemObjectSink *pHandler, IWbemContext *pCtx)
|
|
{
|
|
HRESULT hrReturn = WBEM_S_NO_ERROR;
|
|
UINT uiStatus = 1603;
|
|
WCHAR wcCode[BUFF_SIZE];
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
if(!bstrReturnValue) throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
|
|
BSTR bstrConfigure = SysAllocString(L"Configure");
|
|
if(!bstrConfigure)
|
|
{
|
|
::SysFreeString (bstrReturnValue);
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
IWbemClassObject *pClass = NULL;
|
|
IWbemClassObject *pOutClass = NULL;
|
|
IWbemClassObject *pOutParams = NULL;
|
|
VARIANT v;
|
|
int i = -1;
|
|
bool bFoundCode = false;
|
|
|
|
m_pRequest = pReqObj;
|
|
|
|
LPWSTR wcOptions = NULL;
|
|
DWORD dwOptions = BUFF_SIZE;
|
|
|
|
try
|
|
{
|
|
if ( ( wcOptions = new WCHAR [ dwOptions ] ) == NULL )
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
throw;
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = m_pRequest->m_pNamespace->GetObject(m_pRequest->m_bstrClass,
|
|
0, pCtx, &pClass, NULL))){
|
|
|
|
if(SUCCEEDED(hrReturn = pClass->GetMethod(bstrConfigure, 0, NULL, &pOutClass))){
|
|
|
|
if(SUCCEEDED(hrReturn = pOutClass->SpawnInstance(0, &pOutParams))){
|
|
|
|
//Get the Product Code
|
|
while(pReqObj->m_Property[++i])
|
|
{
|
|
if(wcscmp(pReqObj->m_Property[i], L"IdentifyingNumber") == 0)
|
|
{
|
|
if ( wcslen ( pReqObj->m_Value[i] ) < BUFF_SIZE )
|
|
{
|
|
wcscpy(wcCode, pReqObj->m_Value[i]);
|
|
bFoundCode = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(bFoundCode){
|
|
//If everything is valid, proceed
|
|
if(hrReturn == WBEM_S_NO_ERROR){
|
|
|
|
if(!IsNT4()){
|
|
|
|
if ( msidata.Lock () )
|
|
{
|
|
INSTALLUI_HANDLER ui = NULL;
|
|
|
|
//Set UI Level w/ event callback
|
|
ui = SetupExternalUI ( );
|
|
|
|
try
|
|
{
|
|
//Call Installer
|
|
uiStatus = g_fpMsiConfigureProductW(wcCode, INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT);
|
|
}
|
|
catch(...)
|
|
{
|
|
uiStatus = static_cast < UINT > ( RPC_E_SERVERFAULT );
|
|
}
|
|
|
|
//Restore UI Level w/ event callback
|
|
RestoreExternalUI ( ui );
|
|
|
|
msidata. Unlock();
|
|
}
|
|
|
|
}else{
|
|
|
|
/////////////////
|
|
// NT4 fix code....
|
|
|
|
try{
|
|
|
|
WCHAR wcAction[20];
|
|
wcscpy(wcAction, L"/uninstall");
|
|
|
|
LPWSTR wcCommandLine = NULL;
|
|
|
|
try
|
|
{
|
|
if ( ( wcCommandLine = new WCHAR [ wcslen ( wcCode ) + 1 ] ) != NULL )
|
|
{
|
|
wcscpy(wcCommandLine, wcCode);
|
|
hrReturn = LaunchProcess(wcAction, wcCommandLine, &uiStatus);
|
|
|
|
delete [] wcCommandLine;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcCommandLine )
|
|
{
|
|
delete [] wcCommandLine;
|
|
wcCommandLine = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
|
|
}catch(...){
|
|
|
|
hrReturn = WBEM_E_FAILED;
|
|
}
|
|
|
|
////////////////////
|
|
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn)){
|
|
|
|
//Set up ReturnValue
|
|
VariantInit(&v);
|
|
V_VT(&v) = VT_I4;
|
|
V_I4(&v) = uiStatus;
|
|
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
|
|
if(!bstrReturnValue)
|
|
{
|
|
delete [] wcOptions;
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn = pOutParams->Put(bstrReturnValue, 0,
|
|
&v, NULL)))
|
|
pHandler->Indicate(1, &pOutParams);
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
}
|
|
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
}else hrReturn = WBEM_E_FAILED;
|
|
|
|
pOutParams->Release();
|
|
}else hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
pOutClass->Release();
|
|
}
|
|
|
|
pClass->Release();
|
|
}
|
|
|
|
if ( wcOptions )
|
|
{
|
|
delete [] wcOptions;
|
|
wcOptions = NULL;
|
|
}
|
|
|
|
SysFreeString(bstrConfigure);
|
|
|
|
return hrReturn;
|
|
}
|
|
|
|
HRESULT CProduct::Upgrade(CRequestObject *pReqObj, IWbemClassObject *pInParams,
|
|
IWbemObjectSink *pHandler, IWbemContext *pCtx)
|
|
{
|
|
HRESULT hrReturn = WBEM_S_NO_ERROR;
|
|
BSTR bstrPackage = NULL;
|
|
BSTR wcOptions = NULL;
|
|
UINT uiStatus = 1603;
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
if(!bstrReturnValue) throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
|
|
BSTR bstrUpgrade = SysAllocString(L"Upgrade");
|
|
if(!bstrUpgrade)
|
|
{
|
|
::SysFreeString (bstrReturnValue);
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
|
|
IWbemClassObject *pClass = NULL;
|
|
IWbemClassObject *pOutClass = NULL;
|
|
IWbemClassObject *pOutParams = NULL;
|
|
VARIANT v;
|
|
|
|
m_pRequest = pReqObj;
|
|
|
|
if(SUCCEEDED(hrReturn = m_pRequest->m_pNamespace->GetObject(m_pRequest->m_bstrClass,
|
|
0, pCtx, &pClass, NULL))){
|
|
|
|
if(SUCCEEDED(hrReturn = pClass->GetMethod(bstrUpgrade, 0, NULL, &pOutClass))){
|
|
|
|
if(SUCCEEDED(hrReturn = pOutClass->SpawnInstance(0, &pOutParams))){
|
|
//Get PackageLocation
|
|
if(SUCCEEDED(GetProperty(pInParams, "PackageLocation", &bstrPackage))){
|
|
|
|
OnDelete < BSTR, void ( * ) ( BSTR ), SysFreeString > del_bstrPackage ( bstrPackage ) ;
|
|
|
|
if((wcscmp(bstrPackage, L"") != 0) && (wcslen(bstrPackage) <= INTERNET_MAX_PATH_LENGTH)){
|
|
|
|
//Get Options
|
|
if ( SUCCEEDED ( GetProperty ( pInParams, "Options", &wcOptions ) ) )
|
|
{
|
|
OnDelete < BSTR, void ( * ) ( BSTR ), SysFreeString > del_wcOptions ( wcOptions ) ;
|
|
|
|
if(hrReturn == WBEM_S_NO_ERROR){
|
|
|
|
if(!IsNT4()){
|
|
|
|
if ( msidata.Lock () )
|
|
{
|
|
INSTALLUI_HANDLER ui = NULL;
|
|
|
|
//Set UI Level w/ event callback
|
|
ui = SetupExternalUI ( );
|
|
|
|
try
|
|
{
|
|
//Call Installer
|
|
if ( wcOptions && wcscmp ( wcOptions, L"" ) != 0 )
|
|
{
|
|
uiStatus = g_fpMsiApplyPatchW(bstrPackage, NULL, INSTALLTYPE_DEFAULT, wcOptions);
|
|
}
|
|
else
|
|
{
|
|
uiStatus = g_fpMsiApplyPatchW(bstrPackage, NULL, INSTALLTYPE_DEFAULT, NULL);
|
|
}
|
|
}
|
|
catch(...)
|
|
{
|
|
uiStatus = static_cast < UINT > ( RPC_E_SERVERFAULT );
|
|
}
|
|
|
|
//Restore UI Level w/ event callback
|
|
RestoreExternalUI ( ui );
|
|
|
|
msidata. Unlock();
|
|
}
|
|
|
|
}else{
|
|
|
|
/////////////////
|
|
// NT4 fix code....
|
|
|
|
try{
|
|
|
|
WCHAR wcAction[20];
|
|
wcscpy(wcAction, L"/upgrade");
|
|
|
|
LPWSTR wcCommandLine = NULL;
|
|
|
|
try
|
|
{
|
|
if ( ( wcCommandLine = new WCHAR [ wcslen ( bstrPackage ) + 1 + wcslen ( wcOptions ) + 1 ] ) != NULL )
|
|
{
|
|
wcscpy(wcCommandLine, bstrPackage);
|
|
wcscat(wcCommandLine, L" ");
|
|
wcscat(wcCommandLine, wcOptions);
|
|
|
|
hrReturn = LaunchProcess(wcAction, wcCommandLine, &uiStatus);
|
|
|
|
delete [] wcCommandLine;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
if ( wcCommandLine )
|
|
{
|
|
delete [] wcCommandLine;
|
|
wcCommandLine = NULL;
|
|
}
|
|
|
|
hrReturn = E_OUTOFMEMORY;
|
|
}
|
|
|
|
}catch(...){
|
|
|
|
hrReturn = WBEM_E_FAILED;
|
|
}
|
|
|
|
////////////////////
|
|
|
|
}
|
|
|
|
if(SUCCEEDED(hrReturn)){
|
|
|
|
//Set up ReturnValue
|
|
VariantInit(&v);
|
|
V_VT(&v) = VT_I4;
|
|
V_I4(&v) = uiStatus;
|
|
|
|
BSTR bstrReturnValue = SysAllocString(L"ReturnValue");
|
|
|
|
if(!bstrReturnValue)
|
|
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
|
|
|
|
if(SUCCEEDED(hrReturn = pOutParams->Put(bstrReturnValue, 0,
|
|
&v, NULL)))
|
|
pHandler->Indicate(1, &pOutParams);
|
|
|
|
SysFreeString(bstrReturnValue);
|
|
}
|
|
}
|
|
}else
|
|
hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
}else
|
|
hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
}else
|
|
hrReturn = WBEM_E_INVALID_METHOD_PARAMETERS;
|
|
|
|
pOutParams->Release();
|
|
}
|
|
pOutClass->Release();
|
|
}
|
|
pClass->Release();
|
|
}
|
|
|
|
SysFreeString(bstrUpgrade);
|
|
|
|
return hrReturn;
|
|
}
|