AdminSessionClass.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "pch.h"
  2. #include "AdminSessionClass.h"
  3. #include "AdminSessionSecure.h"
  4. /////////////////////////////////////////////////////////////////////////////
  5. // CAdminSessionClass
  6. /////////////////////////////////////////////////////////////////////////////
  7. // Implementation
  8. bool CAdminSessionClass::IsEqualBSTR(BSTR bstr1, BSTR bstr2)
  9. {
  10. // Equal if both are empty
  11. if (!BSTRLen(bstr1) && !BSTRLen(bstr2))
  12. return true;
  13. else if (!BSTRLen(bstr2))
  14. return false;
  15. // Compare strings
  16. return 0 == wcscmp(bstr1, bstr2);
  17. }
  18. /////////////////////////////////////////////////////////////////////////////
  19. // IClassFactory Interface Methods
  20. STDMETHODIMP CAdminSessionClass::CreateInstance(IUnknown* pUnkOuter,
  21. REFIID riid, void** ppvObject)
  22. {
  23. #if !defined(ALLSRV_STANDALONE)
  24. // Perform default processing
  25. return CComClassFactory::CreateInstance(pUnkOuter, riid, ppvObject);
  26. #else // !defined(ALLSRV_STANDALONE)
  27. // Completely disallow normal object creation in standalone server
  28. return E_INVALIDARG;
  29. #endif // !defined(ALLSRV_STANDALONE)
  30. }
  31. /////////////////////////////////////////////////////////////////////////////
  32. // IAdminSessionClass Interface Methods
  33. STDMETHODIMP CAdminSessionClass::CreateSession(IAdminSessionHost* pHost,
  34. IAdminSession** ppSession)
  35. {
  36. // pHost must be valid
  37. if (!pHost)
  38. return E_INVALIDARG;
  39. // Create a decoy cookie based on the current FILETIME
  40. FILETIME ft;
  41. GetSystemTimeAsFileTime(&ft);
  42. // Get the IUnknown from the admin session host
  43. IUnknownPtr spUnk;
  44. HRESULT hr = pHost->GetIdentity(ft.dwLowDateTime, &spUnk);
  45. if (hr != (ft.dwLowDateTime & 0x7FFFFFFF))
  46. return E_INVALIDARG;
  47. // IUnknown must support IStream
  48. IStreamPtr spStm(spUnk);
  49. if (NULL == spStm)
  50. return E_INVALIDARG;
  51. // Create a decoded copy of the specified stream
  52. IStreamPtr spStmOut;
  53. RETURN_FAILED(CAdminSessionSecure<
  54. &CLSID_AdminInterfaces>::CreateDecryptedStream(spStm, &spStmOut));
  55. // Rewind the decoded stream
  56. LARGE_INTEGER li = {0};
  57. RETURN_FAILED(spStmOut->Seek(li, STREAM_SEEK_SET, NULL));
  58. // Create a version info object for the host
  59. IAGCVersionInfoPtr spVersionHost;
  60. RETURN_FAILED(spVersionHost.CreateInstance(CLSID_AGCVersionInfo));
  61. // Initialize the version info object from the decoded stream
  62. IPersistStreamPtr spPersist(spVersionHost);
  63. if (NULL == spPersist)
  64. return E_UNEXPECTED;
  65. RETURN_FAILED(spPersist->Load(spStmOut));
  66. // Create a version info object for this module
  67. IAGCVersionInfoPtr spVersion;
  68. RETURN_FAILED(spVersion.CreateInstance(CLSID_AGCVersionInfo));
  69. RETURN_FAILED(spVersion->put_FileName(NULL));
  70. // Compare exactly for several fields of the version info object
  71. // CompanyName
  72. {
  73. CComBSTR bstr, bstrHost;
  74. RETURN_FAILED(spVersion->get_CompanyName(&bstr));
  75. RETURN_FAILED(spVersionHost->get_CompanyName(&bstrHost));
  76. if (!IsEqualBSTR(bstr, bstrHost))
  77. return E_INVALIDARG;
  78. }
  79. // LegalCopyright
  80. {
  81. CComBSTR bstr, bstrHost;
  82. RETURN_FAILED(spVersion->get_LegalCopyright(&bstr));
  83. RETURN_FAILED(spVersionHost->get_LegalCopyright(&bstrHost));
  84. if (!IsEqualBSTR(bstr, bstrHost))
  85. return E_INVALIDARG;
  86. }
  87. // Now, we can FINALLY create the sesion by calling the base class
  88. return CComClassFactory::CreateInstance(NULL, IID_IAdminSession,
  89. (void**)ppSession);
  90. }