#ifndef __AdminSessionSecureHost_h__
#define __AdminSessionSecureHost_h__
/////////////////////////////////////////////////////////////////////////////
#ifndef RETURN_FAILED
///////////////////////////////////////////////////////////////////////////
// Evaluates an HRESULT expression and returns it if it indicates failure.
// This should only be used from a function that has an HRESULT (or
// compatible) return type.
//
// Parameters:
// exp - The HRESULT expression to be evaluated.
//
// See Also: RETURN_FAILED_VOID, ThrowError, ThrowErrorFAILED
//
#define RETURN_FAILED(exp) \
do \
{ \
HRESULT _hr = exp; \
if (FAILED(_hr)) \
return _hr; \
} while (false)
#endif // !RETURN_FAILED
//////////////////////////////////////////////////////////////////////////////
//
// xhost
//
//////////////////////////////////////////////////////////////////////////////
struct AdminSessionSecureHost : public IAdminSessionHost
{
// IUnknown Interface Methods
STDMETHODIMP QueryInterface(REFIID riid, void** ppUnk)
{
if (IID_IUnknown == riid || __uuidof(IAdminSessionHost) == riid)
{
*ppUnk = this;
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) AddRef(void)
{
return 1;
}
STDMETHODIMP_(ULONG) Release(void)
{
return 1;
}
// IAdminSessionHost Interface Methods
STDMETHODIMP GetIdentity(long nCookie, IUnknown** ppHost)
{
// Ignore the cookie - it's only there in an attempt to foil hackers
nCookie;
// Create an AGCVersionInfo object
IAGCVersionInfoPtr spVersion;
RETURN_FAILED(spVersion.CreateInstance(__uuidof(AGCVersionInfo)));
// Load the version info from this module
RETURN_FAILED(spVersion->put_FileName(NULL));
// Persist the version info object to a memory stream
IPersistStreamPtr spPersist(spVersion);
if (NULL == spPersist)
return E_NOINTERFACE;
IStreamPtr spStm;
RETURN_FAILED(CreateStreamOnHGlobal(NULL, true, &spStm));
RETURN_FAILED(spPersist->Save(spStm, false));
// Rewind the stream
LARGE_INTEGER li = {0};
RETURN_FAILED(spStm->Seek(li, STREAM_SEEK_SET, NULL));
// Create an encoded copy of the specified stream
IStreamPtr spStmOut;
RETURN_FAILED(CAdminSessionSecure<
&__uuidof(AdminInterfaces)>::CreateDecryptedStream(spStm, &spStmOut));
// Detach the output stream to the [out] parameter
*ppHost = spStmOut.Detach();
// Indicate success, but intentionally not S_OK
return nCookie & 0x7FFFFFFF;
}
};
/////////////////////////////////////////////////////////////////////////////
#endif // !__AdminSessionSecureHost_h__