Exemplo n.º 1
0
void ModuleManager::syncModuleWithSystemState( IModule* module )
{
	try
	{
		switch( getSystem()->getState() )
		{
			case SystemState_Initializing:
				// module is already initialized
				break;
			case SystemState_Integrating:
			case SystemState_Integrated:
				updateModule( module, ModuleState_Integrated );
				break;
			case SystemState_IntegratingPresentation:
			case SystemState_Running:
				updateModule( module, ModuleState_PresentationIntegrated );
				break;
			default:
				assert( false );
		}
	}
	catch( std::exception& e )
	{
		module->abort();
		CORAL_THROW( ModuleLoadException, "exception raised by module '"
						<< module->getNamespace()->getFullName()
						<< "' during update: " << e.what() );
	}
}
Exemplo n.º 2
0
void ModuleManager::updateModules( ModuleState state )
{
	size_t numModules = _modules.size();

	std::vector<IModule*> sortedModules;
	sortedModules.reserve( numModules );

	for( size_t i = 0; i < numModules; ++i )
		sortedModules.push_back( _modules[i].get() );

	std::sort( sortedModules.begin(), sortedModules.end(), sortByIncreasingRank );

	for( size_t i = 0; i < numModules; ++i )
	{
		IModule* module = sortedModules[i];
		try
		{
			updateModule( module, state );
		}
		catch( std::exception& e )
		{
			module->abort();

			CORAL_LOG(WARNING) << "Module '" << module->getNamespace()->getFullName() <<
				"' aborted due to exception: " << e.what();
		}
	}
}
void Destroyable::internalUpdate(quantity<si::time, f32> timeSinceLastFrame)
{
	ModuleMapT::iterator it = mModules.begin();
	for (; it != mModules.end(); ++it)
		updateModule(it->first, timeSinceLastFrame);
}
Exemplo n.º 4
0
void updateProcessModuleList(CPUState* env, gpid_t pid)
{
  DECAF_Processes_Callback_Params params;
  target_ulong task = 0;
  target_ulong i = 0;
  char name[MAX_PROCESS_INFO_NAME_LEN];

  if (pid == 0)
  {
    return;
  }

  task = DECAF_get_current_process(env);
  i = task;
  do
  {
    if (pid == DECAF_get_pid(env, i))
    {
      break;
    }
    i = DECAF_get_next_task_struct(env, i);
  } while ( (i != 0) && (i != task) );

  if ((i == 0) || (i == task))
  {
    return;
  }

  target_ulong mmap_first = DECAF_get_first_mmap(env, i);
  target_ulong mmap_i = mmap_first;
  target_ulong vmfile = 0;
  target_ulong flags = 0;
  target_ulong vmstart = 0;
  target_ulong vmend = 0;
  target_ulong startbrk = 0;
  target_ulong brk = 0;
  target_ulong startstack = 0;
  target_ulong mm = 0;

  do
  {
    vmstart = DECAF_get_vm_start(env, mmap_i);
    vmend = DECAF_get_vm_end(env, mmap_i);
    flags = DECAF_get_vm_flags(env, mmap_i);
    mm = DECAF_get_mm(env, i);
    startbrk = DECAF_get_start_brk(env, mm);
    brk = DECAF_get_brk(env, mm);
    startstack = DECAF_get_start_stack(env, mm);

    //from mm.h
    //#define VM_READ         0x00000001      /* currently active flags */
    //#define VM_WRITE        0x00000002
    //#define VM_EXEC         0x00000004
    //#define VM_SHARED       0x00000008

    vmfile = DECAF_get_vm_file(env, mmap_i);
    if (vmfile != 0)
    {
      //get_mod_dname(mmap_i, name, 128);
      DECAF_get_mod_full_dname(env, mmap_i, name, 128);
    }
    else
    {
      name[0] = '\0';
      //get_mod_iname(mmap_i, name, 128);
      DECAF_get_mod_full_iname(env, mmap_i, name, 128);
      if (strlen(name) <= 0)
      {
        if (vmstart <= startbrk && vmend >= brk)
        {
          sprintf(name, "[heap]");
        }
        else if (vmstart <= startstack && vmend >= startstack)
        {
          sprintf(name, "[stack]");
        }
      }
    }

    int ret = updateModule(pid, vmstart, vmend, flags, name);
    if (ret == 0xF) //if this is a new module
    {
      params.lm.pid = pid;
      params.lm.pgd = getCurrentPGD();
      params.lm.name = name; //TODO: THIS IS NOT THREAD SAFE!!!
      params.lm.full_name = name;
      params.lm.base = vmstart;
      params.lm.size = vmend-vmstart;
      SimpleCallback_dispatch(&DroidScope_callbacks[DECAF_PROCESSES_LOAD_MODULE_CB], &params);
    }
    else if (ret > 0)
    {
      params.mu.pid = pid;
      params.mu.startAddr = vmstart;
      params.mu.mask = ret;
      SimpleCallback_dispatch(&DroidScope_callbacks[DECAF_PROCESSES_MODULES_UPDATED_CB], &params);
    }
    mmap_i = DECAF_get_next_mmap(env, mmap_i);
  } while ((mmap_i != 0) && (mmap_i != mmap_first));

}
Exemplo n.º 5
0
bool processPackage( QDomDocument* list, QString path )
{
	QString map = findMapInDir( path );

	if( map.isEmpty() )
	{
		printf( "no map file in dir (required for parsing)\n" );
		printf( "package path: " + path.toUtf8() + "\n" );
		return false;
	}

	QDomElement mapElement = findPackageElement( *list, "map", map );

	if( path.endsWith( "MoNav.ini" ) )
	{
		if( !mapElement.isNull() )
		{
			QString pHash = computePackageHash( path );
			if( mapElement.attribute( "hash" ) != pHash )
			{
				updateMap( list, &mapElement );
				mapElement.setAttribute( "hash", pHash );
			}
			else
				printf( "map already in list\n" );
			return false;
		}

		addMap( list, map, path );
	}

	else if( path.endsWith( ".mmm" ) )
	{
		if( mapElement.isNull() )
			addMap( list, map, path );

		QString package = path.right( path.size() - path.lastIndexOf( '/' ) - 1 );
		QStringList packageAttributes = package.split( "_" );
		QString type = packageAttributes[0];
		QString name = packageAttributes[1].replace( ".mmm", "" );

		QDomElement packageElement = findPackageElement( *list, "module", name, map );
		if( !packageElement.isNull() )
		{
			QString pHash = computePackageHash( path );
			if( packageElement.attribute( "hash" ) != pHash )
			{
				updateModule( list, &packageElement );
				packageElement.setAttribute( "hash", pHash );
			}
			else
				printf( "package already in list\n" );
			return false;
		}

		addModule( list, &mapElement, name, type, path );
	}

	else
	{
		printf( "unrecognized package format\n" );
		return false;
	}

	return true;
}