|
|
// 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); } }
|