memspy/Driver/Kernel/Source/SubChannels/MemSpyDriverLogChanProcessInspection.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 15 Sep 2010 13:53:27 +0300
branchRCL_3
changeset 49 7fdc9a71d314
parent 0 a03f92240627
permissions -rw-r--r--
Revision: 201035 Kit: 201036

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/

#include "MemSpyDriverLogChanProcessInspection.h"

// System includes
#include <u32hal.h>
#include <e32rom.h>
#include <memspy/driver/memspydriverobjectsshared.h>

// Shared includes
#include "MemSpyDriverOpCodes.h"
#include "MemSpyDriverObjectsInternal.h"

// User includes
#include "MemSpyDriverUtils.h"
#include "MemSpyDriverDevice.h"
#include "MemSpyDriverInspectedProcess.h"
#include "MemSpyDriverInspectedProcessManager.h"


DMemSpyDriverLogChanProcessInspection::DMemSpyDriverLogChanProcessInspection( DMemSpyDriverDevice& aDevice, DThread& aThread )
:   DMemSpyDriverLogChanBase( aDevice, aThread )
    {
    TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::DMemSpyDriverLogChanProcessInspection() - this: 0x%08x", this ));
    }


DMemSpyDriverLogChanProcessInspection::~DMemSpyDriverLogChanProcessInspection()
	{
	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::~DMemSpyDriverLogChanProcessInspection() - START - this: 0x%08x", this ));

	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::~DMemSpyDriverLogChanProcessInspection() - END - this: 0x%08x", this ));
	}






TInt DMemSpyDriverLogChanProcessInspection::Request( TInt aFunction, TAny* a1, TAny* a2 )
	{
	TInt r = DMemSpyDriverLogChanBase::Request( aFunction, a1, a2 );
    if  ( r == KErrNone )
        {
	    switch( aFunction )
		    {
        case EMemSpyDriverOpCodeProcessInspectOpen:
            r = ProcessInspectionOpen( (TUint) a1 );
            break;
        case EMemSpyDriverOpCodeProcessInspectClose:
            r = ProcessInspectionClose( (TUint) a1 );
            break;
        case EMemSpyDriverOpCodeProcessInspectRequestChanges:
            r = ProcessInspectionRequestChanges( (TRequestStatus*) a1, (TMemSpyDriverProcessInspectionInfo*) a2 );
            break;
        case EMemSpyDriverOpCodeProcessInspectRequestChangesCancel:
            r = ProcessInspectionRequestChangesCancel( (TUint) a1 );
            break;
        case EMemSpyDriverOpCodeProcessInspectAutoStartListReset:
            r = ProcessInspectionAutoStartItemsClear();
            break;
        case EMemSpyDriverOpCodeProcessInspectAutoStartListAdd:
            r = ProcessInspectionAutoStartItemsAdd( (TUint) a1 );
            break;

        default:
            r = KErrNotSupported;
		    break;
		    }
        }
    //
    return r;
	}


TBool DMemSpyDriverLogChanProcessInspection::IsHandler( TInt aFunction ) const
    {
    return ( aFunction > EMemSpyDriverOpCodeProcessInspectBase && aFunction < EMemSpyDriverOpCodeProcessInspectEnd );
    }


























TInt DMemSpyDriverLogChanProcessInspection::ProcessInspectionOpen( TUint aPid )
    {
	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionOpen() - START"));
    NKern::ThreadEnterCS();
    
    TInt error = OpenTempObject( aPid, EProcess );
    if  ( error == KErrNone )
    	{
        DMemSpyInspectedProcessManager& pidManager = MemSpyDevice().ProcessInspectionManager();
        error = pidManager.ProcessOpen( (DProcess*) TempObject() );
	    CloseTempObject();
    	}
    //
    NKern::ThreadLeaveCS();
	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionOpen() - END - error: %d", error ));
    return error;
    }


TInt DMemSpyDriverLogChanProcessInspection::ProcessInspectionClose( TUint aPid )
    {
	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionClose() - START"));
    NKern::ThreadEnterCS();

    TInt error = OpenTempObject( aPid, EProcess );
    if  ( error == KErrNone )
    	{
        DMemSpyInspectedProcessManager& pidManager = MemSpyDevice().ProcessInspectionManager();
        error = pidManager.ProcessClose( (DProcess*) TempObject() );
	    CloseTempObject();
    	}
    
    NKern::ThreadLeaveCS();

	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionClose() - END - error: %d", error ));
    return error;
    }


TInt DMemSpyDriverLogChanProcessInspection::ProcessInspectionRequestChanges( TRequestStatus* aStatus, TMemSpyDriverProcessInspectionInfo* aInfo )
    {
	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionRequestChanges() - START"));
    NKern::ThreadEnterCS();

    // Read client info
    TMemSpyDriverProcessInspectionInfo info;
	TInt error = Kern::ThreadRawRead( &ClientThread(), aInfo, &info, sizeof(TMemSpyDriverProcessInspectionInfo) );
    //
    if  ( error == KErrNone )
        {
        DMemSpyInspectedProcessManager& pidManager = MemSpyDevice().ProcessInspectionManager();
        DMemSpyInspectedProcess* pid = pidManager.InspectedProcessByProcessId( info.iProcessId );
        //
        if ( pid != NULL )
            {
            error = pid->NotifyOnChange( &ClientThread(), aStatus, aInfo );
            }
        else
            {
            error = KErrNotFound;
            }
        }

    // NB: Let client take care of completing request in error situations
    NKern::ThreadLeaveCS();
	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionRequestChanges() - END - error: %d", error ));
    return error;
    }


TInt DMemSpyDriverLogChanProcessInspection::ProcessInspectionRequestChangesCancel( TUint aPid )
    {
	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionRequestChangesCancel() - START"));
    NKern::ThreadEnterCS();

    TInt error = KErrNotFound;

    DMemSpyInspectedProcessManager& pidManager = MemSpyDevice().ProcessInspectionManager();
    DMemSpyInspectedProcess* pid = pidManager.InspectedProcessByProcessId( aPid );
    //
    if ( pid != NULL )
        {
        error = pid->NotifyOnChangeCancel();
        }

    NKern::ThreadLeaveCS();

	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionRequestChangesCancel() - END - error: %d", error ));
    return error;
    }


TInt DMemSpyDriverLogChanProcessInspection::ProcessInspectionAutoStartItemsClear()
    {
	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionAutoStartItemsClear() - START"));

    NKern::ThreadEnterCS();

    DMemSpyInspectedProcessManager& pidManager = MemSpyDevice().ProcessInspectionManager();
    pidManager.AutoStartListReset();

    NKern::ThreadLeaveCS();

	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionAutoStartItemsClear() - END" ));
    return KErrNone;
    }


TInt DMemSpyDriverLogChanProcessInspection::ProcessInspectionAutoStartItemsAdd( TUint aSID )
    {
	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionAutoStartItemsAdd() - START - aSID: 0x%08x", aSID ));

    NKern::ThreadEnterCS();
    DMemSpyInspectedProcessManager& pidManager = MemSpyDevice().ProcessInspectionManager();
    const TInt error = pidManager.AutoStartListAdd( aSID );
    NKern::ThreadLeaveCS();

	TRACE( Kern::Printf("DMemSpyDriverLogChanProcessInspection::ProcessInspectionAutoStartItemsAdd() - END - error: %d", error ));
    return error;
    }