219 lines
5.6 KiB
C++
219 lines
5.6 KiB
C++
|
// ProfMMgr.cpp : Implementation of CMcsPiPflApp and DLL registration.
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "McsPiPfl.h"
|
||
|
#include "ProfMMgr.h"
|
||
|
|
||
|
#include "ErrDct.hpp"
|
||
|
#include "TReg.hpp"
|
||
|
#include "ResStr.h"
|
||
|
#include "EaLen.hpp"
|
||
|
|
||
|
#include "cipher.hpp"
|
||
|
#include "SecPI.h"
|
||
|
|
||
|
TErrorDct err;
|
||
|
TError & errCommon = err;
|
||
|
StringLoader gString;
|
||
|
|
||
|
// This method is called by the dispatcher to verify that this is a valid plug-in
|
||
|
// Only valid plug-ins will be sent out with the agents
|
||
|
// The purpose of this check is to make it more difficult for unauthorized parties
|
||
|
// to use our plug-in interface, since it is currently undocumented.
|
||
|
STDMETHODIMP CProfMMgr::Verify(/*[in,out]*/ULONG * pData,/*[in]*/ULONG size)
|
||
|
{
|
||
|
|
||
|
McsChallenge * pMcsChallenge;
|
||
|
long lTemp1;
|
||
|
long lTemp2;
|
||
|
|
||
|
if( size == sizeof(McsChallenge) )
|
||
|
{
|
||
|
pMcsChallenge = (McsChallenge*)(pData);
|
||
|
|
||
|
SimpleCipher((LPBYTE)pMcsChallenge,size);
|
||
|
|
||
|
pMcsChallenge->MCS[0] = 'M';
|
||
|
pMcsChallenge->MCS[1] = 'C';
|
||
|
pMcsChallenge->MCS[2] = 'S';
|
||
|
pMcsChallenge->MCS[3] = 0;
|
||
|
|
||
|
|
||
|
lTemp1 = pMcsChallenge->lRand1 + pMcsChallenge->lRand2;
|
||
|
lTemp2 = pMcsChallenge->lRand2 - pMcsChallenge->lRand1;
|
||
|
pMcsChallenge->lRand1 = lTemp1;
|
||
|
pMcsChallenge->lRand2 = lTemp2;
|
||
|
pMcsChallenge->lTime += 100;
|
||
|
|
||
|
SimpleCipher((LPBYTE)pMcsChallenge,size);
|
||
|
}
|
||
|
else
|
||
|
return E_FAIL;
|
||
|
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP CProfMMgr::GetRegisterableFiles(/* [out] */SAFEARRAY ** pArray)
|
||
|
{
|
||
|
SAFEARRAYBOUND bound[1] = { 1, 0 };
|
||
|
LONG ndx[1] = { 0 };
|
||
|
TNodeListEnum e;
|
||
|
TFileList list;
|
||
|
TFileNode * pNode;
|
||
|
LONG i;
|
||
|
|
||
|
BuildFileLists(NULL,&list);
|
||
|
bound[0].cElements = list.Count();
|
||
|
|
||
|
(*pArray) = SafeArrayCreate(VT_BSTR,1,bound);
|
||
|
|
||
|
for (i = 0, pNode=(TFileNode*)e.OpenFirst(&list) ; pNode ; i++, pNode=(TFileNode*)e.Next() )
|
||
|
{
|
||
|
ndx[0] = i;
|
||
|
SafeArrayPutElement(*pArray,ndx,SysAllocString(pNode->GetName()));
|
||
|
}
|
||
|
e.Close();
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CProfMMgr::GetRequiredFiles(/* [out] */SAFEARRAY ** pArray)
|
||
|
{
|
||
|
SAFEARRAYBOUND bound[1] = { 1, 0 };
|
||
|
LONG ndx[1] = { 0 };
|
||
|
TNodeListEnum e;
|
||
|
TFileList list;
|
||
|
TFileNode * pNode;
|
||
|
LONG i;
|
||
|
|
||
|
BuildFileLists(&list,NULL);
|
||
|
bound[0].cElements = list.Count();
|
||
|
|
||
|
(*pArray) = SafeArrayCreate(VT_BSTR,1,bound);
|
||
|
|
||
|
for (i = 0, pNode=(TFileNode*)e.OpenFirst(&list) ; pNode ; i++, pNode=(TFileNode*)e.Next() )
|
||
|
{
|
||
|
ndx[0] = i;
|
||
|
SafeArrayPutElement(*pArray,ndx,SysAllocString(pNode->GetName()));
|
||
|
}
|
||
|
e.Close();
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CProfMMgr::GetDescription(/* [out] */ BSTR * description)
|
||
|
{
|
||
|
(*description) = SysAllocString(L"");
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CProfMMgr::PreMigrationTask(/* [in] */IUnknown * pVarSet)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CProfMMgr::PostMigrationTask(/* [in] */IUnknown * pVarSet)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP CProfMMgr::GetName(/* [out] */BSTR * name)
|
||
|
{
|
||
|
(*name) = SysAllocString(L"");
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CProfMMgr::GetResultString(/* [in] */IUnknown * pVarSet,/* [out] */ BSTR * text)
|
||
|
{
|
||
|
(*text) = SysAllocString(L"");
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CProfMMgr::StoreResults(/* [in] */IUnknown * pVarSet)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CProfMMgr::ConfigureSettings(/*[in]*/IUnknown * pVarSet)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CProfMMgr::BuildFileLists(TFileList * pRequired,TFileList * pRegisterable)
|
||
|
{
|
||
|
// Enumerate the profile extensions defined in the registry
|
||
|
TRegKey profExt;
|
||
|
DWORD rc;
|
||
|
WCHAR subkey[LEN_Path];
|
||
|
CLSID clsid;
|
||
|
|
||
|
rc = profExt.Open(GET_STRING(IDS_REGKEY_PROFILE_EXTENSIONS));
|
||
|
|
||
|
if ( ! rc )
|
||
|
{
|
||
|
for ( int i = 0 ; ! rc ; i++ )
|
||
|
{
|
||
|
rc = profExt.SubKeyEnum(i,subkey,DIM(subkey));
|
||
|
if (! rc )
|
||
|
{
|
||
|
HRESULT hr = CLSIDFromString(subkey,&clsid);
|
||
|
IMcsDomPlugIn * pExt = NULL;
|
||
|
SAFEARRAY * pArray = NULL;
|
||
|
|
||
|
if ( SUCCEEDED(hr) )
|
||
|
{
|
||
|
hr = CoCreateInstance(clsid,NULL,CLSCTX_ALL,IID_IMcsDomPlugIn,(void**)&pExt);
|
||
|
if ( SUCCEEDED(hr) )
|
||
|
{
|
||
|
|
||
|
if ( pRequired )
|
||
|
{
|
||
|
hr = pExt->GetRequiredFiles(&pArray);
|
||
|
if ( SUCCEEDED(hr) )
|
||
|
{
|
||
|
AddFilesToList(pArray,pRequired);
|
||
|
SafeArrayDestroy(pArray);
|
||
|
}
|
||
|
}
|
||
|
if ( pRegisterable )
|
||
|
{
|
||
|
hr = pExt->GetRegisterableFiles(&pArray);
|
||
|
if (SUCCEEDED(hr) )
|
||
|
{
|
||
|
AddFilesToList(pArray,pRegisterable);
|
||
|
SafeArrayDestroy(pArray);
|
||
|
}
|
||
|
}
|
||
|
pExt->Release();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CProfMMgr::AddFilesToList(SAFEARRAY * pFileArray, TFileList * pList)
|
||
|
{
|
||
|
LONG bound = 0;
|
||
|
LONG ndx[1];
|
||
|
TFileNode * pNode = NULL;
|
||
|
|
||
|
SafeArrayGetUBound(pFileArray,1,&bound);
|
||
|
|
||
|
for ( ndx[0] = 0 ; ndx[0] <= bound ; ndx[0]++ )
|
||
|
{
|
||
|
BSTR val = NULL;
|
||
|
|
||
|
SafeArrayGetElement(pFileArray,ndx,&val);
|
||
|
pNode = new TFileNode(val);
|
||
|
pList->InsertBottom(pNode);
|
||
|
SysFreeString(val);
|
||
|
}
|
||
|
}
|