Beispiel #1
0
RBOOL
	rpal_blob_insert
	(
		rBlob blob,
		RPVOID pData,
		RU32 size,
        RU32 offset
	)
{
	RBOOL isAdded = FALSE;

    _prBlob pBlob = (_prBlob)blob;

	if( rpal_memory_isValid( blob ) &&
		NULL != pData &&
		0 != size )
	{
		if( pBlob->currentSize - pBlob->sizeUsed < size )
		{
			pBlob->currentSize += ( 0 != pBlob->growBy ? pBlob->growBy : size );
			pBlob->pData = rpal_memory_realloc_from( pBlob->pData,
													 pBlob->currentSize + sizeof( RWCHAR ),
													 pBlob->from );
		}

		if( rpal_memory_isValid( pBlob->pData ) )
		{
            // Relocate existing data
            rpal_memory_memmove( pBlob->pData + offset + size, 
                                 pBlob->pData + offset, 
                                 pBlob->sizeUsed - offset );

			rpal_memory_memcpy( pBlob->pData + offset, pData, size );

			pBlob->sizeUsed += size;
            
            // We allocate WCHAR more than we need always to ensure that if the buffer contains a wide string it will be terminated
            rpal_memory_zero( pBlob->pData + pBlob->sizeUsed, sizeof( RWCHAR ) );

			isAdded = TRUE;
		}
	}
    else if( NULL == pData ||
		     0 == size )
    {
        isAdded = TRUE;
    }

    if( isAdded )
    {
        if( !rpal_memory_isValid( pBlob->pData ) )
        {
            isAdded = FALSE;
            rpal_debug_break();
        }
    }

	return isAdded;
}
static RVOID
    kernelModeDiff
    (
        rEvent isTimeToStop
    )
{
    RU32 i = 0;
    RU32 nScratch = 0;
    RU32 nProcessEntries = 0;
    KernelAcqProcess new_from_kernel[ 200 ] = { 0 };
    processEntry tracking_user[ MAX_SNAPSHOT_SIZE ] = { 0 };
    
    while( !rEvent_wait( isTimeToStop, 1000 ) )
    {
        nScratch = ARRAY_N_ELEM( new_from_kernel );
        rpal_memory_zero( new_from_kernel, sizeof( new_from_kernel ) );
        if( !kAcq_getNewProcesses( new_from_kernel, &nScratch ) )
        {
            rpal_debug_warning( "kernel acquisition for new processes failed" );
            g_is_kernel_failure = TRUE;
            break;
        }

        for( i = 0; i < nScratch; i++ )
        {
            notifyOfProcess( new_from_kernel[ i ].pid,
                             new_from_kernel[ i ].ppid,
                             TRUE,
                             new_from_kernel[ i ].path,
                             new_from_kernel[ i ].cmdline,
                             new_from_kernel[ i ].uid,
                             new_from_kernel[ i ].ts );

            if( nProcessEntries >= ARRAY_N_ELEM( tracking_user ) - 1 )
            {
                continue;
            }

            tracking_user[ nProcessEntries ].pid = new_from_kernel[ i ].pid;
            tracking_user[ nProcessEntries ].ppid = new_from_kernel[ i ].ppid;
            nProcessEntries++;
        }

        for( i = 0; i < nProcessEntries; i++ )
        {
            if( !processLib_isPidInUse( tracking_user[ i ].pid ) )
            {
                notifyOfProcess( tracking_user[ i ].pid, 
                                 tracking_user[ i ].ppid, 
                                 FALSE, 
                                 NULL, 
                                 NULL,
                                 KERNEL_ACQ_NO_USER_ID,
                                 0 );
                if( nProcessEntries != i + 1 )
                {
                    rpal_memory_memmove( &(tracking_user[ i ]), &(tracking_user[ i + 1 ]), nProcessEntries - i + 1 );
                }
                nProcessEntries--;
            }
        }
    }
}
Beispiel #3
0
PObsNode
    addTransition
    (
        PObsNode parent,
        PObsNode node,
        PObsNode to,
        RU8 onValue
    )
{
    PObsNode retNode = NULL;
    RU32 currentNodeSize = 0;
    RU8 numElemToAdd = 0;
    RU8 indexToInsert = 0;
    PObsNode originalNode = node;
    RU32 i = 0;

    if( rpal_memory_isValid( node ) )
    {
        currentNodeSize = sizeof( ObsNode ) + ( node->nElements * sizeof( RPVOID ) );

        if( !IS_IN_RANGE( node, onValue ) )
        {
            if( onValue >= node->startOffset + node->nElements )
            {
                numElemToAdd = onValue - ( node->startOffset + node->nElements ) + 1;
            }
            else
            {
                numElemToAdd = node->startOffset - onValue;
            }

            if( node->nAllocated < node->nElements + numElemToAdd )
            {
                node = rpal_memory_realloc( node, currentNodeSize + ( numElemToAdd * sizeof( RPVOID ) ) );
                rpal_memory_zero( node->elements + node->nElements, numElemToAdd * sizeof( RPVOID ) );
                node->nAllocated = node->nElements + numElemToAdd;
            }

            if( onValue < node->startOffset &&
                0 < node->nElements )
            {
                rpal_memory_memmove( node->elements + numElemToAdd, node->elements, node->nElements * sizeof( RPVOID ) );
                node->startOffset = node->startOffset - (RU8)numElemToAdd;
            }

            node->nElements += numElemToAdd;

            // The above realloc may have changed the pointer so we need
            // to update it in the parent, if it exists...
            if( NULL != parent &&
                originalNode != node )
            {
                for( i = 0; i < parent->nElements; i++ )
                {
                    if( originalNode == parent->elements[ i ] )
                    {
                        parent->elements[ i ] = node;
                    }
                }
            }
        }

        indexToInsert = EFFECTIVE_INDEX( node, onValue );

        if( NULL == node->elements[ indexToInsert ] )
        {
            node->elements[ indexToInsert ] = to;

            retNode = node;
        }
    }

    return retNode;
}