#include "pch.h"
#include "AdminSessionClass.h"
#include "AdminSessionSecure.h"
bool CAdminSessionClass::IsEqualBSTR(BSTR bstr1, BSTR bstr2)
{
if (!BSTRLen(bstr1) && !BSTRLen(bstr2))
return true;
else if (!BSTRLen(bstr2))
return false;
return 0 == wcscmp(bstr1, bstr2);
}
STDMETHODIMP CAdminSessionClass::CreateInstance(IUnknown* pUnkOuter,
REFIID riid, void** ppvObject)
{
#if !defined(ALLSRV_STANDALONE)
return CComClassFactory::CreateInstance(pUnkOuter, riid, ppvObject);
#else return E_INVALIDARG;
#endif }
STDMETHODIMP CAdminSessionClass::CreateSession(IAdminSessionHost* pHost,
IAdminSession** ppSession)
{
if (!pHost)
return E_INVALIDARG;
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
IUnknownPtr spUnk;
HRESULT hr = pHost->GetIdentity(ft.dwLowDateTime, &spUnk);
if (hr != (ft.dwLowDateTime & 0x7FFFFFFF))
return E_INVALIDARG;
IStreamPtr spStm(spUnk);
if (NULL == spStm)
return E_INVALIDARG;
IStreamPtr spStmOut;
RETURN_FAILED(CAdminSessionSecure<
&CLSID_AdminInterfaces>::CreateDecryptedStream(spStm, &spStmOut));
LARGE_INTEGER li = {0};
RETURN_FAILED(spStmOut->Seek(li, STREAM_SEEK_SET, NULL));
IAGCVersionInfoPtr spVersionHost;
RETURN_FAILED(spVersionHost.CreateInstance(CLSID_AGCVersionInfo));
IPersistStreamPtr spPersist(spVersionHost);
if (NULL == spPersist)
return E_UNEXPECTED;
RETURN_FAILED(spPersist->Load(spStmOut));
IAGCVersionInfoPtr spVersion;
RETURN_FAILED(spVersion.CreateInstance(CLSID_AGCVersionInfo));
RETURN_FAILED(spVersion->put_FileName(NULL));
{
CComBSTR bstr, bstrHost;
RETURN_FAILED(spVersion->get_CompanyName(&bstr));
RETURN_FAILED(spVersionHost->get_CompanyName(&bstrHost));
if (!IsEqualBSTR(bstr, bstrHost))
return E_INVALIDARG;
}
{
CComBSTR bstr, bstrHost;
RETURN_FAILED(spVersion->get_LegalCopyright(&bstr));
RETURN_FAILED(spVersionHost->get_LegalCopyright(&bstrHost));
if (!IsEqualBSTR(bstr, bstrHost))
return E_INVALIDARG;
}
return CComClassFactory::CreateInstance(NULL, IID_IAdminSession,
(void**)ppSession);
}