diff -r 000000000000 -r 7f656887cf89 libraries/ltkutils/src/proxyallocatorhelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libraries/ltkutils/src/proxyallocatorhelper.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,116 @@ +// proxyallocatorhelper.cpp +// +// Copyright (c) 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Accenture - Initial contribution +// +#include +#include +#include +__ASSERT_COMPILE(sizeof(LtkUtils::RProxyAllocatorHelper) == 11*4); + +#ifdef FSHELL_MEMORY_ACCESS_SUPPORT +#include +#endif + +EXPORT_C LtkUtils::RProxyAllocatorHelper::RProxyAllocatorHelper() + : RAllocatorHelper() + { + } + +EXPORT_C TInt LtkUtils::RProxyAllocatorHelper::Open(RMemoryAccess& aMem, TUint aThreadId) + { + iMemoryAccess = &aMem; + iThreadId = aThreadId; + +#ifdef FSHELL_MEMORY_ACCESS_SUPPORT + TUint8* allocatorAddress; + TInt err = iMemoryAccess->GetAllocatorAddress(iThreadId, allocatorAddress); + if (!err) + { + iAllocatorAddress = (TLinAddr)allocatorAddress; + TInt udeb = EuserIsUdeb(); + if (udeb < 0) return udeb; // error + err = IdentifyAllocatorType(udeb); + } + return err; +#else + return KErrNotSupported; +#endif + } + +EXPORT_C TInt LtkUtils::RProxyAllocatorHelper::OpenChunkHeap(RMemoryAccess& aMem, TAny* aDChunkPtr) + { +#ifdef FSHELL_MEMORY_ACCESS_SUPPORT + iMemoryAccess = &aMem; + + TChunkKernelInfo chunkInfo; + TPckg chunkInfoPckg(chunkInfo); + TInt err = iMemoryAccess->GetObjectInfo(EChunk, (TUint8*)aDChunkPtr, chunkInfoPckg); + if (err) return err; + RProcess process; + err = process.Open(chunkInfo.iControllingOwnerProcessId); + if (err == KErrNone) + { + TPckgBuf processInfo; + err = iMemoryAccess->GetObjectInfoByHandle(EProcess, RThread().Id(), process.Handle(), processInfo); + process.Close(); + if (err == KErrNone) + { + iThreadId = processInfo().iFirstThreadId; + return RAllocatorHelper::OpenChunkHeap((TLinAddr)chunkInfo.iBase, chunkInfo.iMaxSize); + } + } + return err; +#else + (void)aMem; + (void)aDChunkPtr; + return KErrNotSupported; +#endif + } + +TInt LtkUtils::RProxyAllocatorHelper::ReadData(TLinAddr aLocation, TAny* aResult, TInt aSize) const + { +#ifdef FSHELL_MEMORY_ACCESS_SUPPORT + TThreadMemoryAccessParams params; + params.iId = iThreadId; + params.iAddr = (TUint8*)aLocation; + params.iSize = aSize; + TPtr8 ptr((TUint8*)aResult, aSize, aSize); + return iMemoryAccess->GetThreadMem(params, ptr); +#else + return KErrNotSupported; +#endif + } + +TInt LtkUtils::RProxyAllocatorHelper::WriteData(TLinAddr aLocation, const TAny* aData, TInt aSize) + { +#ifdef FSHELL_MEMORY_ACCESS_SUPPORT + const TPtrC8 ptr((const TUint8*)aData, aSize); + return iMemoryAccess->WriteMem(iThreadId, ptr, (TAny*)aLocation); +#else + return KErrNotSupported; +#endif + } + +TInt LtkUtils::RProxyAllocatorHelper::TryLock() + { + return KErrNotSupported; + } + +void LtkUtils::RProxyAllocatorHelper::TryUnlock() + { + // Not supported + } + +EXPORT_C void LtkUtils::RProxyAllocatorHelper::Close() + { + iMemoryAccess = NULL; + iThreadId = 0; + RAllocatorHelper::Close(); + }