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.
 
 
 
 
 
 

343 lines
7.7 KiB

// RARegSetting.cpp : Implementation of CRARegSetting
#include "stdafx.h"
#include "RAssistance.h"
#include "common.h"
#include "RAEventLog.h"
#include "assert.h"
extern "C" void
AttachDebuggerIfAsked(HINSTANCE hInst);
extern HINSTANCE g_hInst;
HRESULT
CRAEventLog::LogRemoteAssistanceEvent(
IN long ulEventType,
IN long ulEventCode,
IN long numStrings,
IN LPCTSTR* pszStrings
)
/*++
Description:
Log a Salem related event, this is invoked by TermSrv and rdshost to log
event related to help assistant connection.
Parameters:
Returns:
S_OK or error code.
--*/
{
HANDLE hAppLog=NULL;
BOOL bSuccess=FALSE;
try {
if(hAppLog=RegisterEventSource(NULL, REMOTEASSISTANCE_EVENT_NAME))
{
bSuccess = ReportEvent(
hAppLog,
(WORD)ulEventType,
0,
ulEventCode,
NULL,
(WORD)numStrings,
0,
pszStrings,
NULL
);
DeregisterEventSource(hAppLog);
}
}
catch(...) {
}
return S_OK;
}
STDMETHODIMP
CRAEventLog::LogRemoteAssistanceEvent(
/*[in]*/ long ulEventType,
/*[in]*/ long ulEventCode,
/*[in]*/ VARIANT* pEventStrings
)
/*++
--*/
{
HRESULT hRes = S_OK;
BSTR* bstrArray = NULL;
SAFEARRAY* psa = NULL;
VARTYPE vt_type;
DWORD dwNumStrings = 0;
AttachDebuggerIfAsked( g_hInst );
if( NULL == pEventStrings )
{
hRes = LogRemoteAssistanceEvent( ulEventType, ulEventCode );
}
else if( pEventStrings->vt == VT_DISPATCH )
{
// coming from JSCRIPT
hRes = LogJScriptEventSource( ulEventType, ulEventCode, pEventStrings );
}
else
{
// we only support BSTR and safearry of BSTR
if( (pEventStrings->vt != VT_BSTR) && (pEventStrings->vt != (VT_ARRAY | VT_BSTR)) )
{
hRes = E_INVALIDARG;
goto CLEANUPANDEXIT;
}
//
// we are dealing with multiple BSTRs
if( pEventStrings->vt & VT_ARRAY )
{
psa = pEventStrings->parray;
// only accept 1 dim.
if( 1 != SafeArrayGetDim(psa) )
{
hRes = E_INVALIDARG;
goto CLEANUPANDEXIT;
}
// only accept BSTR as input type.
hRes = SafeArrayGetVartype( psa, &vt_type );
if( FAILED(hRes) )
{
goto CLEANUPANDEXIT;
}
if( VT_BSTR != vt_type )
{
hRes = E_INVALIDARG;
goto CLEANUPANDEXIT;
}
hRes = SafeArrayAccessData(psa, (void **)&bstrArray);
if( FAILED(hRes) )
{
goto CLEANUPANDEXIT;
}
hRes = LogRemoteAssistanceEvent(
ulEventType,
ulEventCode,
psa->rgsabound->cElements,
(LPCTSTR *)bstrArray
);
SafeArrayUnaccessData(psa);
}
else
{
hRes = LogRemoteAssistanceEvent(
ulEventType,
ulEventCode,
1,
(LPCTSTR *)&(pEventStrings->bstrVal)
);
}
}
CLEANUPANDEXIT:
return hRes;
}
HRESULT
CRAEventLog::GetProperty(IDispatch* pDisp, BSTR szProperty, VARIANT * pVarRet)
{
HRESULT hr = S_OK;
DISPID pDispId;
DISPPARAMS dp;
if ((pVarRet == NULL) ||
(szProperty == NULL) ||
(pDisp == NULL))
{
hr = E_INVALIDARG;
goto done;
}
memset(&dp,0,sizeof(DISPPARAMS));
// Get the DispID of the property
hr = pDisp->GetIDsOfNames(IID_NULL, &szProperty, 1, LOCALE_SYSTEM_DEFAULT, &pDispId);
if (FAILED(hr))
{
goto done;
}
hr = pDisp->Invoke(pDispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dp, pVarRet, NULL, NULL);
if (FAILED(hr))
{
goto done;
}
done:
return hr;
}
HRESULT
CRAEventLog::GetArrayValue(IDispatch * pDisp, LONG index, VARIANT * pVarRet)
{
HRESULT hr = S_OK;
VARIANT vtLength;
LONG lArrayLen;
CComBSTR bstrIndex;
WCHAR wbuff[100];
CComBSTR bstrTemp(OLESTR("length"));
VariantInit( &vtLength );
if (bstrTemp.m_str == NULL) {
hr = E_OUTOFMEMORY;
goto done;
}
if ((pVarRet == NULL) ||
(pDisp == NULL))
{
hr = E_INVALIDARG;
goto done;
}
// Get the length of the array
hr = GetProperty(pDisp, bstrTemp, &vtLength);
if (FAILED(hr))
{
goto done;
}
// if the length is < index, return E_INVALIDARG
if (vtLength.vt != VT_I4)
{
hr = E_FAIL;
goto done;
}
lArrayLen = vtLength.lVal;
if (index > (lArrayLen - 1))
{
hr = E_INVALIDARG;
goto done;
}
// Get the VARIANT at the index of the array
wsprintf(&wbuff[0],L"%ld", index);
bstrIndex.Append(wbuff);
hr = GetProperty(pDisp, bstrIndex, pVarRet);
if (FAILED(hr))
{
goto done;
}
done:
VariantClear( &vtLength );
return hr;
}
//
// We limit max. number of 256 parameters into event log.
//
#define EVENTSTRING_MAX_PARMS 256
HRESULT
CRAEventLog::LogJScriptEventSource(
IN long ulEventType,
IN long ulEventCode,
IN VARIANT *pVar
)
/*++
Code modify from jperez
--*/
{
HRESULT hr = S_OK;
CComPtr<IDispatch> pDisp;
VARIANT varValue;
BSTR* pEventStrings = NULL;
DWORD dwNumStrings = 0;
if (pVar->vt != VT_DISPATCH || pVar->pdispVal == NULL)
{
hr = E_INVALIDARG;
goto done;
}
pEventStrings = (BSTR*) LocalAlloc(LPTR, sizeof(BSTR) * EVENTSTRING_MAX_PARMS);
if( NULL == pEventStrings )
{
hr = E_OUTOFMEMORY;
goto done;
}
pDisp = pVar->pdispVal;
for(; hr == S_OK && dwNumStrings < EVENTSTRING_MAX_PARMS; dwNumStrings++)
{
VariantInit( &varValue );
hr = GetArrayValue(pDisp, dwNumStrings, &varValue);
if( FAILED(hr) )
{
// GetArrayValue return 0x80070057 when it reach the end; however
// lot of place returns this value so we should assume end of
// msg parameter and log what we have.
hr = S_FALSE;
break;
}
if( varValue.vt != VT_BSTR )
{
// unsupported type, return error.
hr = E_INVALIDARG;
break;
}
pEventStrings[dwNumStrings] = varValue.bstrVal;
// we take ownership of BSTR, clear out necessary field.
varValue.bstrVal = NULL;
varValue.vt = VT_EMPTY;
}
if( hr == S_FALSE )
{
hr = LogRemoteAssistanceEvent(
ulEventType,
ulEventCode,
dwNumStrings,
(LPCTSTR *)pEventStrings
);
}
done:
if( NULL != pEventStrings )
{
for(DWORD index=0; index < dwNumStrings; index++)
{
SysFreeString(pEventStrings[index]);
}
LocalFree( pEventStrings );
}
return hr;
}